@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; }