public IndexNestedLoopJoinOperatorNodePushable(
     AbstractTreeIndexOperatorDescriptor opDesc,
     IHyracksTaskContext ctx,
     int partition,
     IRecordDescriptorProvider recordDescProvider,
     boolean isForward,
     int[] lowKeyFields,
     int[] highKeyFields,
     boolean lowKeyInclusive,
     boolean highKeyInclusive) {
   inputRecDesc = recordDescProvider.getInputRecordDescriptor(opDesc.getActivityId(), 0);
   treeIndexOpHelper =
       (IndexDataflowHelper)
           opDesc
               .getIndexDataflowHelperFactory()
               .createIndexDataflowHelper(opDesc, ctx, partition);
   this.lowKeyInclusive = lowKeyInclusive;
   this.highKeyInclusive = highKeyInclusive;
   this.recDesc = recordDescProvider.getInputRecordDescriptor(opDesc.getActivityId(), 0);
   if (lowKeyFields != null && lowKeyFields.length > 0) {
     lowKey = new PermutingFrameTupleReference();
     lowKey.setFieldPermutation(lowKeyFields);
   }
   if (highKeyFields != null && highKeyFields.length > 0) {
     highKey = new PermutingFrameTupleReference();
     highKey.setFieldPermutation(highKeyFields);
   }
 }
 @Override
 protected IIndex createIndexInstance() throws HyracksDataException {
   AbstractTreeIndexOperatorDescriptor treeOpDesc = (AbstractTreeIndexOperatorDescriptor) opDesc;
   return LSMBTreeUtils.createExternalBTreeWithBuddy(
       file,
       opDesc.getStorageManager().getBufferCache(ctx),
       opDesc.getStorageManager().getFileMapProvider(ctx),
       treeOpDesc.getTreeIndexTypeTraits(),
       treeOpDesc.getTreeIndexComparatorFactories(),
       bloomFilterFalsePositiveRate,
       mergePolicy,
       opTrackerFactory.getOperationTracker(ctx),
       ioScheduler,
       ioOpCallbackFactory.createIOOperationCallback(),
       buddyBtreeFields,
       version,
       durable);
 }
  public BTreeSearchFunctionUpdateOperatorNodePushable(
      AbstractTreeIndexOperatorDescriptor opDesc,
      IHyracksTaskContext ctx,
      int partition,
      IRecordDescriptorProvider recordDescProvider,
      boolean isForward,
      int[] lowKeyFields,
      int[] highKeyFields,
      boolean lowKeyInclusive,
      boolean highKeyInclusive,
      IUpdateFunctionFactory functionFactory,
      IRuntimeHookFactory preHookFactory,
      IRuntimeHookFactory postHookFactory,
      IRecordDescriptorFactory inputRdFactory,
      int outputArity) {
    treeIndexHelper =
        (TreeIndexDataflowHelper)
            opDesc
                .getIndexDataflowHelperFactory()
                .createIndexDataflowHelper(opDesc, ctx, partition);
    this.isForward = isForward;
    this.lowKeyInclusive = lowKeyInclusive;
    this.highKeyInclusive = highKeyInclusive;
    this.recDesc = recordDescProvider.getInputRecordDescriptor(opDesc.getActivityId(), 0);
    if (lowKeyFields != null && lowKeyFields.length > 0) {
      lowKey = new PermutingFrameTupleReference();
      lowKey.setFieldPermutation(lowKeyFields);
    }
    if (highKeyFields != null && highKeyFields.length > 0) {
      highKey = new PermutingFrameTupleReference();
      highKey.setFieldPermutation(highKeyFields);
    }

    this.writers = new IFrameWriter[outputArity];
    this.functionProxy =
        new FunctionProxy(
            ctx, functionFactory, preHookFactory, postHookFactory, inputRdFactory, writers);
    this.updateBuffer = new UpdateBuffer(ctx, 2);
  }