Exemplo n.º 1
0
  @SuppressWarnings("unchecked")
  protected BufferingSequence(
      String workspaceName,
      NodeSequence delegate,
      ExtractFromRow extractor,
      BufferManager bufferMgr,
      CachedNodeSupplier nodeCache,
      boolean pack,
      boolean useHeap,
      boolean allowDuplicates) {
    super(delegate);
    assert extractor != null;
    this.workspaceName = workspaceName;
    this.width = delegate.width();
    this.cache = nodeCache;
    this.extractor = extractor;

    // Set up the row factory based upon the width of the delegate sequence...
    this.rowFactory = BufferedRows.serializer(nodeCache, width);

    // Set up the buffer ...
    SortingBuffer<Object, BufferedRow> buffer = null;
    TypeFactory<?> keyType = extractor.getType();
    if (allowDuplicates) {
      @SuppressWarnings("rawtypes")
      Serializer<? extends Comparable> keySerializer =
          (Serializer<? extends Comparable<?>>) bufferMgr.serializerFor(keyType);
      buffer =
          bufferMgr
              .createSortingWithDuplicatesBuffer(
                  keySerializer,
                  extractor.getType().getComparator(),
                  (BufferedRowFactory<BufferedRow>) rowFactory)
              .keepSize(true)
              .useHeap(useHeap)
              .make();
    } else {
      BTreeKeySerializer<Object> keySerializer =
          (BTreeKeySerializer<Object>) bufferMgr.bTreeKeySerializerFor(keyType, pack);
      if (keySerializer instanceof KeySerializerWithComparator) {
        keySerializer =
            ((KeySerializerWithComparator<Object>) keySerializer)
                .withComparator(extractor.getType().getComparator());
      }
      buffer =
          bufferMgr
              .createSortingBuffer(keySerializer, (BufferedRowFactory<BufferedRow>) rowFactory)
              .keepSize(true)
              .useHeap(useHeap)
              .make();
    }
    this.buffer = buffer;
  }