// PhysSequence::preCodeGen() ------------------------------------------- // Perform local query rewrites such as for the creation and // population of intermediate tables, for accessing partitioned // data. Rewrite the value expressions after minimizing the dataflow // using the transitive closure of equality predicates. // // PhysSequence::preCodeGen() - is basically the same as the RelExpr:: // preCodeGen() except that here we replace the VEG references in the // sortKey() list, as well as the selectionPred(). // // Parameters: // // Generator *generator // IN/OUT : A pointer to the generator object which contains the state, // and tools (e.g. expression generator) to generate code for // this node. // // ValueIdSet &externalInputs // IN : The set of external Inputs available to this node. // // RelExpr * PhysSequence::preCodeGen(Generator * generator, const ValueIdSet & externalInputs, ValueIdSet &pulledNewInputs) { if (nodeIsPreCodeGenned()) return this; // Resolve the VEGReferences and VEGPredicates, if any, that appear // in the Characteristic Inputs, in terms of the externalInputs. // getGroupAttr()->resolveCharacteristicInputs(externalInputs); // My Characteristic Inputs become the external inputs for my children. // ValueIdSet childPulledInputs; child(0) = child(0)->preCodeGen(generator, externalInputs, pulledNewInputs); if (! child(0).getPtr()) return NULL; // process additional input value ids the child wants getGroupAttr()->addCharacteristicInputs(childPulledInputs); pulledNewInputs += childPulledInputs; // The VEG expressions in the selection predicates and the characteristic // outputs can reference any expression that is either a potential output // or a characteristic input for this RelExpr. Supply these values for // rewriting the VEG expressions. // ValueIdSet availableValues; getInputValuesFromParentAndChildren(availableValues); // The sequenceFunctions() have access to only the Input // Values. These can come from the parent or be the outputs of the // child. // sequenceFunctions(). replaceVEGExpressions(availableValues, getGroupAttr()->getCharacteristicInputs()); sequencedColumns(). replaceVEGExpressions(availableValues, getGroupAttr()->getCharacteristicInputs()); requiredOrder(). replaceVEGExpressions(availableValues, getGroupAttr()->getCharacteristicInputs()); cancelExpr(). replaceVEGExpressions(availableValues, getGroupAttr()->getCharacteristicInputs()); partition(). replaceVEGExpressions(availableValues, getGroupAttr()->getCharacteristicInputs()); //checkPartitionChangeExpr(). // replaceVEGExpressions(availableValues, // getGroupAttr()->getCharacteristicInputs()); // The selectionPred has access to only the output values generated by // Sequence and input values from the parent. // getInputAndPotentialOutputValues(availableValues); // Rewrite the selection predicates. // NABoolean replicatePredicates = TRUE; selectionPred().replaceVEGExpressions (availableValues, getGroupAttr()->getCharacteristicInputs(), FALSE, // no key predicates here 0 /* no need for idempotence here */, replicatePredicates ); // Replace VEG references in the outputs and remove redundant // outputs. // getGroupAttr()->resolveCharacteristicOutputs (availableValues, getGroupAttr()->getCharacteristicInputs()); addCancelExpr(generator->wHeap()); ///addCheckPartitionChangeExpr(generator->wHeap()); transformOlapFunctions(generator->wHeap()); if ( getUnboundedFollowing() ) { // Count this Seq as a BMO and add its needed memory to the total needed generator->incrNumBMOs(); if ((ActiveSchemaDB()->getDefaults()). getAsDouble(EXE_MEMORY_LIMIT_PER_CPU) > 0) generator->incrBMOsMemory(getEstimatedRunTimeMemoryUsage(TRUE)); } else generator->incrNBMOsMemoryPerCPU(getEstimatedRunTimeMemoryUsage(TRUE)); markAsPreCodeGenned(); return this; } // PhysSequence::preCodeGen
// PhysSample::preCodeGen() ------------------------------------------- // Perform local query rewrites such as for the creation and // population of intermediate tables, for accessing partitioned // data. Rewrite the value expressions after minimizing the dataflow // using the transitive closure of equality predicates. // // PhysSample::preCodeGen() - is basically the same as the RelExpr:: // preCodeGen() except that here we replace the VEG references in the // sortKey() list, as well as the selectionPred(). // // Parameters: // // Generator *generator // IN/OUT : A pointer to the generator object which contains the state, // and tools (e.g. expression generator) to generate code for // this node. // // ValueIdSet &externalInputs // IN : The set of external Inputs available to this node. // // RelExpr * PhysSample::preCodeGen(Generator * generator, const ValueIdSet & externalInputs, ValueIdSet &pulledNewInputs) { // Do nothing if this node has already been processed. // if (nodeIsPreCodeGenned()) return this; // Resolve the VEGReferences and VEGPredicates, if any, that appear // in the Characteristic Inputs, in terms of the externalInputs. // getGroupAttr()->resolveCharacteristicInputs(externalInputs); // My Characteristics Inputs become the external inputs for my children. // preCodeGen my only child. // ValueIdSet childPulledInputs; child(0) = child(0)->preCodeGen(generator, externalInputs, pulledNewInputs); if(!child(0).getPtr()) return NULL; // Process additional any additional inputs the child wants. // getGroupAttr()->addCharacteristicInputs(childPulledInputs); pulledNewInputs += childPulledInputs; // The sampledCols() only have access to the Input Values. // These can come from the parent or be the outputs of the child. // Compute the set of available values for the sampledCols() and use // these to resolve any VEG references that the sampledCols() may need. // ValueIdSet availableValues; getInputValuesFromParentAndChildren(availableValues); sampledColumns().replaceVEGExpressions (availableValues, getGroupAttr()->getCharacteristicInputs()); // Ditto, for the balance expression. // balanceExpr().replaceVEGExpressions (availableValues, getGroupAttr()->getCharacteristicInputs()); requiredOrder(). replaceVEGExpressions(availableValues, getGroupAttr()->getCharacteristicInputs()); // The selectionPred has access to only the output values generated by // Sequence and input values from the parent. Compute the set of available // values for the selectionPred and resolve any VEG references // that the selection predicates may need. // getInputAndPotentialOutputValues(availableValues); NABoolean replicatePredicates = TRUE; selectionPred().replaceVEGExpressions (availableValues, getGroupAttr()->getCharacteristicInputs(), FALSE, // no key predicates here 0 /* no need for idempotence here */, replicatePredicates ); // Resolve VEG references in the outputs and remove redundant // outputs. // getGroupAttr()->resolveCharacteristicOutputs (availableValues, getGroupAttr()->getCharacteristicInputs()); // Mark this node as done and return. // markAsPreCodeGenned(); return this; } // PhysSample::preCodeGen