@Override
  public void open(ICursorInitialState initialState, ISearchPredicate searchPred)
      throws HyracksDataException, IndexException {
    LSMBTreeCursorInitialState lsmInitialState = (LSMBTreeCursorInitialState) initialState;
    cmp = lsmInitialState.getOriginalKeyComparator();
    includeMemComponent = lsmInitialState.getIncludeMemComponent();
    operationalComponents = lsmInitialState.getOperationalComponents();
    lsmHarness = lsmInitialState.getLSMHarness();
    searchCallback = lsmInitialState.getSearchOperationCallback();
    memBTreeAccessor = lsmInitialState.getMemBTreeAccessor();
    predicate = (RangePredicate) lsmInitialState.getSearchPredicate();
    reusablePred.setLowKeyComparator(cmp);
    reusablePred.setHighKey(predicate.getHighKey(), predicate.isHighKeyInclusive());
    reusablePred.setHighKeyComparator(predicate.getHighKeyComparator());

    int numBTrees = lsmInitialState.getNumBTrees();
    rangeCursors = new IIndexCursor[numBTrees];
    for (int i = 0; i < numBTrees; i++) {
      IBTreeLeafFrame leafFrame =
          (IBTreeLeafFrame) lsmInitialState.getLeafFrameFactory().createFrame();
      rangeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
    }
    setPriorityQueueComparator();

    int cursorIx = 0;
    ListIterator<ILSMComponent> btreesIter = operationalComponents.listIterator();
    if (includeMemComponent) {
      // Open cursor of in-memory BTree at index 0.
      memBTreeAccessor.search(rangeCursors[cursorIx], searchPred);
      // Skip 0 because it is the in-memory BTree.
      ++cursorIx;
      btreesIter.next();
    }

    // Open cursors of on-disk BTrees.
    int numDiskComponents = includeMemComponent ? numBTrees - 1 : numBTrees;
    ITreeIndexAccessor[] diskBTreeAccessors = new ITreeIndexAccessor[numDiskComponents];
    int diskBTreeIx = 0;
    while (btreesIter.hasNext()) {
      BTree diskBTree = (BTree) ((LSMBTreeImmutableComponent) btreesIter.next()).getBTree();
      diskBTreeAccessors[diskBTreeIx] =
          diskBTree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
      diskBTreeAccessors[diskBTreeIx].search(rangeCursors[cursorIx], searchPred);
      cursorIx++;
      diskBTreeIx++;
    }
    initPriorityQueue();
    proceed = true;
  }
  @Override
  public void open() throws HyracksDataException {
    accessor = new FrameTupleAccessor(treeIndexOpHelper.getTaskContext().getFrameSize(), recDesc);

    try {
      treeIndexOpHelper.open();
      btree = (BTree) treeIndexOpHelper.getIndexInstance();
      cursorFrame = btree.getLeafFrameFactory().createFrame();
      setCursor();
      writer.open();

      rangePred = new RangePredicate(null, null, true, true, null, null);
      int lowKeySearchFields = btree.getComparatorFactories().length;
      IBinaryComparator[] lowKeySearchComparators = new IBinaryComparator[lowKeySearchFields];
      for (int i = 0; i < lowKeySearchFields; i++) {
        lowKeySearchComparators[i] = btree.getComparatorFactories()[i].createBinaryComparator();
      }
      lowKeySearchCmp = new MultiComparator(lowKeySearchComparators);

      writeBuffer = treeIndexOpHelper.getTaskContext().allocateFrame();
      tb = new ArrayTupleBuilder(btree.getFieldCount());
      dos = tb.getDataOutput();
      appender = new FrameTupleAppender(treeIndexOpHelper.getTaskContext().getFrameSize());
      appender.reset(writeBuffer, true);

      indexAccessor =
          btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);

      /** set the search cursor */
      rangePred.setLowKey(null, true);
      rangePred.setHighKey(null, true);
      cursor.reset();
      indexAccessor.search(cursor, rangePred);

      /** set up current top tuple */
      if (cursor.hasNext()) {
        cursor.next();
        currentTopTuple = cursor.getTuple();
        match = false;
      }

    } catch (Exception e) {
      treeIndexOpHelper.close();
      throw new HyracksDataException(e);
    }
  }
  @Override
  public void open() throws HyracksDataException {
    /** open the function */
    functionProxy.functionOpen();
    accessor = new FrameTupleAccessor(treeIndexHelper.getTaskContext().getFrameSize(), recDesc);

    try {
      treeIndexHelper.open();
      btree = (BTree) treeIndexHelper.getIndexInstance();
      cursorFrame = btree.getLeafFrameFactory().createFrame();
      setCursor();

      // Construct range predicate.
      lowKeySearchCmp = BTreeUtils.getSearchMultiComparator(btree.getComparatorFactories(), lowKey);
      highKeySearchCmp =
          BTreeUtils.getSearchMultiComparator(btree.getComparatorFactories(), highKey);
      rangePred =
          new RangePredicate(
              null, null, lowKeyInclusive, highKeyInclusive, lowKeySearchCmp, highKeySearchCmp);

      writeBuffer = treeIndexHelper.getTaskContext().allocateFrame();
      tb = new ArrayTupleBuilder(btree.getFieldCount());
      dos = tb.getDataOutput();
      appender = new FrameTupleAppender(treeIndexHelper.getTaskContext().getFrameSize());
      appender.reset(writeBuffer, true);
      indexAccessor =
          btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);

      cloneUpdateTb = new ArrayTupleBuilder(btree.getFieldCount());
      updateBuffer.setFieldCount(btree.getFieldCount());
    } catch (Exception e) {
      treeIndexHelper.close();
      throw new HyracksDataException(e);
    }
  }
 @Override
 public IBinaryComparatorFactory[] getComparatorFactories() {
   BTree btree = (BTree) index;
   return btree.getComparatorFactories();
 }
 @Override
 public int getKeyFieldCount() {
   BTree btree = (BTree) index;
   return btree.getComparatorFactories().length;
 }