 9bdcbe0447
			
		
	
	9bdcbe0447
	
	
	
		
			
			Major integrations and fixes: - Added BACKBEAT SDK integration for P2P operation timing - Implemented beat-aware status tracking for distributed operations - Added Docker secrets support for secure license management - Resolved KACHING license validation via HTTPS/TLS - Updated docker-compose configuration for clean stack deployment - Disabled rollback policies to prevent deployment failures - Added license credential storage (CHORUS-DEV-MULTI-001) Technical improvements: - BACKBEAT P2P operation tracking with phase management - Enhanced configuration system with file-based secrets - Improved error handling for license validation - Clean separation of KACHING and CHORUS deployment stacks 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			134 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2023 Google Inc. All rights reserved.
 | |
| //
 | |
| // Licensed under the Apache License, Version 2.0 (the "License");
 | |
| // you may not use this file except in compliance with the License.
 | |
| // You may obtain a copy of the License at
 | |
| //
 | |
| //     http://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing, software
 | |
| // distributed under the License is distributed on an "AS IS" BASIS,
 | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| // See the License for the specific language governing permissions and
 | |
| // limitations under the License.
 | |
| 
 | |
| package s2
 | |
| 
 | |
| // ShapeIndexRegion wraps a ShapeIndex and implements the Region interface.
 | |
| // This allows RegionCoverer to work with ShapeIndexes as well as being
 | |
| // able to be used by some of the Query types.
 | |
| type ShapeIndexRegion struct {
 | |
| 	index         *ShapeIndex
 | |
| 	containsQuery *ContainsPointQuery
 | |
| 	iter          *ShapeIndexIterator
 | |
| }
 | |
| 
 | |
| // TODO(roberts): Uncomment once implementation is complete.
 | |
| // Enforce Region interface satisfaction similar to other types that implement Region.
 | |
| // var _ Region = (*ShapeIndexRegion)(nil)
 | |
| 
 | |
| // CapBound returns a bounding spherical cap for this collection of geometry.
 | |
| // This is not guaranteed to be exact.
 | |
| func (s *ShapeIndexRegion) CapBound() Cap {
 | |
| 	cu := CellUnion(s.CellUnionBound())
 | |
| 	return cu.CapBound()
 | |
| }
 | |
| 
 | |
| // RectBound returns a bounding rectangle for this collection of geometry.
 | |
| // The bounds are not guaranteed to be tight.
 | |
| func (s *ShapeIndexRegion) RectBound() Rect {
 | |
| 	cu := CellUnion(s.CellUnionBound())
 | |
| 	return cu.RectBound()
 | |
| }
 | |
| 
 | |
| // CellUnionBound returns the bounding CellUnion for this collection of geometry.
 | |
| // This method currently returns at most 4 cells, unless the index spans
 | |
| // multiple faces in which case it may return up to 6 cells.
 | |
| func (s *ShapeIndexRegion) CellUnionBound() []CellID {
 | |
| 	// We find the range of Cells spanned by the index and choose a level such
 | |
| 	// that the entire index can be covered with just a few cells.  There are
 | |
| 	// two cases:
 | |
| 	//
 | |
| 	//  - If the index intersects two or more faces, then for each intersected
 | |
| 	//    face we add one cell to the covering.  Rather than adding the entire
 | |
| 	//    face, instead we add the smallest Cell that covers the ShapeIndex
 | |
| 	//    cells within that face.
 | |
| 	//
 | |
| 	//  - If the index intersects only one face, then we first find the smallest
 | |
| 	//    cell S that contains the index cells (just like the case above).
 | |
| 	//    However rather than using the cell S itself, instead we repeat this
 | |
| 	//    process for each of its child cells.  In other words, for each
 | |
| 	//    child cell C we add the smallest Cell C' that covers the index cells
 | |
| 	//    within C.  This extra step is relatively cheap and produces much
 | |
| 	//    tighter coverings when the ShapeIndex consists of a small region
 | |
| 	//    near the center of a large Cell.
 | |
| 	var cellIDs []CellID
 | |
| 
 | |
| 	// Find the last CellID in the index.
 | |
| 	s.iter.End()
 | |
| 	if !s.iter.Prev() {
 | |
| 		return cellIDs // Empty index.
 | |
| 	}
 | |
| 	lastIndexID := s.iter.CellID()
 | |
| 	s.iter.Begin()
 | |
| 	if s.iter.CellID() != lastIndexID {
 | |
| 		// The index has at least two cells. Choose a CellID level such that
 | |
| 		// the entire index can be spanned with at most 6 cells (if the index
 | |
| 		// spans multiple faces) or 4 cells (it the index spans a single face).
 | |
| 		level, ok := s.iter.CellID().CommonAncestorLevel(lastIndexID)
 | |
| 		if !ok {
 | |
| 			// C++ returns -1 for no common level, ours returns 0. Set
 | |
| 			// to -1 so the next ++ puts us at the same place as C++ does.
 | |
| 			level = -1
 | |
| 		}
 | |
| 		level++
 | |
| 
 | |
| 		// For each cell C at the chosen level, we compute the smallest Cell
 | |
| 		// that covers the ShapeIndex cells within C.
 | |
| 		lastID := lastIndexID.Parent(level)
 | |
| 		for id := s.iter.CellID().Parent(level); id != lastID; id = id.Next() {
 | |
| 			// If the cell C does not contain any index cells, then skip it.
 | |
| 			if id.RangeMax() < s.iter.CellID() {
 | |
| 				continue
 | |
| 			}
 | |
| 
 | |
| 			// Find the range of index cells contained by C and then shrink C so
 | |
| 			// that it just covers those cells.
 | |
| 			first := s.iter.CellID()
 | |
| 			s.iter.seek(id.RangeMax().Next())
 | |
| 			s.iter.Prev()
 | |
| 			cellIDs = s.coverRange(first, s.iter.CellID(), cellIDs)
 | |
| 			s.iter.Next()
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return s.coverRange(s.iter.CellID(), lastIndexID, cellIDs)
 | |
| }
 | |
| 
 | |
| // coverRange computes the smallest CellID that covers the Cell range (first, last)
 | |
| // and returns the updated slice.
 | |
| //
 | |
| // This requires first and last have a common ancestor.
 | |
| func (s *ShapeIndexRegion) coverRange(first, last CellID, cellIDs []CellID) []CellID {
 | |
| 	// The range consists of a single index cell.
 | |
| 	if first == last {
 | |
| 		return append(cellIDs, first)
 | |
| 	}
 | |
| 
 | |
| 	// Add the lowest common ancestor of the given range.
 | |
| 	level, ok := first.CommonAncestorLevel(last)
 | |
| 	if !ok {
 | |
| 		return append(cellIDs, CellID(0))
 | |
| 	}
 | |
| 	return append(cellIDs, first.Parent(level))
 | |
| }
 | |
| 
 | |
| // TODO(roberts): remaining methods
 | |
| /*
 | |
| // ContainsCell(target Cell) bool {
 | |
| // IntersectsCell(target Cell) bool {
 | |
| // ContainsPoint(p Point) bool {
 | |
| // contains(id CellID, clipped clippedShape, p Point) bool {
 | |
| // anyEdgeIntersects(clipped clippedShape, target Cell) bool {
 | |
| */
 |