Skip to content

Commit

Permalink
Use cached_getter in DimensionUniverse.primaryKeyTraversalOrder.
Browse files Browse the repository at this point in the history
  • Loading branch information
TallJimbo committed Nov 24, 2020
1 parent 9ca7d69 commit f3fd1c9
Showing 1 changed file with 24 additions and 27 deletions.
51 changes: 24 additions & 27 deletions python/lsst/daf/butler/core/dimensions/_graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
)

from ..named import NamedValueAbstractSet, NamedValueSet
from ..utils import immutable
from ..utils import cached_getter, immutable
from .._topology import TopologicalSpace, TopologicalFamily


Expand Down Expand Up @@ -315,7 +315,8 @@ def __and__(self, other: DimensionGraph) -> DimensionGraph:
"""
return self.intersection(other)

@property
@property # type: ignore
@cached_getter
def primaryKeyTraversalOrder(self) -> Tuple[DimensionElement, ...]:
"""Return a tuple of all elements in an order allows records to be
found given their primary keys, starting from only the primary keys of
Expand All @@ -325,31 +326,27 @@ def primaryKeyTraversalOrder(self) -> Tuple[DimensionElement, ...]:
DimensionUniverse.sorted gives you), when dimension A implies
dimension B, dimension A appears first.
"""
order = getattr(self, "_primaryKeyTraversalOrder", None)
if order is None:
done: Set[str] = set()
order = []

def addToOrder(element: DimensionElement) -> None:
if element.name in done:
return
predecessors = set(element.required.names)
predecessors.discard(element.name)
if not done.issuperset(predecessors):
return
order.append(element)
done.add(element.name)
for other in element.implied:
addToOrder(other)

while not done.issuperset(self.required):
for dimension in self.required:
addToOrder(dimension)

order.extend(element for element in self.elements if element.name not in done)
order = tuple(order)
self._primaryKeyTraversalOrder = order
return order
done: Set[str] = set()
order = []

def addToOrder(element: DimensionElement) -> None:
if element.name in done:
return
predecessors = set(element.required.names)
predecessors.discard(element.name)
if not done.issuperset(predecessors):
return
order.append(element)
done.add(element.name)
for other in element.implied:
addToOrder(other)

while not done.issuperset(self.required):
for dimension in self.required:
addToOrder(dimension)

order.extend(element for element in self.elements if element.name not in done)
return tuple(order)

@property
def spatial(self) -> NamedValueAbstractSet[TopologicalFamily]:
Expand Down

0 comments on commit f3fd1c9

Please sign in to comment.