Package com.foundationdb.qp.operator

Source Code of com.foundationdb.qp.operator.API

/**
* Copyright (C) 2009-2013 FoundationDB, LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

package com.foundationdb.qp.operator;

import com.foundationdb.ais.model.Group;
import com.foundationdb.ais.model.Table;
import com.foundationdb.qp.exec.UpdatePlannable;
import com.foundationdb.qp.expression.IndexKeyRange;
import com.foundationdb.qp.row.BindableRow;
import com.foundationdb.qp.rowtype.IndexRowType;
import com.foundationdb.qp.rowtype.RowType;
import com.foundationdb.qp.rowtype.Schema;
import com.foundationdb.qp.rowtype.TableRowType;
import com.foundationdb.server.collation.AkCollator;
import com.foundationdb.server.types.TAggregator;
import com.foundationdb.server.types.TComparison;
import com.foundationdb.server.types.TInstance;
import com.foundationdb.server.types.texpressions.TPreparedExpression;
import com.foundationdb.server.types.texpressions.TPreparedField;

import java.util.*;

public class API
{
    // Aggregate

    public static Operator aggregate_Partial(Operator inputOperator,
                                             RowType rowType,
                                             int inputsIndex,
                                             List<? extends TAggregator> aggregatorFactories,
                                             List<? extends TInstance> aggregatorTypes,
                                             List<Object> options
                                             )
    {
        return new Aggregate_Partial(inputOperator, rowType, inputsIndex, aggregatorFactories, aggregatorTypes, options);
    }

    // Project

    public static Operator project_DefaultTest(Operator inputOperator,
                                           RowType rowType,
                                           List<ExpressionGenerator> projections)
    {
        return new Project_Default(inputOperator, rowType, generateNew(projections));
    }

    public static List<TPreparedExpression> generateNew(List<? extends ExpressionGenerator> expressionGenerators) {
        if (expressionGenerators == null)
            return null;
        List<TPreparedExpression> results = new ArrayList<>(expressionGenerators.size());
        for (ExpressionGenerator generator : expressionGenerators) {
            results.add(generator.getTPreparedExpression());
        }
        return results;
    }

    public static Operator project_Default(Operator inputOperator,
                                                   RowType rowType,
                                                   List<? extends TPreparedExpression> pExpressions)
    {
        return new Project_Default(inputOperator, rowType, pExpressions);
    }
   
    public static Operator project_Default(Operator inputOperator,
                                            List<ExpressionGenerator> expressionGenerators,
                                            RowType rowType)
    {
        return new Project_Default(inputOperator, rowType, generateNew(expressionGenerators));
    }
   
    public static Operator project_Table(Operator inputOperator,
                                                 RowType inputRowType,
                                                 RowType outputRowType,
                                                 List<? extends TPreparedExpression> pExpressions)
    {
        return new Project_Default(inputOperator, inputRowType, outputRowType, pExpressions);
    }
    // Flatten

    public static Operator flatten_HKeyOrdered(Operator inputOperator,
                                                       RowType parentType,
                                                       RowType childType,
                                                       JoinType joinType)
    {
        return flatten_HKeyOrdered(inputOperator, parentType, childType, joinType, EnumSet.noneOf(FlattenOption.class));
    }

    public static Operator flatten_HKeyOrdered(Operator inputOperator,
                                                       RowType parentType,
                                                       RowType childType,
                                                       JoinType joinType,
                                                       FlattenOption flag0)
    {
        return new Flatten_HKeyOrdered(inputOperator, parentType, childType, joinType, EnumSet.of(flag0));
    }

    public static Operator flatten_HKeyOrdered(Operator inputOperator,
                                                       RowType parentType,
                                                       RowType childType,
                                                       JoinType joinType,
                                                       FlattenOption flag0,
                                                       FlattenOption flag1)
    {
        return new Flatten_HKeyOrdered(inputOperator, parentType, childType, joinType, EnumSet.of(flag0, flag1));
    }

    public static Operator flatten_HKeyOrdered(Operator inputOperator,
                                                       RowType parentType,
                                                       RowType childType,
                                                       JoinType joinType,
                                                       EnumSet<FlattenOption> flags)
    {
        return new Flatten_HKeyOrdered(inputOperator, parentType, childType, joinType, flags);
    }

    // GroupScan

    public static Operator groupScan_Default(Group group)
    {
        return new GroupScan_Default(new GroupScan_Default.FullGroupCursorCreator(group));
    }

    public static Operator groupScan_Default(Group group,
                                             int hKeyBindingPosition,
                                             boolean deep,
                                             Table hKeyType,
                                             Table shortenUntil)
    {
        return new GroupScan_Default(
                new GroupScan_Default.PositionalGroupCursorCreator(group, hKeyBindingPosition, deep, hKeyType, shortenUntil));
    }

    // ValuesScan

    public static Operator valuesScan_Default (Collection<? extends BindableRow> rows, RowType rowType)
    {
        return new ValuesScan_Default (rows, rowType);
    }
   
    // BranchLookup

    public static Operator branchLookup_Default(Operator inputOperator,
                                                Group group,
                                                RowType inputRowType,
                                                TableRowType outputRowType,
                                                InputPreservationOption flag)
    {
        return groupLookup_Default(inputOperator, group, inputRowType, branchOutputRowTypes(outputRowType), flag, 1);
    }

    protected static List<TableRowType> branchOutputRowTypes(TableRowType outputRowType) {
        List<TableRowType> outputRowTypes = new ArrayList<>();
        outputRowTypes.add(outputRowType);
        Schema schema = (Schema)outputRowType.schema();
        for (RowType rowType : Schema.descendentTypes(outputRowType, schema.userTableTypes())) {
            outputRowTypes.add((TableRowType)rowType);
        }
        return outputRowTypes;
    }

    /** deprecated */
    public static Operator branchLookup_Nested(Group group,
                                               RowType inputRowType,
                                               TableRowType outputRowType,
                                               InputPreservationOption flag,
                                               int inputBindingPosition)
    {
        return branchLookup_Nested(group,
                                   inputRowType,
                                   inputRowType,
                                   null,
                                   branchOutputRowTypes(outputRowType),
                                   flag,
                                   inputBindingPosition,
                                   1);
    }

    public static Operator branchLookup_Nested(Group group,
                                               RowType inputRowType,
                                               TableRowType ancestorRowType,
                                               TableRowType outputRowType,
                                               InputPreservationOption flag,
                                               int inputBindingPosition)
    {
        return branchLookup_Nested(group,
                                   inputRowType,
                                   inputRowType,
                                   ancestorRowType,
                                   branchOutputRowTypes(outputRowType),
                                   flag,
                                   inputBindingPosition,
                                   1);
    }

    public static Operator branchLookup_Nested(Group group,
                                               RowType inputRowType,
                                               RowType sourceRowType,
                                               TableRowType ancestorRowType,
                                               Collection<TableRowType> outputRowTypes,
                                               InputPreservationOption flag,
                                               int inputBindingPosition,
                                               int lookaheadQuantum)
    {
        return new BranchLookup_Nested(group,
                                       inputRowType,
                                       sourceRowType,
                                       ancestorRowType,
                                       outputRowTypes,
                                       flag,
                                       inputBindingPosition,
                                       lookaheadQuantum);
    }

    // Limit

    public static Operator limit_Default(Operator inputOperator, int limitRows)
    {
        return new Limit_Default(inputOperator, limitRows);
    }

    public static Operator limit_Default(Operator inputOperator,
                                                 int skipRows,
                                                 boolean skipIsBinding,
                                                 int limitRows,
                                                 boolean limitIsBinding)
    {
        return new Limit_Default(inputOperator, skipRows, skipIsBinding, limitRows, limitIsBinding);
    }

    // AncestorLookup

    public static Operator ancestorLookup_Default(Operator inputOperator,
                                                  Group group,
                                                  RowType rowType,
                                                  Collection<TableRowType> ancestorTypes,
                                                  InputPreservationOption flag)
    {
        return groupLookup_Default(inputOperator, group, rowType, ancestorTypes, flag, 1);
    }

    public static Operator groupLookup_Default(Operator inputOperator,
                                               Group group,
                                               RowType rowType,
                                               Collection<TableRowType> ancestorTypes,
                                               InputPreservationOption flag,
                                               int lookaheadQuantum)
    {
        return new GroupLookup_Default(inputOperator, group, rowType, ancestorTypes, flag, lookaheadQuantum);
    }

    public static Operator ancestorLookup_Nested(Group group,
                                                 RowType rowType,
                                                 Collection<TableRowType> ancestorTypes,
                                                 int hKeyBindingPosition,
                                                 int lookaheadQuantum)
    {
        return new AncestorLookup_Nested(group, rowType, ancestorTypes, hKeyBindingPosition, lookaheadQuantum);
    }

    // IndexScan

    /**
     * Creates a full ascending scan operator for the given index using LEFT JOIN semantics after the indexType's
     * tableType
     * @param indexType the index to scan
     * @return the scan operator
     */
    // deprecate for use {@link #indexScan_Default(IndexRowType, IndexKeyRange, Ordering, IndexScanSelector)}
    public static Operator indexScan_Default(IndexRowType indexType)
    {
        return indexScan_Default(indexType, false, IndexKeyRange.unbounded(indexType));
    }

    /**
     * Creates a full ascending scan operator for the given index using LEFT JOIN semantics after the indexType's
     * tableType
     * @param indexType the index to scan
     * @param reverse whether to scan in reverse order
     * @return the scan operator
     */

    // deprecate for use {@link #indexScan_Default(IndexRowType, IndexKeyRange, Ordering, IndexScanSelector)}
    public static Operator indexScan_Default(IndexRowType indexType, boolean reverse)
    {
        return indexScan_Default(indexType, reverse, IndexKeyRange.unbounded(indexType));
    }

    /**
     * Creates a scan operator for the given index, using LEFT JOIN semantics after the indexType's tableType.
     * @param indexType the index to scan
     * @param reverse whether to scan in reverse order
     * @param indexKeyRange the scan range
     * @return the scan operator
     */
    // deprecate for use {@link #indexScan_Default(IndexRowType, IndexKeyRange, Ordering, IndexScanSelector)}
    public static Operator indexScan_Default(IndexRowType indexType, boolean reverse, IndexKeyRange indexKeyRange)
    {
        if (indexKeyRange == null) {
            indexKeyRange = IndexKeyRange.unbounded(indexType);
        }
        return indexScan_Default(indexType, reverse, indexKeyRange, indexType.tableType());
    }

    /**
     * Creates a scan operator for the given index, using LEFT JOIN semantics after the given table type.
     * @param indexType the index to scan
     * @param reverse whether to scan in reverse order
     * @param indexKeyRange the scan range
     * @param innerJoinUntilRowType the table after which the scan should start using LEFT JOIN GI semantics.
     * @return the scan operator
     */
    // deprecate for use {@link #indexScan_Default(IndexRowType, IndexKeyRange, Ordering, IndexScanSelector)}
    public static Operator indexScan_Default(IndexRowType indexType,
                                             boolean reverse,
                                             IndexKeyRange indexKeyRange,
                                             TableRowType innerJoinUntilRowType)
    {
        Ordering ordering = new Ordering();
        int fields = indexType.nFields();
        for (int f = 0; f < fields; f++) {
            ordering.append(new TPreparedField(indexType.typeAt(f), f), !reverse);
        }
        return indexScan_Default(indexType, indexKeyRange, ordering, innerJoinUntilRowType);
    }

    public static Operator indexScan_Default(IndexRowType indexType,
                                             IndexKeyRange indexKeyRange,
                                             Ordering ordering)
    {
        return indexScan_Default(indexType, indexKeyRange, ordering, indexType.tableType());
    }

    /**
     * Creates a scan operator for the given index, using LEFT JOIN semantics after the given table type.
     * @param indexType the index to scan
     * @param reverse whether to scan in reverse order
     * @param indexKeyRange the scan range
     * @param indexScanSelector
     * @return the scan operator
     */
    // deprecate for use {@link #indexScan_Default(IndexRowType, IndexKeyRange, Ordering, IndexScanSelector)}
    public static Operator indexScan_Default(IndexRowType indexType,
                                             boolean reverse,
                                             IndexKeyRange indexKeyRange,
                                             IndexScanSelector indexScanSelector)
    {
        Ordering ordering = new Ordering();
        int fields = indexType.nFields();
        for (int f = 0; f < fields; f++) {
            ordering.append(new TPreparedField(indexType.typeAt(f), f), !reverse);
        }
        return indexScan_Default(indexType, indexKeyRange, ordering, indexScanSelector);
    }

    public static Operator indexScan_Default(IndexRowType indexType,
                                             IndexKeyRange indexKeyRange,
                                             Ordering ordering,
                                             TableRowType innerJoinUntilRowType)
    {
        return indexScan_Default(indexType,
                                 indexKeyRange,
                                 ordering,
                                 IndexScanSelector.leftJoinAfter(indexType.index(),
                                                                 innerJoinUntilRowType.table()));
    }

    public static Operator indexScan_Default(IndexRowType indexType,
                                             IndexKeyRange indexKeyRange,
                                             Ordering ordering,
                                             IndexScanSelector indexScanSelector)
    {
        return indexScan_Default(indexType, indexKeyRange, ordering, indexScanSelector, 1);
    }

    public static Operator indexScan_Default(IndexRowType indexType,
                                             IndexKeyRange indexKeyRange,
                                             int lookaheadQuantum)
    {
        Ordering ordering = new Ordering();
        int fields = indexType.nFields();
        for (int f = 0; f < fields; f++) {
            ordering.append(new TPreparedField(indexType.typeAt(f), f), true);
        }
        IndexScanSelector indexScanSelector = IndexScanSelector.leftJoinAfter(indexType.index(),
                                                                              indexType.tableType().table());
        return indexScan_Default(indexType, indexKeyRange, ordering, indexScanSelector, lookaheadQuantum);
    }

    public static Operator indexScan_Default(IndexRowType indexType,
                                             IndexKeyRange indexKeyRange,
                                             Ordering ordering,
                                             IndexScanSelector indexScanSelector,
                                             int lookaheadQuantum)
    {
        return new IndexScan_Default(indexType, indexKeyRange, ordering, indexScanSelector, lookaheadQuantum);
    }

    // Select

    public static Operator select_HKeyOrdered(Operator inputOperator,
                                              RowType predicateRowType,
                                              TPreparedExpression predicate)
    {
        return new Select_HKeyOrdered(inputOperator, predicateRowType, predicate);
    }

    public static Operator select_HKeyOrdered(Operator inputOperator,
                                              RowType predicateRowType,
                                              ExpressionGenerator predicate)
    {
        return new Select_HKeyOrdered(inputOperator, predicateRowType, predicate.getTPreparedExpression());
    }

    // Filter

    public static Operator filter_Default(Operator inputOperator, Collection<? extends RowType> keepTypes)
    {
        return new Filter_Default(inputOperator, keepTypes);
    }

    // Product

    /** deprecated */
    public static Operator product_NestedLoops(Operator outerInput,
                                                       Operator innerInput,
                                                       RowType outerType,
                                                       RowType innerType,
                                                       int inputBindingPosition)
    {
        return product_NestedLoops(outerInput, innerInput, outerType, null, innerType, inputBindingPosition);
    }

    /** deprecated */
    public static Operator product_NestedLoops(Operator outerInput,
                                                       Operator innerInput,
                                                       RowType outerType,
                                                       TableRowType branchType,
                                                       RowType innerType,
                                                       int inputBindingPosition)
    {
        return map_NestedLoops(outerInput,
                               product_Nested(innerInput, outerType, branchType, innerType, inputBindingPosition),
                               inputBindingPosition,
                               false, 0);
    }

    public static Operator product_Nested(Operator input,
                                          RowType outerType,
                                          TableRowType branchType,
                                          RowType inputType,
                                          int bindingPosition)
    {
        return new Product_Nested(input, outerType, branchType, inputType, bindingPosition);
    }

    // Count

    public static Operator count_Default(Operator input,
                                         RowType countType)
    {
        return new Count_Default(input, countType);
    }

    public static Operator count_TableStatus(RowType tableType)
    {
        return new Count_TableStatus(tableType);
    }

    // Sort

    public static Operator sort_InsertionLimited(Operator inputOperator,
                                                 RowType sortType,
                                                 Ordering ordering,
                                                 SortOption sortOption,
                                                 int limit)
    {
        return new Sort_InsertionLimited(inputOperator, sortType, ordering, sortOption, limit);
    }

    public static Operator sort_General(Operator inputOperator,
                                        RowType sortType,
                                        Ordering ordering,
                                        SortOption sortOption)
    {
        return new Sort_General(inputOperator, sortType, ordering, sortOption);
    }

    public static Ordering ordering()
    {
        return new Ordering();
    }

    // Distinct
    public static Operator distinct_Partial(Operator input, RowType distinctType)
    {
        return new Distinct_Partial(input, distinctType, null);
    }

    public static Operator distinct_Partial(Operator input,
                                            RowType distinctType,
                                            List<AkCollator> collators)
    {
        return new Distinct_Partial(input, distinctType, collators);
    }

    // Map

    public static Operator map_NestedLoops(Operator outerInput,
                                           Operator innerInput,
                                           int inputBindingPosition,
                                           boolean pipeline,
                                           int depth)
    {
        return new Map_NestedLoops(outerInput, innerInput, inputBindingPosition,
                                   pipeline, depth);
    }

    // IfEmpty

    public static Operator ifEmpty_Default(Operator input, RowType rowType,
                                           List<? extends TPreparedExpression> pExpressions,
                                           InputPreservationOption inputPreservation)
    {
        return new IfEmpty_Default(input, rowType, pExpressions, inputPreservation);
    }

    public static Operator ifEmpty_DefaultTest(Operator input, RowType rowType,
                                           List<? extends ExpressionGenerator> expressions,
                                           InputPreservationOption inputPreservation)
    {
        return new IfEmpty_Default(input, rowType, generateNew(expressions), inputPreservation);
    }

    // Union

    public static Operator unionAll_Default(Operator input1,
                                            RowType input1RowType,
                                            Operator input2,
                                            RowType input2RowType,
                                            boolean openBoth)
    {
        return new UnionAll_Default(input1, input1RowType, input2, input2RowType, openBoth);
    }

    // Except

    public static Operator except_Ordered(Operator leftInput, Operator rightInput,
                                          RowType leftRowType, RowType rightRowType,
                                          int leftOrderingFields,
                                          int rightOrderingFields,
                                          boolean[] ascending,
                                          boolean removeDuplicates)
    {
        return new Except_Ordered(leftInput, rightInput,
                leftRowType, rightRowType,
                leftOrderingFields,
                rightOrderingFields,
                ascending,
                removeDuplicates);
    }

    // Intersect

    public static Operator intersect_Ordered(Operator leftInput, Operator rightInput,
                                             RowType leftRowType, RowType rightRowType,
                                             int leftOrderingFields,
                                             int rightOrderingFields,
                                             boolean[] ascending)
    {
        return new Intersect_Ordered(leftInput, rightInput,
                leftRowType, rightRowType,
                leftOrderingFields,
                rightOrderingFields,
                ascending,
                JoinType.INNER_JOIN,
                EnumSet.of(IntersectOption.OUTPUT_LEFT),
                null,
                false);
    }
   
    // Intersect
   
    public static Operator intersect_Ordered(Operator leftInput, Operator rightInput,
                                                RowType leftRowType, RowType rightRowType,
                                                int leftOrderingFields,
                                                int rightOrderingFields,
                                                int comparisonFields,
                                                JoinType joinType,
                                                IntersectOption intersectOutput,
                                                List<TComparison> comparisons)
    {
        if (comparisonFields < 0) {
            throw new IllegalArgumentException();
        }
        boolean[] ascending = new boolean[comparisonFields];
        Arrays.fill(ascending, true);
        return new Intersect_Ordered(leftInput, rightInput,
                                     leftRowType, rightRowType,
                                     leftOrderingFields,
                                     rightOrderingFields,
                                     ascending,
                                     joinType,
                                     EnumSet.of(intersectOutput),
                                     comparisons,
                                     false);
    }

    public static Operator intersect_Ordered(Operator leftInput, Operator rightInput,
                                                RowType leftRowType, RowType rightRowType,
                                                int leftOrderingFields,
                                                int rightOrderingFields,
                                                boolean[] ascending,
                                                JoinType joinType,
                                                EnumSet<IntersectOption> intersectOptions,
                                                List<TComparison> comparisons)
    {
        return new Intersect_Ordered(leftInput, rightInput,
                                     leftRowType, rightRowType,
                                     leftOrderingFields,
                                     rightOrderingFields,
                                     ascending,
                                     joinType,
                                     intersectOptions,
                                     comparisons,
                                     false);
    }

    public static Operator intersect_Ordered(Operator leftInput, Operator rightInput,
                                                RowType leftRowType, RowType rightRowType,
                                                int leftOrderingFields,
                                                int rightOrderingFields,
                                                int comparisonFields,
                                                JoinType joinType,
                                                IntersectOption intersectOutput,
                                                List<TComparison> comparisons,
                                                boolean outputEqual)
    {
        if (comparisonFields < 0) {
            throw new IllegalArgumentException();
        }
        boolean[] ascending = new boolean[comparisonFields];
        Arrays.fill(ascending, true);
        return new Intersect_Ordered(leftInput, rightInput,
                leftRowType, rightRowType,
                leftOrderingFields,
                rightOrderingFields,
                ascending,
                joinType,
                EnumSet.of(intersectOutput),
                comparisons,
                outputEqual);
    }

    public static Operator intersect_Ordered(Operator leftInput, Operator rightInput,
                                                RowType leftRowType, RowType rightRowType,
                                                int leftOrderingFields,
                                                int rightOrderingFields,
                                                boolean[] ascending,
                                                JoinType joinType,
                                                EnumSet<IntersectOption> intersectOptions,
                                                List<TComparison> comparisons,
                                                boolean outputEqual)
    {
        return new Intersect_Ordered(leftInput, rightInput,
                leftRowType, rightRowType,
                leftOrderingFields,
                rightOrderingFields,
                ascending,
                joinType,
                intersectOptions,
                comparisons,
                outputEqual);
    }

    // Union

    public static Operator union_Ordered(Operator leftInput, Operator rightInput,
                                         RowType leftRowType, RowType rightRowType,
                                         int leftOrderingFields,
                                         int rightOrderingFields,
                                         boolean[] ascending,
                                         boolean outputEqual)
    {
        return new Union_Ordered(leftInput, rightInput,
                                 leftRowType, rightRowType,
                                 leftOrderingFields,
                                 rightOrderingFields,
                                 ascending, outputEqual);
    }

    // HKeyUnion

    public static Operator hKeyUnion_Ordered(Operator leftInput, Operator rightInput,
                                             RowType leftRowType, RowType rightRowType,
                                             int leftOrderingFields, int rightOrderingFields,
                                             int comparisonFields,
                                             TableRowType outputHKeyTableRowType)
    {
        return new HKeyUnion_Ordered(leftInput, rightInput,
                                     leftRowType, rightRowType,
                                     leftOrderingFields, rightOrderingFields,
                                     comparisonFields,
                                     outputHKeyTableRowType);
    }

    // Using_BloomFilter

    public static Operator using_BloomFilter(Operator filterInput,
                                             RowType filterRowType,
                                             long estimatedRowCount,
                                             int filterBindingPosition,
                                             Operator streamInput)
    {
        return new Using_BloomFilter(filterInput,
                                     filterRowType,
                                     estimatedRowCount,
                                     filterBindingPosition,
                                     streamInput,
                                     null);
    }

    public static Operator using_BloomFilter(Operator filterInput,
                                             RowType filterRowType,
                                             long estimatedRowCount,
                                             int filterBindingPosition,
                                             Operator streamInput,
                                             List<AkCollator> collators)
    {
        return new Using_BloomFilter(filterInput,
                                     filterRowType,
                                     estimatedRowCount,
                                     filterBindingPosition,
                                     streamInput,
                                     collators);
    }

    // Select_BloomFilter

    public static Operator select_BloomFilterTest(Operator input,
                                              Operator onPositive,
                                              List<? extends ExpressionGenerator> filterFields,
                                              int bindingPosition,
                                              boolean pipeline,
                                              int depth)
    {
        return select_BloomFilter(input, onPositive, generateNew(filterFields), null, bindingPosition, pipeline, depth);
    }

    public static Operator select_BloomFilter(Operator input,
                                              Operator onPositive,
                                              List<? extends TPreparedExpression> tFilterFields,
                                              int bindingPosition,
                                              boolean pipeline,
                                              int depth)
    {
        return select_BloomFilter(input, onPositive, tFilterFields, null, bindingPosition, pipeline, depth);
    }

    public static Operator select_BloomFilter(Operator input,
                                              Operator onPositive,
                                              List<? extends TPreparedExpression> tFilterFields,
                                              List<AkCollator> collators,
                                              int bindingPosition,
                                              boolean pipeline,
                                              int depth)
    {
        return new Select_BloomFilter(input,
                                      onPositive,
                                      tFilterFields,
                                      collators,
                                      bindingPosition,
                                      pipeline,
                                      depth);
    }

    public static Operator select_BloomFilter(Operator input,
                                              Operator onPositive,
                                              List<? extends ExpressionGenerator> filterFields,
                                              List<AkCollator> collators,
                                              int bindingPosition,
                                              boolean pipeline,
                                              int depth,
                                              ExpressionGenerator.ErasureMaker marker)
    {
        return new Select_BloomFilter(input,
                onPositive,
                generateNew(filterFields),
                collators,
                bindingPosition,
                pipeline,
                depth);
    }

    // hashTableLookup_Default
    public static Operator hashTableLookup_Default(RowType hashedRowType,
                                                   List<TPreparedExpression> outerComparisonFields,
                                                   int hashTableBindingPosition)
    {
        return new HashTableLookup_Default(
                hashedRowType,
                outerComparisonFields,
                hashTableBindingPosition);
    }

    // using_HashTable
    public static Operator using_HashTable(Operator hashInput,
                                           RowType hashedRowType,
                                           List<TPreparedExpression> comparisonFields,
                                           int hashTableBindingPosition,
                                           Operator joinedInput,
                                           List<TComparison> tComparisons,
                                           List<AkCollator> collators)
    {
        return new Using_HashTable(hashInput, hashedRowType, comparisonFields, hashTableBindingPosition, joinedInput, tComparisons, collators);
    }

    // EmitBoundRow_Nested

    public static Operator emitBoundRow_Nested(Operator input,
                                               RowType inputRowType,
                                               RowType outputRowType,
                                               RowType boundRowType,
                                               int bindingPosition)
    {
        return new EmitBoundRow_Nested(input,
                                       inputRowType, outputRowType, boundRowType,
                                       bindingPosition);
    }

    // Insert
    /* Deprecated */
    public static UpdatePlannable insert_Default(Operator inputOperator)
    {
        return new Insert_Default(inputOperator);
    }

    public static Operator insert_Returning (Operator inputOperator)
    {
        return new Insert_Returning(inputOperator);
    }

    // Update

    /* Deprecated */
    public static UpdatePlannable update_Default(Operator inputOperator,
                                                 UpdateFunction updateFunction)
    {
        return new Update_Default(inputOperator, updateFunction);
    }
   
    public static Operator update_Returning (Operator inputOperator,
                                            UpdateFunction updateFunction)
    {
        return new Update_Returning (inputOperator, updateFunction);
    }
   
    // Delete
    /* Deprecated */
    public static UpdatePlannable delete_Default(Operator inputOperator)
    {
        return new Delete_Default(inputOperator);
    }

    public static Operator delete_Returning (Operator inputOperator, boolean cascadeDelete)
    {
        return new Delete_Returning(inputOperator, cascadeDelete);
    }

    // Buffer

    public static Operator buffer_Default(Operator inputOperator, RowType inputRowType)
    {
        return new Buffer_Default(inputOperator, inputRowType);
    }

    public static Operator hKeyRow_Default(RowType rowType,
                                           List<? extends TPreparedExpression> pExpressions)
    {
        return new HKeyRow_Default(rowType, pExpressions);
    }

    public static Operator hKeyRow_DefaultTest(RowType rowType,
                                               List<ExpressionGenerator> generators)
    {
        return new HKeyRow_Default(rowType, generateNew(generators));
    }

    // Execution interface

    public static Cursor cursor(Operator root, QueryContext context, QueryBindingsCursor bindingsCursor)
    {
        return new ChainedCursor(context, root.cursor(context, bindingsCursor));
    }

    public static Cursor cursor(Operator root, QueryContext context, QueryBindings bindings)
    {
        return cursor(root, context, new SingletonQueryBindingsCursor(bindings));
    }

    // Options

    // Flattening flags

    public static enum JoinType {
        INNER_JOIN,
        LEFT_JOIN,
        RIGHT_JOIN,
        FULL_JOIN
    }

    public static enum FlattenOption {
        KEEP_PARENT,
        KEEP_CHILD,
        LEFT_JOIN_SHORTENS_HKEY
    }

    // Lookup flags

    public static enum InputPreservationOption
    {
        KEEP_INPUT,
        DISCARD_INPUT
    }

    // Sort flags

    public static enum SortOption {
        PRESERVE_DUPLICATES,
        SUPPRESS_DUPLICATES
    }

    // Intersect output flags

    public static enum IntersectOption
    {
        OUTPUT_LEFT,
        OUTPUT_RIGHT,
        SEQUENTIAL_SCAN,
        SKIP_SCAN
    }

    // Ordering specification

    public static class Ordering
    {
        public String toString()
        {
            StringBuilder buffer = new StringBuilder();
            buffer.append('(');
            List<?> exprs = expressions;
            for (int i = 0, size = sortColumns(); i < size; i++) {
                if (i > 0) {
                    buffer.append(", ");
                }
                buffer.append(exprs.get(i));
                buffer.append(' ');
                buffer.append(directions.get(i) ? "ASC" : "DESC");
            }
            buffer.append(')');
            return buffer.toString();
        }

        public int sortColumns()
        {
            return expressions.size();
        }

        public TPreparedExpression expression(int i) {
            return expressions.get(i);
        }

        public TInstance type(int i) {
            return expressions.get(i).resultType();
        }

        public boolean ascending(int i)
        {
            return directions.get(i);
        }

        public boolean allAscending()
        {
            boolean allAscending = true;
            for (Boolean direction : directions) {
                if (!direction) {
                    allAscending = false;
                }
            }
            return allAscending;
        }

        public boolean allDescending()
        {
            boolean allDescending = true;
            for (Boolean direction : directions) {
                if (direction) {
                    allDescending = false;
                }
            }
            return allDescending;
        }

        public AkCollator collator(int i)
        {
            return collators.get(i);
        }

        public void append(ExpressionGenerator expressionGenerator, boolean ascending)
        {
            TPreparedExpression newExpr;
            newExpr = expressionGenerator.getTPreparedExpression();
            append(newExpr, ascending);
        }

        public void append(TPreparedExpression tExpression, boolean ascending)
        {
            append(tExpression, ascending, null);
        }
       
        public void append(ExpressionGenerator expression, boolean ascending, AkCollator collator)
        {
            TPreparedExpression newStyle;
            newStyle = expression.getTPreparedExpression();
            append(newStyle, ascending, collator);
        }

        public void append(TPreparedExpression tExpression,  boolean ascending,
                           AkCollator collator)
        {
            expressions.add(tExpression);
            directions.add(ascending);
            collators.add(collator);
        }

        public Ordering copy()
        {
            Ordering copy = new Ordering();
            copy.expressions.addAll(expressions);
            copy.directions.addAll(directions);
            copy.collators.addAll(collators);
            return copy;
        }

        public Ordering() {
            expressions = new ArrayList<>();
        }

        private final List<TPreparedExpression> expressions;
        private final List<Boolean> directions = new ArrayList<>(); // true: ascending, false: descending
        private final List<AkCollator> collators = new ArrayList<>();
    }

}
TOP

Related Classes of com.foundationdb.qp.operator.API

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.