@Override
 public void close() throws HyracksDataException {
   try {
     if (appender.getTupleCount() > 0) {
       FrameUtils.flushFrame(writeBuffer, writer);
     }
     writer.close();
     try {
       cursor.close();
     } catch (Exception e) {
       throw new HyracksDataException(e);
     }
   } finally {
     treeIndexOpHelper.close();
   }
 }
  @Override
  public void open() throws HyracksDataException {
    accessor = new FrameTupleAccessor(treeIndexOpHelper.getTaskContext().getFrameSize(), recDesc);

    try {
      treeIndexOpHelper.open();
      index = (ITreeIndex) treeIndexOpHelper.getIndexInstance();
      writer.open();

      int lowKeySearchFields = index.getComparatorFactories().length;
      int highKeySearchFields = index.getComparatorFactories().length;
      if (lowKey != null) lowKeySearchFields = lowKey.getFieldCount();
      if (highKey != null) highKeySearchFields = highKey.getFieldCount();

      IBinaryComparator[] lowKeySearchComparators = new IBinaryComparator[lowKeySearchFields];
      for (int i = 0; i < lowKeySearchFields; i++) {
        lowKeySearchComparators[i] = index.getComparatorFactories()[i].createBinaryComparator();
      }
      lowKeySearchCmp = new MultiComparator(lowKeySearchComparators);

      if (lowKeySearchFields == highKeySearchFields) {
        highKeySearchCmp = lowKeySearchCmp;
      } else {
        IBinaryComparator[] highKeySearchComparators = new IBinaryComparator[highKeySearchFields];
        for (int i = 0; i < highKeySearchFields; i++) {
          highKeySearchComparators[i] = index.getComparatorFactories()[i].createBinaryComparator();
        }
        highKeySearchCmp = new MultiComparator(highKeySearchComparators);
      }

      rangePred =
          new RangePredicate(
              null, null, lowKeyInclusive, highKeyInclusive, lowKeySearchCmp, highKeySearchCmp);
      writeBuffer = treeIndexOpHelper.getTaskContext().allocateFrame();
      tb = new ArrayTupleBuilder(inputRecDesc.getFields().length + index.getFieldCount());
      dos = tb.getDataOutput();
      appender = new FrameTupleAppender(treeIndexOpHelper.getTaskContext().getFrameSize());
      appender.reset(writeBuffer, true);
      indexAccessor =
          index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
      setCursor();
    } catch (Exception e) {
      treeIndexOpHelper.close();
      throw new HyracksDataException(e);
    }
  }