private AbstractLogicalOperator findSequenceAggregateOperator(AbstractLogicalOperator opSearch, int variableId) {
while (true) {
if (opSearch.getOperatorTag() == LogicalOperatorTag.AGGREGATE) {
// Check for variable assignment and sequence.
AggregateOperator aggregate = (AggregateOperator) opSearch;
// Check to see if the expression is a function and sort-distinct-nodes-asc-or-atomics.
ILogicalExpression logicalExpressionSearch = (ILogicalExpression) aggregate.getExpressions().get(0)
.getValue();
if (logicalExpressionSearch.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
opSearch = (AbstractLogicalOperator) opSearch.getInputs().get(0).getValue();
continue;
}
AbstractFunctionCallExpression functionCallSearch = (AbstractFunctionCallExpression) logicalExpressionSearch;
if (!functionCallSearch.getFunctionIdentifier().equals(
BuiltinOperators.SEQUENCE.getFunctionIdentifier())) {
opSearch = (AbstractLogicalOperator) opSearch.getInputs().get(0).getValue();
continue;
}
// Only find operator for the following variable ID.
if (variableId != aggregate.getVariables().get(0).getId()) {
opSearch = (AbstractLogicalOperator) opSearch.getInputs().get(0).getValue();
continue;
}
// Found the aggregate operator!!!