GenericConcreteEngine¶
-
class
lsst.daf.relation.GenericConcreteEngine(*, name: str, functions: dict = <factory>, relation_name_counter: int = 0)¶ Bases:
lsst.daf.relation.Engine,typing.GenericAn implementation-focused base class for
EngineobjectsThis class provides common functionality for the provided
iterationandsqlengines. It may be used in external engine implementations as well.Attributes Summary
relation_name_counterAn integer counter used to generate relation names ( int).Methods Summary
append_binary(operation, lhs, rhs)Hook for maintaining the engine’s conforminvariants throughBinaryOperation.apply.append_unary(operation, target)Hook for maintaining the engine’s conforminvariants throughUnaryOperation.apply.backtrack_unary(operation, tree, preferred)Attempt to insert a unary operation in another engine upstream of this one by via operation commutators. conform(relation)Ensure a relation tree satisfies this engine’s invariants. get_doomed_payload(columns)Return a payloadfor a leaf relation that has no rows.get_function(name)Return the named column expression function. get_join_identity_payload()Return a payloadfor a leaf relation that is thejoin identity.get_relation_name(prefix)Return a name suitable for a new relation in this engine. make_doomed_relation(columns, messages, name)Construct a leaf relation with no rows and one or more messages explaining why. make_join_identity_relation(name)Construct a leaf relation with no columns and exactly one row. materialize(target, name, name_prefix)Mark that a target relation’s payload should be cached. transfer(target, payload)Mark that a relation’s payload should be transferred from some other engine to this one. Attributes Documentation
Methods Documentation
-
append_binary(operation: BinaryOperation, lhs: Relation, rhs: Relation) → Relation¶ Hook for maintaining the engine’s
conforminvariants throughBinaryOperation.apply.This method should only be called by
BinaryOperation.applyand the engine’s own methods and helper classes. External code should callBinaryOperation.applyor aRelationfactory method instead.Parameters: - operation :
BinaryOperation Operation to apply; should already be filtered through
BinaryOperation._begin_apply.- lhs :
Relation One relation to apply the operation to directly.
- rhs :
Relation The other relation to apply the operation to directly.
Returns: - relation :
Relation Relation that includes the given operation acting on
lhsandrhs, or a simplified equivalent.
Notes
Implementations should delegate back to
UnaryOperation._finish_applyto actually create aUnaryOperationRelationand perform final simplification and checks. This is all the default implementation does.- operation :
-
append_unary(operation: UnaryOperation, target: Relation) → Relation¶ Hook for maintaining the engine’s
conforminvariants throughUnaryOperation.apply.This method should only be called by
UnaryOperation.applyand the engine’s own methods and helper classes. External code should callUnaryOperation.applyor aRelationfactory method instead.Parameters: - operation :
UnaryOperation Operation to apply; should already be filtered through
UnaryOperation._begin_apply.- target :
Relation Relation to apply the operation to directly.
Returns: - relation :
Relation Relation that includes the given operation acting on
target, or a simplified equivalent.
Notes
Implementations should delegate back to
UnaryOperation._finish_applyto actually create aUnaryOperationRelationand perform final simplification and checks. This is all the default implementation does.- operation :
-
backtrack_unary(operation: UnaryOperation, tree: Relation, preferred: Engine) → tuple[Relation, bool, tuple[str, ...]]¶ Attempt to insert a unary operation in another engine upstream of this one by via operation commutators.
Parameters: - operation :
UnaryOperation Unary operation to apply.
- tree :
Relation Relation tree the operation logically acts on; any upstream insertion of the given operation should be equivalent to applying it to the root of this tree. Caller guarantees that
tree.engine == self.- preferred :
Engine Engine in which the operation or its commuted equivalent should be performed.
Returns: - new_tree :
Relation Possibly-updated relation tree.
- done :
bool If
True, the operation has been fully inserted upstream in the preferred engine. IfFalse, eithertreewas returned unmodified or only a part of the operation (e.g. a projection whose columns are superset of the given projection’s) was inserted upstream.- messages :
Sequence[str] Messages explaining why backtracking insertion was unsuccessful or incomplete. Should be sentences with no trailing
.and no capitalization; they will be joined with semicolons.
- operation :
-
conform(relation: Relation) → Relation¶ Ensure a relation tree satisfies this engine’s invariants.
This can include reordering operations (in a way consistent with their commutators) and/or inserting
MarkerRelationnodes.Parameters: - relation :
Relation Original relation tree.
Returns: - conformed :
Relation Relation tree that satisfies this engine’s invariants.
Notes
The default implementation returns the given relation. Engines with a non-trivial
conformimplementation should always call it on any relations they are passed, as algorithms that process the relation tree are not guaranteed to maintain those invariants themselves. It is recommended to use a customMarkerRelationto indicate trees that satisfy invariants, allowing the correspondingconformimplementation to short-circuit quickly.- relation :
-
get_doomed_payload(columns: collections.abc.Set[lsst.daf.relation._columns._tag.ColumnTag]) → Any¶ Return a
payloadfor a leaf relation that has no rows.Parameters: Returns: - payload
The engine-specific content for this relation.
-
get_function(name: str) → Optional[_F, None]¶ Return the named column expression function.
Parameters: - name :
str Name of the function, from
ColumnFunction.nameorPredicateFunction.name
Returns: - function
Engine-specific callable, or
Noneif no match was found.
Notes
This implementation first looks for a symbol with this name in the built-in
operatormodule, to handle the common case (shared by both theiterationandsqlengines) where these functions are appropriate for the engine due to operator overloading. When this fails, the name is looked up in thefunctionsattribute.- name :
-
get_join_identity_payload() → Any¶ Return a
payloadfor a leaf relation that is thejoin identity.Returns: - payload
The engine-specific content for this relation.
-
get_relation_name(prefix: str = 'leaf') → str¶ Return a name suitable for a new relation in this engine.
Parameters: - prefix :
str, optional Prefix to include in the returned name.
Returns: - name :
str Name for the relation; guaranteed to be unique over all of the relations in this engine.
Notes
This implementation combines the given prefix with both the current
relation_name_countervalue and a random hexadecimal suffix.- prefix :
-
make_doomed_relation(columns: Set[ColumnTag], messages: Sequence[str], name: str = '0') → Relation¶ Construct a leaf relation with no rows and one or more messages explaining why.
Parameters: Returns: - relation :
Relation Doomed relation.
Notes
This is simplify a convenience method that delegates to
LeafRelation.make_doomed. Derived engines with a nontrivialconformshould override this method to conform the return value.- relation :
-
make_join_identity_relation(name: str = 'I') → Relation¶ Construct a leaf relation with no columns and exactly one row.
Parameters: Returns: - relation :
Relation Relation with no columns and one row.
- relation :
-
materialize(target: Relation, name: str | None = None, name_prefix: str = 'materialization_') → Relation¶ Mark that a target relation’s payload should be cached.
Parameters: - target :
Relation Relation to mark.
- name :
str, optional Name to use for the cached payload within the engine.
- name_prefix :
str, optional Prefix to pass to
get_relation_name; ignored ifnameis provided.
Returns: - relation :
Relation New relation that marks its upstream tree for caching, unless the materialization was simplified away.
See also
Notes
The base class implementation calls
Materialization.simplifyto avoid materializations of leaf relations or other materializations. Override implementations should generally do the same.- target :
-
transfer(target: Relation, payload: Any | None = None) → Relation¶ Mark that a relation’s payload should be transferred from some other engine to this one.
Parameters: - target : Relation
Relation to transfer. If
target.engine == self, this relation will be returned directly and no transfer will be performed. Back-to-back transfers from one engine to another and back again are also simplified away (via a call toTransfer.simplify). Sequences of transfers involving more than two engines are not simplified.- payload, optional
Destination-engine-specific content for the relation to attach to the transfer. Most
Transferrelations do not have a payload; their ability to do so is mostly to support the special relation trees returned by theProcessorclass.
Returns: - relation :
Relation New relation that marks its upstream tree to be transferred to a new engine.
See also
Notes
The default implementation calls
conformon the target relation using the target relation’s engine (i.e. notself). All override implementations should do this as well.
-