Ildar Absalyamov has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/453

Change subject: Fixed m2e lifecycle mapping pom issues
......................................................................

Fixed m2e lifecycle mapping pom issues

Change-Id: Ifc8927a7fe90577d787c3d30c371ea95dd4aa24e
---
M 
hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/INumeric.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponent.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFlushOperation.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMergeOperation.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponent.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java
M 
hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java
M 
hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractDiskLSMComponent.java
M 
hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
M 
hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFileReferences.java
M 
hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
M 
hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexDiskComponent.java
M 
hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
M 
hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFlushOperation.java
M 
hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexMergeOperation.java
M 
hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java
M 
hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
M 
hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeDiskComponent.java
M 
hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
M 
hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFlushOperation.java
M hyracks/pom.xml
26 files changed, 345 insertions(+), 584 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/hyracks refs/changes/53/453/1

diff --git 
a/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/INumeric.java
 
b/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/INumeric.java
index 7be6680..a740d1a 100644
--- 
a/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/INumeric.java
+++ 
b/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/api/INumeric.java
@@ -30,4 +30,6 @@
     public float floatValue();
 
     public double doubleValue();
+
+    //    public void shiftRight(int pos);
 }
\ No newline at end of file
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
index 3ade4fa..246ea7a 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
@@ -59,6 +59,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.ITwoPCIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractDiskLSMComponent;
 import 
org.apache.hyracks.storage.am.lsm.common.impls.BlockingIOOperationCallbackWrapper;
 import org.apache.hyracks.storage.am.lsm.common.impls.ExternalIndexHarness;
 import 
org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
@@ -97,10 +98,10 @@
             ILSMIOOperationCallback ioOpCallback, TreeIndexFactory<BTree> 
transactionBTreeFactory, int version,
             boolean durable) {
         super(interiorFrameFactory, insertLeafFrameFactory, 
deleteLeafFrameFactory, fileManager, diskBTreeFactory,
-                bulkLoadBTreeFactory, bloomFilterFactory, 
bloomFilterFalsePositiveRate, diskFileMapProvider,
-                fieldCount, cmpFactories, mergePolicy, opTracker, ioScheduler, 
ioOpCallback, false, durable);
-        this.transactionComponentFactory = new 
LSMBTreeDiskComponentFactory(transactionBTreeFactory,
-                bloomFilterFactory, null);
+                bulkLoadBTreeFactory, bloomFilterFactory, 
bloomFilterFalsePositiveRate, diskFileMapProvider, fieldCount,
+                cmpFactories, mergePolicy, opTracker, ioScheduler, 
ioOpCallback, false, durable);
+        this.transactionComponentFactory = new 
LSMBTreeDiskComponentFactory(transactionBTreeFactory, bloomFilterFactory,
+                null);
         this.secondDiskComponents = new LinkedList<ILSMComponent>();
         this.interiorFrameFactory = interiorFrameFactory;
         this.version = version;
@@ -116,7 +117,7 @@
             throw new HyracksDataException("Failed to create transaction 
components", e);
         }
         return createDiskComponent(transactionComponentFactory, 
componentFileRefs.getInsertIndexFileReference(),
-                componentFileRefs.getBloomFilterFileReference(), true);
+                componentFileRefs.getBloomFilterFileReference(), 
componentFileRefs.getStatisticsFileReference(), true);
     }
 
     // The subsume merged components is overridden to account for:
@@ -180,8 +181,8 @@
         List<ILSMComponent> mergingComponents = ctx.getComponentHolder();
         boolean returnDeletedTuples = false;
         if (version == 0) {
-            if (ctx.getComponentHolder().get(ctx.getComponentHolder().size() - 
1) != diskComponents.get(diskComponents
-                    .size() - 1)) {
+            if (ctx.getComponentHolder().get(ctx.getComponentHolder().size() - 
1) != diskComponents
+                    .get(diskComponents.size() - 1)) {
                 returnDeletedTuples = true;
             }
         } else {
@@ -195,12 +196,12 @@
         BTree lastBTree = ((LSMBTreeDiskComponent) 
mergingComponents.get(mergingComponents.size() - 1)).getBTree();
         FileReference firstFile = 
diskFileMapProvider.lookupFileName(firstBTree.getFileId());
         FileReference lastFile = 
diskFileMapProvider.lookupFileName(lastBTree.getFileId());
-        LSMComponentFileReferences relMergeFileRefs = 
fileManager.getRelMergeFileReference(firstFile.getFile()
-                .getName(), lastFile.getFile().getName());
+        LSMComponentFileReferences relMergeFileRefs = fileManager
+                .getRelMergeFileReference(firstFile.getFile().getName(), 
lastFile.getFile().getName());
         ILSMIndexAccessorInternal accessor = new LSMBTreeAccessor(lsmHarness, 
opCtx);
-        ioScheduler.scheduleOperation(new LSMBTreeMergeOperation(accessor, 
mergingComponents, cursor, relMergeFileRefs
-                .getInsertIndexFileReference(), 
relMergeFileRefs.getBloomFilterFileReference(), callback, fileManager
-                .getBaseDir()));
+        ioScheduler.scheduleOperation(new LSMBTreeMergeOperation(accessor, 
mergingComponents, cursor,
+                relMergeFileRefs.getInsertIndexFileReference(), 
relMergeFileRefs.getBloomFilterFileReference(),
+                relMergeFileRefs.getStatisticsFileReference(), callback, 
fileManager.getBaseDir()));
     }
 
     // This function should only be used when a transaction fail. it doesn't
@@ -260,11 +261,12 @@
                 throw new HyracksDataException(e);
             }
             for (LSMComponentFileReferences lsmComonentFileReference : 
validFileReferences) {
-                LSMBTreeDiskComponent component;
+                AbstractDiskLSMComponent component;
                 try {
                     component = createDiskComponent(componentFactory,
                             
lsmComonentFileReference.getInsertIndexFileReference(),
-                            
lsmComonentFileReference.getBloomFilterFileReference(), false);
+                            
lsmComonentFileReference.getBloomFilterFileReference(),
+                            
lsmComonentFileReference.getStatisticsFileReference(), false);
                 } catch (IndexException e) {
                     throw new HyracksDataException(e);
                 }
@@ -515,7 +517,7 @@
             int maxBucketsPerElement = 
BloomCalculations.maxBucketsPerElement(numElementsHint);
             BloomFilterSpecification bloomFilterSpec = 
BloomCalculations.computeBloomSpec(maxBucketsPerElement,
                     bloomFilterFalsePositiveRate);
-            builder = ((LSMBTreeDiskComponent) 
component).getBloomFilter().createBuilder(numElementsHint,
+            builder = ((AbstractDiskLSMComponent) 
component).getBloomFilter().createBuilder(numElementsHint,
                     bloomFilterSpec.getNumHashes(), 
bloomFilterSpec.getNumBucketsPerElements());
         }
 
@@ -552,11 +554,11 @@
                 }
                 ((LSMBTreeDiskComponent) component).getBTree().destroy();
                 try {
-                    ((LSMBTreeDiskComponent) 
component).getBloomFilter().deactivate();
+                    ((AbstractDiskLSMComponent) 
component).getBloomFilter().deactivate();
                 } catch (HyracksDataException e) {
                     // Do nothing.. this could've bee
                 }
-                ((LSMBTreeDiskComponent) component).getBloomFilter().destroy();
+                ((AbstractDiskLSMComponent) 
component).getBloomFilter().destroy();
             }
         }
 
@@ -575,7 +577,7 @@
                     // deactivate. it could later be added or deleted
                     markAsValid(component);
                     BTree btree = ((LSMBTreeDiskComponent) 
component).getBTree();
-                    BloomFilter bloomFilter = ((LSMBTreeDiskComponent) 
component).getBloomFilter();
+                    BloomFilter bloomFilter = ((AbstractDiskLSMComponent) 
component).getBloomFilter();
                     btree.deactivate();
                     bloomFilter.deactivate();
                 } else {
@@ -678,11 +680,12 @@
 
     @Override
     public void commitTransaction() throws TreeIndexException, 
HyracksDataException, IndexException {
-        LSMComponentFileReferences componentFileRefrences = 
fileManager.getTransactionFileReferenceForCommit();
-        LSMBTreeDiskComponent component = null;
-        if (componentFileRefrences != null) {
-            component = createDiskComponent(componentFactory, 
componentFileRefrences.getInsertIndexFileReference(),
-                    componentFileRefrences.getBloomFilterFileReference(), 
false);
+        LSMComponentFileReferences componentFileReferences = 
fileManager.getTransactionFileReferenceForCommit();
+        AbstractDiskLSMComponent component = null;
+        if (componentFileReferences != null) {
+            component = createDiskComponent(componentFactory, 
componentFileReferences.getInsertIndexFileReference(),
+                    componentFileReferences.getBloomFilterFileReference(),
+                    componentFileReferences.getStatisticsFileReference(), 
false);
         }
         ((ExternalIndexHarness) 
lsmHarness).addTransactionComponents(component);
     }
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
index 343f690..88a6eb4 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
@@ -150,7 +150,8 @@
                     component = createDiskComponent(componentFactory,
                             
lsmComonentFileReference.getInsertIndexFileReference(),
                             
lsmComonentFileReference.getDeleteIndexFileReference(),
-                            
lsmComonentFileReference.getBloomFilterFileReference(), false);
+                            
lsmComonentFileReference.getBloomFilterFileReference(),
+                            
lsmComonentFileReference.getStatisticsFileReference(), false);
                 } catch (IndexException e) {
                     throw new HyracksDataException(e);
                 }
@@ -374,8 +375,8 @@
         // which list to check against and we need to synchronize for this
         boolean keepDeleteTuples = false;
         if (version == 0) {
-            keepDeleteTuples = mergingComponents.get(mergingComponents.size() 
- 1) != diskComponents.get(diskComponents
-                    .size() - 1);
+            keepDeleteTuples = mergingComponents.get(mergingComponents.size() 
- 1) != diskComponents
+                    .get(diskComponents.size() - 1);
         } else {
             keepDeleteTuples = mergingComponents.get(mergingComponents.size() 
- 1) != secondDiskComponents
                     .get(secondDiskComponents.size() - 1);
@@ -383,7 +384,8 @@
 
         ioScheduler.scheduleOperation(new 
LSMBTreeWithBuddyMergeOperation(accessor, mergingComponents, cursor,
                 relMergeFileRefs.getInsertIndexFileReference(), 
relMergeFileRefs.getDeleteIndexFileReference(),
-                relMergeFileRefs.getBloomFilterFileReference(), callback, 
fileManager.getBaseDir(), keepDeleteTuples));
+                relMergeFileRefs.getBloomFilterFileReference(), 
relMergeFileRefs.getStatisticsFileReference(), callback,
+                fileManager.getBaseDir(), keepDeleteTuples));
     }
 
     // This method creates the appropriate opContext for the targeted version
@@ -402,8 +404,8 @@
         search(opCtx, cursor, btreeSearchPred);
 
         LSMBTreeWithBuddyDiskComponent mergedComponent = 
createDiskComponent(componentFactory,
-                mergeOp.getBTreeMergeTarget(), 
mergeOp.getBuddyBTreeMergeTarget(), mergeOp.getBloomFilterMergeTarget(),
-                true);
+                mergeOp.getBTreeMergeTarget(), 
mergeOp.getBuddyBTreeMergeTarget(), mergeOp.getBloomFilterTarget(),
+                mergeOp.getStatisticsMergeTarget(), true);
 
         // In case we must keep the deleted-keys BuddyBTrees, then they must be
         // merged *before* merging the b-trees so that
@@ -421,8 +423,8 @@
 
             long numElements = 0L;
             for (int i = 0; i < mergeOp.getMergingComponents().size(); ++i) {
-                numElements += ((LSMBTreeWithBuddyDiskComponent) 
mergeOp.getMergingComponents().get(i))
-                        .getBloomFilter().getNumElements();
+                numElements += ((LSMBTreeWithBuddyDiskComponent) 
mergeOp.getMergingComponents().get(i)).getBloomFilter()
+                        .getNumElements();
             }
 
             int maxBucketsPerElement = 
BloomCalculations.maxBucketsPerElement(numElements);
@@ -619,11 +621,10 @@
 
     private LSMBTreeWithBuddyDiskComponent 
createDiskComponent(ILSMComponentFactory factory,
             FileReference insertFileRef, FileReference deleteFileRef, 
FileReference bloomFilterFileRef,
-            boolean createComponent) throws HyracksDataException, 
IndexException {
+            FileReference statisticsFileRef, boolean createComponent) throws 
HyracksDataException, IndexException {
         // Create new instance.
-        LSMBTreeWithBuddyDiskComponent component = 
(LSMBTreeWithBuddyDiskComponent) factory
-                .createLSMComponentInstance(new 
LSMComponentFileReferences(insertFileRef, deleteFileRef,
-                        bloomFilterFileRef));
+        LSMBTreeWithBuddyDiskComponent component = 
(LSMBTreeWithBuddyDiskComponent) factory.createLSMComponentInstance(
+                new LSMComponentFileReferences(insertFileRef, deleteFileRef, 
bloomFilterFileRef, statisticsFileRef));
         if (createComponent) {
             component.getBTree().create();
             component.getBuddyBTree().create();
@@ -798,7 +799,8 @@
     protected ILSMComponent createBulkLoadTarget() throws 
HyracksDataException, IndexException {
         LSMComponentFileReferences componentFileRefs = 
fileManager.getRelFlushFileReference();
         return createDiskComponent(bulkComponentFactory, 
componentFileRefs.getInsertIndexFileReference(),
-                componentFileRefs.getDeleteIndexFileReference(), 
componentFileRefs.getBloomFilterFileReference(), true);
+                componentFileRefs.getDeleteIndexFileReference(), 
componentFileRefs.getBloomFilterFileReference(),
+                componentFileRefs.getStatisticsFileReference(), true);
     }
 
     // This method is used to create a target for a bulk modify operation. This
@@ -811,7 +813,8 @@
             throw new HyracksDataException("Failed to create transaction 
components", e);
         }
         return createDiskComponent(bulkComponentFactory, 
componentFileRefs.getInsertIndexFileReference(),
-                componentFileRefs.getDeleteIndexFileReference(), 
componentFileRefs.getBloomFilterFileReference(), true);
+                componentFileRefs.getDeleteIndexFileReference(), 
componentFileRefs.getBloomFilterFileReference(),
+                componentFileRefs.getStatisticsFileReference(), true);
     }
 
     @Override
@@ -849,12 +852,13 @@
 
     @Override
     public void commitTransaction() throws HyracksDataException, 
IndexException {
-        LSMComponentFileReferences componentFileRefrences = 
fileManager.getTransactionFileReferenceForCommit();
+        LSMComponentFileReferences componentFileReferences = 
fileManager.getTransactionFileReferenceForCommit();
         LSMBTreeWithBuddyDiskComponent component = null;
-        if (componentFileRefrences != null) {
-            component = createDiskComponent(componentFactory, 
componentFileRefrences.getInsertIndexFileReference(),
-                    componentFileRefrences.getDeleteIndexFileReference(),
-                    componentFileRefrences.getBloomFilterFileReference(), 
false);
+        if (componentFileReferences != null) {
+            component = createDiskComponent(componentFactory, 
componentFileReferences.getInsertIndexFileReference(),
+                    componentFileReferences.getDeleteIndexFileReference(),
+                    componentFileReferences.getBloomFilterFileReference(),
+                    componentFileReferences.getStatisticsFileReference(), 
false);
         }
         ((ExternalIndexHarness) 
lsmHarness).addTransactionComponents(component);
     }
@@ -886,7 +890,7 @@
     public boolean isPrimaryIndex() {
         return false;
     }
-    
+
     @Override
     public Set<String> getLSMComponentPhysicalFiles(ILSMComponent 
lsmComponent) {
         Set<String> files = new HashSet<String>();
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
index 663d2f7..d94072b 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
@@ -74,6 +74,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCache;
 import 
org.apache.hyracks.storage.am.lsm.common.freepage.VirtualFreePageManager;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractDiskLSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
 import 
org.apache.hyracks.storage.am.lsm.common.impls.BlockingIOOperationCallbackWrapper;
 import 
org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
@@ -115,12 +116,13 @@
                 filterManager, filterFields, durable);
         int i = 0;
         for (IVirtualBufferCache virtualBufferCache : virtualBufferCaches) {
-            LSMBTreeMemoryComponent mutableComponent = new 
LSMBTreeMemoryComponent(new BTree(virtualBufferCache,
-                    virtualBufferCache.getFileMapProvider(), new 
VirtualFreePageManager(
-                            virtualBufferCache.getNumPages()), 
interiorFrameFactory, insertLeafFrameFactory,
-                    cmpFactories, fieldCount, new FileReference(new 
File(fileManager.getBaseDir() + "_virtual_" + i))),
-                    virtualBufferCache, i == 0 ? true : false, filterFactory 
== null ? null
-                            : filterFactory.createLSMComponentFilter());
+            LSMBTreeMemoryComponent mutableComponent = new 
LSMBTreeMemoryComponent(
+                    new BTree(virtualBufferCache, 
virtualBufferCache.getFileMapProvider(),
+                            new 
VirtualFreePageManager(virtualBufferCache.getNumPages()), interiorFrameFactory,
+                            insertLeafFrameFactory, cmpFactories, fieldCount,
+                            new FileReference(new 
File(fileManager.getBaseDir() + "_virtual_" + i))),
+                    virtualBufferCache, i == 0 ? true : false,
+                    filterFactory == null ? null : 
filterFactory.createLSMComponentFilter());
             memoryComponents.add(mutableComponent);
             ++i;
         }
@@ -185,11 +187,12 @@
             throw new HyracksDataException(e);
         }
         for (LSMComponentFileReferences lsmComonentFileReference : 
validFileReferences) {
-            LSMBTreeDiskComponent component;
+            AbstractDiskLSMComponent component;
             try {
                 component = createDiskComponent(componentFactory,
                         lsmComonentFileReference.getInsertIndexFileReference(),
-                        
lsmComonentFileReference.getBloomFilterFileReference(), false);
+                        lsmComonentFileReference.getBloomFilterFileReference(),
+                        lsmComonentFileReference.getStatisticsFileReference(), 
false);
             } catch (IndexException e) {
                 throw new HyracksDataException(e);
             }
@@ -371,8 +374,8 @@
         }
         if (ctx.filterTuple != null) {
             ctx.filterTuple.reset(tuple);
-            
memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter()
-                    .update(ctx.filterTuple, ctx.filterCmp);
+            
memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter().update(ctx.filterTuple,
+                    ctx.filterCmp);
         }
     }
 
@@ -450,9 +453,9 @@
         opCtx.setOperation(IndexOperation.FLUSH);
         opCtx.getComponentHolder().add(flushingComponent);
         ILSMIndexAccessorInternal flushAccessor = new 
LSMBTreeAccessor(lsmHarness, opCtx);
-        ioScheduler.scheduleOperation(new 
LSMBTreeFlushOperation(flushAccessor, flushingComponent, componentFileRefs
-                .getInsertIndexFileReference(), 
componentFileRefs.getBloomFilterFileReference(), callback, fileManager
-                .getBaseDir()));
+        ioScheduler.scheduleOperation(new 
LSMBTreeFlushOperation(flushAccessor, flushingComponent,
+                componentFileRefs.getInsertIndexFileReference(), 
componentFileRefs.getBloomFilterFileReference(),
+                componentFileRefs.getStatisticsFileReference(), callback, 
fileManager.getBaseDir()));
     }
 
     @Override
@@ -481,10 +484,10 @@
                 bloomFilterFalsePositiveRate);
 
         LSMBTreeDiskComponent component = 
createDiskComponent(componentFactory, flushOp.getBTreeFlushTarget(),
-                flushOp.getBloomFilterFlushTarget(), true);
+                flushOp.getBloomFilterTarget(), flushOp.getStatisticsTarget(), 
true);
         IIndexBulkLoader bulkLoader = 
component.getBTree().createBulkLoader(1.0f, false, numElements, false);
-        IIndexBulkLoader builder = 
component.getBloomFilter().createBuilder(numElements,
-                bloomFilterSpec.getNumHashes(), 
bloomFilterSpec.getNumBucketsPerElements());
+        IIndexBulkLoader builder = 
component.getBloomFilter().createBuilder(numElements, 
bloomFilterSpec.getNumHashes(),
+                bloomFilterSpec.getNumBucketsPerElements());
 
         IIndexCursor scanCursor = accessor.createSearchCursor(false);
         accessor.search(scanCursor, nullPred);
@@ -517,8 +520,8 @@
         opCtx.setOperation(IndexOperation.MERGE);
         List<ILSMComponent> mergingComponents = ctx.getComponentHolder();
         boolean returnDeletedTuples = false;
-        if (ctx.getComponentHolder().get(ctx.getComponentHolder().size() - 1) 
!= diskComponents.get(diskComponents
-                .size() - 1)) {
+        if (ctx.getComponentHolder().get(ctx.getComponentHolder().size() - 1) 
!= diskComponents
+                .get(diskComponents.size() - 1)) {
             returnDeletedTuples = true;
         }
         ITreeIndexCursor cursor = new LSMBTreeRangeSearchCursor(opCtx, 
returnDeletedTuples);
@@ -526,12 +529,12 @@
         BTree lastBTree = ((LSMBTreeDiskComponent) 
mergingComponents.get(mergingComponents.size() - 1)).getBTree();
         FileReference firstFile = 
diskFileMapProvider.lookupFileName(firstBTree.getFileId());
         FileReference lastFile = 
diskFileMapProvider.lookupFileName(lastBTree.getFileId());
-        LSMComponentFileReferences relMergeFileRefs = 
fileManager.getRelMergeFileReference(firstFile.getFile()
-                .getName(), lastFile.getFile().getName());
+        LSMComponentFileReferences relMergeFileRefs = fileManager
+                .getRelMergeFileReference(firstFile.getFile().getName(), 
lastFile.getFile().getName());
         ILSMIndexAccessorInternal accessor = new LSMBTreeAccessor(lsmHarness, 
opCtx);
-        ioScheduler.scheduleOperation(new LSMBTreeMergeOperation(accessor, 
mergingComponents, cursor, relMergeFileRefs
-                .getInsertIndexFileReference(), 
relMergeFileRefs.getBloomFilterFileReference(), callback, fileManager
-                .getBaseDir()));
+        ioScheduler.scheduleOperation(new LSMBTreeMergeOperation(accessor, 
mergingComponents, cursor,
+                relMergeFileRefs.getInsertIndexFileReference(), 
relMergeFileRefs.getBloomFilterFileReference(),
+                relMergeFileRefs.getStatisticsFileReference(), callback, 
fileManager.getBaseDir()));
     }
 
     @Override
@@ -546,14 +549,14 @@
 
         long numElements = 0L;
         for (int i = 0; i < mergedComponents.size(); ++i) {
-            numElements += ((LSMBTreeDiskComponent) 
mergedComponents.get(i)).getBloomFilter().getNumElements();
+            numElements += ((AbstractDiskLSMComponent) 
mergedComponents.get(i)).getBloomFilter().getNumElements();
         }
 
         int maxBucketsPerElement = 
BloomCalculations.maxBucketsPerElement(numElements);
         BloomFilterSpecification bloomFilterSpec = 
BloomCalculations.computeBloomSpec(maxBucketsPerElement,
                 bloomFilterFalsePositiveRate);
         LSMBTreeDiskComponent mergedComponent = 
createDiskComponent(componentFactory, mergeOp.getBTreeMergeTarget(),
-                mergeOp.getBloomFilterMergeTarget(), true);
+                mergeOp.getBloomFilterTarget(), 
mergeOp.getStatisticsMergeTarget(), true);
 
         IIndexBulkLoader bulkLoader = 
mergedComponent.getBTree().createBulkLoader(1.0f, false, numElements, false);
         IIndexBulkLoader builder = 
mergedComponent.getBloomFilter().createBuilder(numElements,
@@ -585,11 +588,11 @@
     }
 
     protected LSMBTreeDiskComponent 
createDiskComponent(LSMBTreeDiskComponentFactory factory,
-            FileReference btreeFileRef, FileReference bloomFilterFileRef, 
boolean createComponent)
-            throws HyracksDataException, IndexException {
+            FileReference btreeFileRef, FileReference bloomFilterFileRef, 
FileReference statisticsFileReference,
+            boolean createComponent) throws HyracksDataException, 
IndexException {
         // Create new BTree instance.
-        LSMBTreeDiskComponent component = (LSMBTreeDiskComponent) factory
-                .createLSMComponentInstance(new 
LSMComponentFileReferences(btreeFileRef, null, bloomFilterFileRef));
+        LSMBTreeDiskComponent component = (LSMBTreeDiskComponent) 
factory.createLSMComponentInstance(
+                new LSMComponentFileReferences(btreeFileRef, null, 
bloomFilterFileRef, statisticsFileReference));
         if (createComponent) {
             component.getBTree().create();
             component.getBloomFilter().create();
@@ -616,7 +619,7 @@
     protected ILSMComponent createBulkLoadTarget() throws 
HyracksDataException, IndexException {
         LSMComponentFileReferences componentFileRefs = 
fileManager.getRelFlushFileReference();
         return createDiskComponent(bulkLoadComponentFactory, 
componentFileRefs.getInsertIndexFileReference(),
-                componentFileRefs.getBloomFilterFileReference(), true);
+                componentFileRefs.getBloomFilterFileReference(), 
componentFileRefs.getStatisticsFileReference(), true);
     }
 
     @Override
@@ -645,8 +648,8 @@
         public final PermutingTupleReference filterTuple;
         public final MultiComparator filterCmp;
 
-        public LSMBTreeBulkLoader(float fillFactor, boolean verifyInput, long 
numElementsHint, boolean checkIfEmptyIndex)
-                throws TreeIndexException, HyracksDataException {
+        public LSMBTreeBulkLoader(float fillFactor, boolean verifyInput, long 
numElementsHint,
+                boolean checkIfEmptyIndex) throws TreeIndexException, 
HyracksDataException {
             if (checkIfEmptyIndex && !isEmptyIndex()) {
                 throw new TreeIndexException("Cannot load an index that is not 
empty");
             }
@@ -661,7 +664,7 @@
             int maxBucketsPerElement = 
BloomCalculations.maxBucketsPerElement(numElementsHint);
             BloomFilterSpecification bloomFilterSpec = 
BloomCalculations.computeBloomSpec(maxBucketsPerElement,
                     bloomFilterFalsePositiveRate);
-            builder = ((LSMBTreeDiskComponent) 
component).getBloomFilter().createBuilder(numElementsHint,
+            builder = ((AbstractDiskLSMComponent) 
component).getBloomFilter().createBuilder(numElementsHint,
                     bloomFilterSpec.getNumHashes(), 
bloomFilterSpec.getNumBucketsPerElements());
 
             if (filterFields != null) {
@@ -712,8 +715,8 @@
                 }
                 ((LSMBTreeDiskComponent) component).getBTree().deactivate();
                 ((LSMBTreeDiskComponent) component).getBTree().destroy();
-                ((LSMBTreeDiskComponent) 
component).getBloomFilter().deactivate();
-                ((LSMBTreeDiskComponent) component).getBloomFilter().destroy();
+                ((AbstractDiskLSMComponent) 
component).getBloomFilter().deactivate();
+                ((AbstractDiskLSMComponent) 
component).getBloomFilter().destroy();
             }
         }
 
@@ -863,7 +866,7 @@
 
         files.add(component.getBTree().getFileReference().toString());
         files.add(component.getBloomFilter().getFileReference().toString());
-        
+
         return files;
     }
 }
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponent.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponent.java
index f553368..0be3213 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponent.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponent.java
@@ -26,28 +26,21 @@
 
 public class LSMBTreeDiskComponent extends AbstractDiskLSMComponent {
     private final BTree btree;
-    private final BloomFilter bloomFilter;
 
     public LSMBTreeDiskComponent(BTree btree, BloomFilter bloomFilter, 
ILSMComponentFilter filter) {
-        super(filter);
+        super(bloomFilter, filter);
         this.btree = btree;
-        this.bloomFilter = bloomFilter;
     }
 
     @Override
     public void destroy() throws HyracksDataException {
         btree.deactivate();
         btree.destroy();
-        bloomFilter.deactivate();
-        bloomFilter.destroy();
+        super.destroy();
     }
 
     public BTree getBTree() {
         return btree;
-    }
-
-    public BloomFilter getBloomFilter() {
-        return bloomFilter;
     }
 
     @Override
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
index 2be4e4a..2eaf792 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFileManager.java
@@ -56,7 +56,8 @@
         String baseName = baseDir + ts + SPLIT_STRING + ts;
         // Begin timestamp and end timestamp are identical since it is a flush
         return new LSMComponentFileReferences(createFlushFile(baseName + 
SPLIT_STRING + BTREE_STRING), null,
-                createFlushFile(baseName + SPLIT_STRING + 
BLOOM_FILTER_STRING));
+                createFlushFile(baseName + SPLIT_STRING + BLOOM_FILTER_STRING),
+                createFlushFile(baseName + SPLIT_STRING + STATISTICS_STRING));
     }
 
     @Override
@@ -68,7 +69,8 @@
         String baseName = baseDir + firstTimestampRange[0] + SPLIT_STRING + 
lastTimestampRange[1];
         // Get the range of timestamps by taking the earliest and the latest 
timestamps
         return new LSMComponentFileReferences(createMergeFile(baseName + 
SPLIT_STRING + BTREE_STRING), null,
-                createMergeFile(baseName + SPLIT_STRING + 
BLOOM_FILTER_STRING));
+                createMergeFile(baseName + SPLIT_STRING + BLOOM_FILTER_STRING),
+                createFlushFile(baseName + SPLIT_STRING + STATISTICS_STRING));
     }
 
     private static FilenameFilter btreeFilter = new FilenameFilter() {
@@ -96,7 +98,8 @@
             int index = cmpFileName.fileName.lastIndexOf(SPLIT_STRING);
             btreeFilesSet.add(cmpFileName.fileName.substring(0, index));
         }
-        validateFiles(btreeFilesSet, allBloomFilterFiles, 
getCompoundFilter(transactionFilter, bloomFilterFilter), null);
+        validateFiles(btreeFilesSet, allBloomFilterFiles, 
getCompoundFilter(transactionFilter, bloomFilterFilter),
+                null);
 
         // Sanity check.
         if (allBTreeFiles.size() != allBloomFilterFiles.size()) {
@@ -110,8 +113,8 @@
         }
 
         if (allBTreeFiles.size() == 1 && allBloomFilterFiles.size() == 1) {
-            validFiles.add(new 
LSMComponentFileReferences(allBTreeFiles.get(0).fileRef, null, 
allBloomFilterFiles
-                    .get(0).fileRef));
+            validFiles.add(new 
LSMComponentFileReferences(allBTreeFiles.get(0).fileRef, null,
+                    allBloomFilterFiles.get(0).fileRef, null));
             return validFiles;
         }
 
@@ -148,7 +151,8 @@
                 invalidBloomFilterFile.delete();
             } else {
                 // This scenario should not be possible.
-                throw new HyracksDataException("Found LSM files with 
overlapping but not contained timetamp intervals.");
+                throw new HyracksDataException(
+                        "Found LSM files with overlapping but not contained 
timetamp intervals.");
             }
         }
 
@@ -163,7 +167,7 @@
             ComparableFileName cmpBTreeFileName = btreeFileIter.next();
             ComparableFileName cmpBloomFilterFileName = 
bloomFilterFileIter.next();
             validFiles.add(new 
LSMComponentFileReferences(cmpBTreeFileName.fileRef, null,
-                    cmpBloomFilterFileName.fileRef));
+                    cmpBloomFilterFileName.fileRef, null));
         }
 
         return validFiles;
@@ -178,7 +182,7 @@
         String baseName = baseDir + ts + SPLIT_STRING + ts;
         // Begin timestamp and end timestamp are identical since it is a 
transaction
         return new LSMComponentFileReferences(createFlushFile(baseName + 
SPLIT_STRING + BTREE_STRING), null,
-                createFlushFile(baseName + SPLIT_STRING + 
BLOOM_FILTER_STRING));
+                createFlushFile(baseName + SPLIT_STRING + 
BLOOM_FILTER_STRING), null);
     }
 
     @Override
@@ -220,6 +224,6 @@
         FileReference bTreeFileRef = new FileReference(bTreeFile);
         FileReference bloomFilterFileRef = new FileReference(bloomFilterFile);
 
-        return new LSMComponentFileReferences(bTreeFileRef, null, 
bloomFilterFileRef);
+        return new LSMComponentFileReferences(bTreeFileRef, null, 
bloomFilterFileRef, null);
     }
 }
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFlushOperation.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFlushOperation.java
index c56293f..9035c07 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFlushOperation.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFlushOperation.java
@@ -18,87 +18,42 @@
  */
 package org.apache.hyracks.storage.am.lsm.btree.impls;
 
-import java.util.Collections;
-import java.util.HashSet;
 import java.util.Set;
 
-import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IODeviceHandle;
-import org.apache.hyracks.storage.am.common.api.IndexException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessorInternal;
+import 
org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMFlushOperation;
 
-public class LSMBTreeFlushOperation implements ILSMIOOperation, 
Comparable<LSMBTreeFlushOperation> {
+public class LSMBTreeFlushOperation extends AbstractLSMFlushOperation 
implements Comparable<LSMBTreeFlushOperation> {
 
-    private final ILSMIndexAccessorInternal accessor;
-    private final ILSMComponent flushingComponent;
     private final FileReference btreeFlushTarget;
-    private final FileReference bloomFilterFlushTarget;
-    private final ILSMIOOperationCallback callback;
-    private final String indexIdentifier;
+    private final FileReference statisticsFlushTarget;
 
     public LSMBTreeFlushOperation(ILSMIndexAccessorInternal accessor, 
ILSMComponent flushingComponent,
-            FileReference btreeFlushTarget, FileReference 
bloomFilterFlushTarget, ILSMIOOperationCallback callback,
-            String indexIdentifier) {
-        this.accessor = accessor;
-        this.flushingComponent = flushingComponent;
+            FileReference btreeFlushTarget, FileReference 
bloomFilterFlushTarget, FileReference statisticsFlushTarget,
+            ILSMIOOperationCallback callback, String indexIdentifier) {
+        super(accessor, flushingComponent, bloomFilterFlushTarget, callback, 
indexIdentifier);
         this.btreeFlushTarget = btreeFlushTarget;
-        this.bloomFilterFlushTarget = bloomFilterFlushTarget;
-        this.callback = callback;
-        this.indexIdentifier = indexIdentifier;
-    }
-
-    @Override
-    public Set<IODeviceHandle> getReadDevices() {
-        return Collections.emptySet();
+        this.statisticsFlushTarget = statisticsFlushTarget;
     }
 
     @Override
     public Set<IODeviceHandle> getWriteDevices() {
-        Set<IODeviceHandle> devs = new HashSet<IODeviceHandle>();
+        Set<IODeviceHandle> devs = super.getWriteDevices();
         devs.add(btreeFlushTarget.getDeviceHandle());
-        devs.add(bloomFilterFlushTarget.getDeviceHandle());
+        devs.add(statisticsFlushTarget.getDeviceHandle());
         return devs;
-    }
-
-    @Override
-    public Boolean call() throws HyracksDataException, IndexException {
-        accessor.flush(this);
-        return true;
-    }
-
-    @Override
-    public ILSMIOOperationCallback getCallback() {
-        return callback;
     }
 
     public FileReference getBTreeFlushTarget() {
         return btreeFlushTarget;
     }
 
-    public FileReference getBloomFilterFlushTarget() {
-        return bloomFilterFlushTarget;
-    }
-
-    public ILSMIndexAccessorInternal getAccessor() {
-        return accessor;
-    }
-
-    public ILSMComponent getFlushingComponent() {
-        return flushingComponent;
-    }
-
-    @Override
-    public String getIndexUniqueIdentifier() {
-        return indexIdentifier;
-    }
-
-    @Override
-    public LSMIOOpertionType getIOOpertionType() {
-        return LSMIOOpertionType.FLUSH;
+    public FileReference getStatisticsTarget() {
+        return statisticsFlushTarget;
     }
 
     @Override
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMergeOperation.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMergeOperation.java
index f69a77f..6b69021 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMergeOperation.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMergeOperation.java
@@ -19,95 +19,54 @@
 
 package org.apache.hyracks.storage.am.lsm.btree.impls;
 
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IODeviceHandle;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
-import org.apache.hyracks.storage.am.common.api.IndexException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessorInternal;
+import 
org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMMergeOperation;
 
-public class LSMBTreeMergeOperation implements ILSMIOOperation {
+public class LSMBTreeMergeOperation extends AbstractLSMMergeOperation 
implements ILSMIOOperation {
 
-    private final ILSMIndexAccessorInternal accessor;
-    private final List<ILSMComponent> mergingComponents;
-    private final ITreeIndexCursor cursor;
     private final FileReference btreeMergeTarget;
-    private final FileReference bloomFilterMergeTarget;
-    private final ILSMIOOperationCallback callback;
-    private final String indexIdentifier;
+    private final FileReference statisticsMergeTarget;
 
     public LSMBTreeMergeOperation(ILSMIndexAccessorInternal accessor, 
List<ILSMComponent> mergingComponents,
             ITreeIndexCursor cursor, FileReference btreeMergeTarget, 
FileReference bloomFilterMergeTarget,
-            ILSMIOOperationCallback callback, String indexIdentifier) {
-        this.accessor = accessor;
-        this.mergingComponents = mergingComponents;
-        this.cursor = cursor;
+            FileReference statisticsMergeTarget, ILSMIOOperationCallback 
callback, String indexIdentifier) {
+        super(accessor, mergingComponents, cursor, bloomFilterMergeTarget, 
callback, indexIdentifier);
         this.btreeMergeTarget = btreeMergeTarget;
-        this.bloomFilterMergeTarget = bloomFilterMergeTarget;
-        this.callback = callback;
-        this.indexIdentifier = indexIdentifier;
+        this.statisticsMergeTarget = statisticsMergeTarget;
     }
 
     @Override
     public Set<IODeviceHandle> getReadDevices() {
-        Set<IODeviceHandle> devs = new HashSet<IODeviceHandle>();
+        Set<IODeviceHandle> devs = super.getReadDevices();
         for (ILSMComponent o : mergingComponents) {
             LSMBTreeDiskComponent component = (LSMBTreeDiskComponent) o;
             
devs.add(component.getBTree().getFileReference().getDeviceHandle());
-            
devs.add(component.getBloomFilter().getFileReference().getDeviceHandle());
         }
         return devs;
     }
 
     @Override
     public Set<IODeviceHandle> getWriteDevices() {
-        Set<IODeviceHandle> devs = new HashSet<IODeviceHandle>();
+        Set<IODeviceHandle> devs = super.getWriteDevices();
         devs.add(btreeMergeTarget.getDeviceHandle());
-        devs.add(bloomFilterMergeTarget.getDeviceHandle());
+        devs.add(statisticsMergeTarget.getDeviceHandle());
         return devs;
-    }
-
-    @Override
-    public Boolean call() throws HyracksDataException, IndexException {
-        accessor.merge(this);
-        return true;
-    }
-
-    @Override
-    public ILSMIOOperationCallback getCallback() {
-        return callback;
     }
 
     public FileReference getBTreeMergeTarget() {
         return btreeMergeTarget;
     }
 
-    public FileReference getBloomFilterMergeTarget() {
-        return bloomFilterMergeTarget;
-    }
-
-    public ITreeIndexCursor getCursor() {
-        return cursor;
-    }
-
-    public List<ILSMComponent> getMergingComponents() {
-        return mergingComponents;
-    }
-
-    @Override
-    public String getIndexUniqueIdentifier() {
-        return indexIdentifier;
-    }
-
-    @Override
-    public LSMIOOpertionType getIOOpertionType() {
-        return LSMIOOpertionType.MERGE;
+    public FileReference getStatisticsMergeTarget() {
+        return statisticsMergeTarget;
     }
 }
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
index 8d442d6..41cabea 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
@@ -40,6 +40,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMTreeTupleReference;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractDiskLSMComponent;
 import 
org.apache.hyracks.storage.am.lsm.common.impls.BloomFilterAwareBTreePointSearchCursor;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 import org.apache.hyracks.storage.common.buffercache.ICachedPage;
@@ -166,7 +167,7 @@
                 btree = (BTree) ((LSMBTreeMemoryComponent) 
component).getBTree();
             } else {
                 rangeCursors[i] = new 
BloomFilterAwareBTreePointSearchCursor(leafFrame, false,
-                        ((LSMBTreeDiskComponent) component).getBloomFilter());
+                        ((AbstractDiskLSMComponent) 
component).getBloomFilter());
                 btree = (BTree) ((LSMBTreeDiskComponent) component).getBTree();
             }
             btreeAccessors[i] = 
btree.createAccessor(NoOpOperationCallback.INSTANCE, 
NoOpOperationCallback.INSTANCE);
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponent.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponent.java
index 3845740..a9ea547 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponent.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyDiskComponent.java
@@ -27,12 +27,11 @@
 
     private final BTree btree;
     private final BTree buddyBtree;
-    private final BloomFilter bloomFilter;
 
     public LSMBTreeWithBuddyDiskComponent(BTree btree, BTree buddyBtree, 
BloomFilter bloomFilter) {
+        super(bloomFilter, null);
         this.btree = btree;
         this.buddyBtree = buddyBtree;
-        this.bloomFilter = bloomFilter;
     }
 
     @Override
@@ -41,8 +40,7 @@
         btree.destroy();
         buddyBtree.deactivate();
         buddyBtree.destroy();
-        bloomFilter.deactivate();
-        bloomFilter.destroy();
+        super.destroy();
     }
 
     public BTree getBTree() {
@@ -53,15 +51,11 @@
         return buddyBtree;
     }
 
-    public BloomFilter getBloomFilter() {
-        return bloomFilter;
-    }
-
     @Override
     public long getComponentSize() {
-        long size = btree.getFileReference().getFile().length();
+        long size = super.getComponentSize();
+        size = btree.getFileReference().getFile().length();
         size += buddyBtree.getFileReference().getFile().length();
-        size += bloomFilter.getFileReference().getFile().length();
         return size;
     }
 
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java
index ed39630..5d45f08 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyFileManager.java
@@ -73,8 +73,9 @@
         String baseName = baseDir + ts + SPLIT_STRING + ts;
         // Begin timestamp and end timestamp are identical since it is a flush
         return new LSMComponentFileReferences(createFlushFile(baseName + 
SPLIT_STRING + BTREE_STRING),
-                createFlushFile(baseName + SPLIT_STRING + BUDDY_BTREE_STRING), 
createFlushFile(baseName + SPLIT_STRING
-                        + BLOOM_FILTER_STRING));
+                createFlushFile(baseName + SPLIT_STRING + BUDDY_BTREE_STRING),
+                createFlushFile(baseName + SPLIT_STRING + BLOOM_FILTER_STRING),
+                createFlushFile(baseName + SPLIT_STRING + STATISTICS_STRING));
     }
 
     @Override
@@ -87,8 +88,9 @@
         // Get the range of timestamps by taking the earliest and the latest
         // timestamps
         return new LSMComponentFileReferences(createMergeFile(baseName + 
SPLIT_STRING + BTREE_STRING),
-                createMergeFile(baseName + SPLIT_STRING + BUDDY_BTREE_STRING), 
createMergeFile(baseName + SPLIT_STRING
-                        + BLOOM_FILTER_STRING));
+                createMergeFile(baseName + SPLIT_STRING + BUDDY_BTREE_STRING),
+                createMergeFile(baseName + SPLIT_STRING + BLOOM_FILTER_STRING),
+                createFlushFile(baseName + SPLIT_STRING + STATISTICS_STRING));
     }
 
     @Override
@@ -127,7 +129,7 @@
 
         if (allBTreeFiles.size() == 1 && allBuddyBTreeFiles.size() == 1 && 
allBloomFilterFiles.size() == 1) {
             validFiles.add(new 
LSMComponentFileReferences(allBTreeFiles.get(0).fileRef,
-                    allBuddyBTreeFiles.get(0).fileRef, 
allBloomFilterFiles.get(0).fileRef));
+                    allBuddyBTreeFiles.get(0).fileRef, 
allBloomFilterFiles.get(0).fileRef, null));
             return validFiles;
         }
 
@@ -177,7 +179,8 @@
                 invalidBloomFilterFile.delete();
             } else {
                 // This scenario should not be possible.
-                throw new HyracksDataException("Found LSM files with 
overlapping but not contained timetamp intervals.");
+                throw new HyracksDataException(
+                        "Found LSM files with overlapping but not contained 
timetamp intervals.");
             }
         }
 
@@ -195,7 +198,7 @@
             ComparableFileName cmpBuddyBTreeFileName = 
buddyBtreeFileIter.next();
             ComparableFileName cmpBloomFilterFileName = 
bloomFilterFileIter.next();
             validFiles.add(new 
LSMComponentFileReferences(cmpBTreeFileName.fileRef, 
cmpBuddyBTreeFileName.fileRef,
-                    cmpBloomFilterFileName.fileRef));
+                    cmpBloomFilterFileName.fileRef, null));
         }
 
         return validFiles;
@@ -209,8 +212,8 @@
 
         String baseName = baseDir + ts + SPLIT_STRING + ts;
         return new LSMComponentFileReferences(createFlushFile(baseName + 
SPLIT_STRING + BTREE_STRING),
-                createFlushFile(baseName + SPLIT_STRING + BUDDY_BTREE_STRING), 
createFlushFile(baseName + SPLIT_STRING
-                        + BLOOM_FILTER_STRING));
+                createFlushFile(baseName + SPLIT_STRING + BUDDY_BTREE_STRING),
+                createFlushFile(baseName + SPLIT_STRING + 
BLOOM_FILTER_STRING), null);
     }
 
     @Override
@@ -229,8 +232,8 @@
             // get the actual transaction files
             files = dir.list(transactionFilter);
             if (files.length < 3) {
-                throw new HyracksDataException("LSM Btree with buddy 
transaction has less than 3 files :"
-                        + files.length);
+                throw new HyracksDataException(
+                        "LSM Btree with buddy transaction has less than 3 
files :" + files.length);
             }
             try {
                 Files.delete(Paths.get(txnFileName));
@@ -255,7 +258,7 @@
         FileReference bTreeFileRef = new FileReference(bTreeFile);
         FileReference buddyBTreeFileRef = new FileReference(buddyBTreeFile);
         FileReference bloomFilterFileRef = new FileReference(bloomFilterFile);
-        return new LSMComponentFileReferences(bTreeFileRef, buddyBTreeFileRef, 
bloomFilterFileRef);
+        return new LSMComponentFileReferences(bTreeFileRef, buddyBTreeFileRef, 
bloomFilterFileRef, null);
     }
 
 }
diff --git 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java
 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java
index 61f68fb..c5fcc23 100644
--- 
a/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java
+++ 
b/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java
@@ -22,115 +22,55 @@
 import java.util.List;
 import java.util.Set;
 
-import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IODeviceHandle;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
-import org.apache.hyracks.storage.am.common.api.IndexException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessorInternal;
 
-public class LSMBTreeWithBuddyMergeOperation implements ILSMIOOperation {
+public class LSMBTreeWithBuddyMergeOperation extends LSMBTreeMergeOperation {
 
-       private final ILSMIndexAccessorInternal accessor;
-       private final List<ILSMComponent> mergingComponents;
-       private final ITreeIndexCursor cursor;
-       private final FileReference btreeMergeTarget;
-       private final FileReference buddyBtreeMergeTarget;
-       private final FileReference bloomFilterMergeTarget;
-       private final ILSMIOOperationCallback callback;
-       private final String indexIdentifier;
-       private final boolean keepDeletedTuples;
+    private final FileReference buddyBtreeMergeTarget;
+    private final boolean keepDeletedTuples;
 
-       public LSMBTreeWithBuddyMergeOperation(ILSMIndexAccessorInternal 
accessor,
-                       List<ILSMComponent> mergingComponents, ITreeIndexCursor 
cursor,
-                       FileReference btreeMergeTarget,
-                       FileReference buddyBtreeMergeTarget,
-                       FileReference bloomFilterMergeTarget,
-                       ILSMIOOperationCallback callback, String 
indexIdentifier, boolean keepDeletedTuples) {
-               this.accessor = accessor;
-               this.mergingComponents = mergingComponents;
-               this.cursor = cursor;
-               this.btreeMergeTarget = btreeMergeTarget;
-               this.buddyBtreeMergeTarget = buddyBtreeMergeTarget;
-               this.bloomFilterMergeTarget = bloomFilterMergeTarget;
-               this.callback = callback;
-               this.indexIdentifier = indexIdentifier;
-               this.keepDeletedTuples = keepDeletedTuples;
-       }
+    public LSMBTreeWithBuddyMergeOperation(ILSMIndexAccessorInternal accessor, 
List<ILSMComponent> mergingComponents,
+            ITreeIndexCursor cursor, FileReference btreeMergeTarget, 
FileReference buddyBtreeMergeTarget,
+            FileReference bloomFilterMergeTarget, FileReference 
statisticsMergeTarget, ILSMIOOperationCallback callback,
+            String indexIdentifier, boolean keepDeletedTuples) {
+        super(accessor, mergingComponents, cursor, btreeMergeTarget, 
bloomFilterMergeTarget, statisticsMergeTarget,
+                callback, indexIdentifier);
+        this.buddyBtreeMergeTarget = buddyBtreeMergeTarget;
+        this.keepDeletedTuples = keepDeletedTuples;
+    }
 
-       @Override
-       public Set<IODeviceHandle> getReadDevices() {
-               Set<IODeviceHandle> devs = new HashSet<IODeviceHandle>();
-               for (ILSMComponent o : mergingComponents) {
-                       LSMBTreeWithBuddyDiskComponent component = 
(LSMBTreeWithBuddyDiskComponent) o;
-                       
devs.add(component.getBTree().getFileReference().getDeviceHandle());
+    @Override
+    public Set<IODeviceHandle> getReadDevices() {
+        Set<IODeviceHandle> devs = new HashSet<IODeviceHandle>();
+        for (ILSMComponent o : mergingComponents) {
+            LSMBTreeWithBuddyDiskComponent component = 
(LSMBTreeWithBuddyDiskComponent) o;
+            
devs.add(component.getBTree().getFileReference().getDeviceHandle());
 
-                       devs.add(component.getBuddyBTree().getFileReference()
-                                       .getDeviceHandle());
-                       devs.add(component.getBloomFilter().getFileReference()
-                                       .getDeviceHandle());
+            
devs.add(component.getBuddyBTree().getFileReference().getDeviceHandle());
+            
devs.add(component.getBloomFilter().getFileReference().getDeviceHandle());
 
-               }
-               return devs;
-       }
+        }
+        return devs;
+    }
 
-       @Override
-       public Set<IODeviceHandle> getWriteDevices() {
-               Set<IODeviceHandle> devs = new HashSet<IODeviceHandle>();
-               devs.add(btreeMergeTarget.getDeviceHandle());
+    @Override
+    public Set<IODeviceHandle> getWriteDevices() {
+        Set<IODeviceHandle> devs = super.getWriteDevices();
+        devs.add(buddyBtreeMergeTarget.getDeviceHandle());
+        return devs;
+    }
 
-               devs.add(buddyBtreeMergeTarget.getDeviceHandle());
-               devs.add(bloomFilterMergeTarget.getDeviceHandle());
+    public FileReference getBuddyBTreeMergeTarget() {
+        return buddyBtreeMergeTarget;
+    }
 
-               return devs;
-       }
-
-       @Override
-       public Boolean call() throws HyracksDataException, IndexException {
-               accessor.merge(this);
-               return true;
-       }
-
-       @Override
-       public ILSMIOOperationCallback getCallback() {
-               return callback;
-       }
-
-       @Override
-       public String getIndexUniqueIdentifier() {
-               return indexIdentifier;
-       }
-
-       @Override
-       public LSMIOOpertionType getIOOpertionType() {
-               return LSMIOOpertionType.MERGE;
-       }
-
-       public FileReference getBTreeMergeTarget() {
-               return btreeMergeTarget;
-       }
-
-       public FileReference getBuddyBTreeMergeTarget() {
-               return buddyBtreeMergeTarget;
-       }
-
-       public FileReference getBloomFilterMergeTarget() {
-               return bloomFilterMergeTarget;
-       }
-
-       public ITreeIndexCursor getCursor() {
-               return cursor;
-       }
-
-       public List<ILSMComponent> getMergingComponents() {
-               return mergingComponents;
-       }
-
-       public boolean isKeepDeletedTuples() {
-               return keepDeletedTuples;
-       }
+    public boolean isKeepDeletedTuples() {
+        return keepDeletedTuples;
+    }
 
 }
diff --git 
a/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractDiskLSMComponent.java
 
b/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractDiskLSMComponent.java
index 54ec029..952440c 100644
--- 
a/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractDiskLSMComponent.java
+++ 
b/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractDiskLSMComponent.java
@@ -19,18 +19,22 @@
 package org.apache.hyracks.storage.am.lsm.common.impls;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.bloomfilter.impls.BloomFilter;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 
 public abstract class AbstractDiskLSMComponent extends AbstractLSMComponent {
 
-    public AbstractDiskLSMComponent(ILSMComponentFilter filter) {
+    protected final BloomFilter bloomFilter;
+
+    public AbstractDiskLSMComponent(BloomFilter bloomFilter, 
ILSMComponentFilter filter) {
         super(filter);
+        this.bloomFilter = bloomFilter;
         state = ComponentState.READABLE_UNWRITABLE;
     }
 
     public AbstractDiskLSMComponent() {
-        this(null);
+        this(null, null);
     }
 
     @Override
@@ -100,9 +104,18 @@
         return state;
     }
 
-    protected abstract void destroy() throws HyracksDataException;
+    public BloomFilter getBloomFilter() {
+        return bloomFilter;
+    }
 
-    public abstract long getComponentSize();
+    protected void destroy() throws HyracksDataException {
+        bloomFilter.deactivate();
+        bloomFilter.destroy();
+    }
+
+    public long getComponentSize() {
+        return bloomFilter.getFileReference().getFile().length();
+    }
 
     public abstract int getFileReferenceCount();
 
diff --git 
a/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
 
b/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
index 3ad1396..39ff3d0 100644
--- 
a/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
+++ 
b/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
@@ -49,6 +49,7 @@
     public static final String SPLIT_STRING = "_";
     protected static final String BLOOM_FILTER_STRING = "f";
     protected static final String TRANSACTION_PREFIX = ".T";
+    protected static final String STATISTICS_STRING = "s";
 
     protected final IFileMapProvider fileMapProvider;
 
@@ -117,8 +118,8 @@
     }
 
     protected void validateFiles(HashSet<String> groundTruth, 
ArrayList<ComparableFileName> validFiles,
-            FilenameFilter filter, TreeIndexFactory<? extends ITreeIndex> 
treeFactory) throws HyracksDataException,
-            IndexException {
+            FilenameFilter filter, TreeIndexFactory<? extends ITreeIndex> 
treeFactory)
+                    throws HyracksDataException, IndexException {
         ArrayList<ComparableFileName> tmpAllInvListsFiles = new 
ArrayList<ComparableFileName>();
         cleanupAndGetValidFilesInternal(filter, treeFactory, 
tmpAllInvListsFiles);
         for (ComparableFileName cmpFileName : tmpAllInvListsFiles) {
@@ -173,7 +174,7 @@
     public LSMComponentFileReferences getRelFlushFileReference() {
         String ts = getCurrentTimestamp();
         // Begin timestamp and end timestamp are identical since it is a flush
-        return new LSMComponentFileReferences(createFlushFile(baseDir + ts + 
SPLIT_STRING + ts), null, null);
+        return new LSMComponentFileReferences(createFlushFile(baseDir + ts + 
SPLIT_STRING + ts), null, null, null);
     }
 
     @Override
@@ -182,8 +183,9 @@
         String[] firstTimestampRange = firstFileName.split(SPLIT_STRING);
         String[] lastTimestampRange = lastFileName.split(SPLIT_STRING);
         // Get the range of timestamps by taking the earliest and the latest 
timestamps
-        return new LSMComponentFileReferences(createMergeFile(baseDir + 
firstTimestampRange[0] + SPLIT_STRING
-                + lastTimestampRange[1]), null, null);
+        return new LSMComponentFileReferences(
+                createMergeFile(baseDir + firstTimestampRange[0] + 
SPLIT_STRING + lastTimestampRange[1]), null, null,
+                null);
     }
 
     @Override
@@ -203,7 +205,7 @@
         }
 
         if (allFiles.size() == 1) {
-            validFiles.add(new 
LSMComponentFileReferences(allFiles.get(0).fileRef, null, null));
+            validFiles.add(new 
LSMComponentFileReferences(allFiles.get(0).fileRef, null, null, null));
             return validFiles;
         }
 
@@ -235,7 +237,7 @@
         // Sort valid files in reverse lexicographical order, such that newer 
files come first.
         Collections.sort(validComparableFiles, recencyCmp);
         for (ComparableFileName cmpFileName : validComparableFiles) {
-            validFiles.add(new LSMComponentFileReferences(cmpFileName.fileRef, 
null, null));
+            validFiles.add(new LSMComponentFileReferences(cmpFileName.fileRef, 
null, null, null));
         }
 
         return validFiles;
@@ -375,8 +377,8 @@
     };
 
     protected static FilenameFilter createTransactionFilter(String 
transactionFileName, final boolean inclusive) {
-        final String timeStamp = 
transactionFileName.substring(transactionFileName.indexOf(TRANSACTION_PREFIX)
-                + TRANSACTION_PREFIX.length());
+        final String timeStamp = transactionFileName
+                .substring(transactionFileName.indexOf(TRANSACTION_PREFIX) + 
TRANSACTION_PREFIX.length());
         return new FilenameFilter() {
             @Override
             public boolean accept(File dir, String name) {
diff --git 
a/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFileReferences.java
 
b/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFileReferences.java
index 95fddfc..baebf65 100644
--- 
a/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFileReferences.java
+++ 
b/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFileReferences.java
@@ -30,12 +30,15 @@
 
     // This FileReference for the bloom filter (if any). 
     private final FileReference bloomFilterFileReference;
+    // This FileReference for the component statistics (if any). 
+    private final FileReference statisticsFileReference;
 
     public LSMComponentFileReferences(FileReference insertIndexFileReference, 
FileReference deleteIndexFileReference,
-            FileReference bloomFilterFileReference) {
+            FileReference bloomFilterFileReference, FileReference 
statisticsFileReference) {
         this.insertIndexFileReference = insertIndexFileReference;
         this.deleteIndexFileReference = deleteIndexFileReference;
         this.bloomFilterFileReference = bloomFilterFileReference;
+        this.statisticsFileReference = statisticsFileReference;
     }
 
     public FileReference getInsertIndexFileReference() {
@@ -49,4 +52,8 @@
     public FileReference getBloomFilterFileReference() {
         return bloomFilterFileReference;
     }
+
+    public FileReference getStatisticsFileReference() {
+        return statisticsFileReference;
+    }
 }
diff --git 
a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
 
b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
index 28b96db..ad41c4e 100644
--- 
a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
+++ 
b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
@@ -46,6 +46,7 @@
 import org.apache.hyracks.storage.am.common.api.IModificationOperationCallback;
 import org.apache.hyracks.storage.am.common.api.ISearchOperationCallback;
 import org.apache.hyracks.storage.am.common.api.ISearchPredicate;
+import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.api.IVirtualFreePageManager;
 import org.apache.hyracks.storage.am.common.api.IndexException;
 import 
org.apache.hyracks.storage.am.common.exceptions.TreeIndexDuplicateKeyException;
@@ -109,14 +110,13 @@
             OnDiskInvertedIndexFactory diskInvIndexFactory, BTreeFactory 
deletedKeysBTreeFactory,
             BloomFilterFactory bloomFilterFactory, ILSMComponentFilterFactory 
filterFactory,
             ILSMComponentFilterFrameFactory filterFrameFactory, 
LSMComponentFilterManager filterManager,
-            double bloomFilterFalsePositiveRate, ILSMIndexFileManager 
fileManager,
-            IFileMapProvider diskFileMapProvider, ITypeTraits[] 
invListTypeTraits,
-            IBinaryComparatorFactory[] invListCmpFactories, ITypeTraits[] 
tokenTypeTraits,
-            IBinaryComparatorFactory[] tokenCmpFactories, 
IBinaryTokenizerFactory tokenizerFactory,
-            ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker, 
ILSMIOOperationScheduler ioScheduler,
-            ILSMIOOperationCallback ioOpCallback, int[] invertedIndexFields, 
int[] filterFields,
-            int[] filterFieldsForNonBulkLoadOps, int[] 
invertedIndexFieldsForNonBulkLoadOps, boolean durable)
-            throws IndexException {
+            double bloomFilterFalsePositiveRate, ILSMIndexFileManager 
fileManager, IFileMapProvider diskFileMapProvider,
+            ITypeTraits[] invListTypeTraits, IBinaryComparatorFactory[] 
invListCmpFactories,
+            ITypeTraits[] tokenTypeTraits, IBinaryComparatorFactory[] 
tokenCmpFactories,
+            IBinaryTokenizerFactory tokenizerFactory, ILSMMergePolicy 
mergePolicy, ILSMOperationTracker opTracker,
+            ILSMIOOperationScheduler ioScheduler, ILSMIOOperationCallback 
ioOpCallback, int[] invertedIndexFields,
+            int[] filterFields, int[] filterFieldsForNonBulkLoadOps, int[] 
invertedIndexFieldsForNonBulkLoadOps,
+            boolean durable) throws IndexException {
         super(virtualBufferCaches, diskInvIndexFactory.getBufferCache(), 
fileManager, diskFileMapProvider,
                 bloomFilterFalsePositiveRate, mergePolicy, opTracker, 
ioScheduler, ioOpCallback, filterFrameFactory,
                 filterManager, filterFields, durable);
@@ -137,13 +137,14 @@
         for (IVirtualBufferCache virtualBufferCache : virtualBufferCaches) {
             InMemoryInvertedIndex memInvIndex = 
createInMemoryInvertedIndex(virtualBufferCache,
                     new 
VirtualFreePageManager(virtualBufferCache.getNumPages()), i);
-            BTree deleteKeysBTree = BTreeUtils.createBTree(virtualBufferCache, 
new VirtualFreePageManager(
-                    virtualBufferCache.getNumPages()), 
virtualBufferCache.getFileMapProvider(), invListTypeTraits,
-                    invListCmpFactories, BTreeLeafFrameType.REGULAR_NSM,
+            BTree deleteKeysBTree = BTreeUtils.createBTree(virtualBufferCache,
+                    new 
VirtualFreePageManager(virtualBufferCache.getNumPages()),
+                    virtualBufferCache.getFileMapProvider(), 
invListTypeTraits, invListCmpFactories,
+                    BTreeLeafFrameType.REGULAR_NSM,
                     new FileReference(new File(fileManager.getBaseDir() + 
"_virtual_del_" + i)));
             LSMInvertedIndexMemoryComponent mutableComponent = new 
LSMInvertedIndexMemoryComponent(memInvIndex,
-                    deleteKeysBTree, virtualBufferCache, i == 0 ? true : 
false, filterFactory == null ? null
-                            : filterFactory.createLSMComponentFilter());
+                    deleteKeysBTree, virtualBufferCache, i == 0 ? true : false,
+                    filterFactory == null ? null : 
filterFactory.createLSMComponentFilter());
             memoryComponents.add(mutableComponent);
             ++i;
         }
@@ -396,8 +397,8 @@
         }
         if (ctx.filterTuple != null) {
             ctx.filterTuple.reset(tuple);
-            
memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter()
-                    .update(ctx.filterTuple, ctx.filterCmp);
+            
memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter().update(ctx.filterTuple,
+                    ctx.filterCmp);
         }
     }
 
@@ -418,9 +419,8 @@
                 IIndexAccessor invIndexAccessor = 
((LSMInvertedIndexMemoryComponent) component).getInvIndex()
                         .createAccessor(NoOpOperationCallback.INSTANCE, 
NoOpOperationCallback.INSTANCE);
                 indexAccessors.add(invIndexAccessor);
-                IIndexAccessor deletedKeysAccessor = 
((LSMInvertedIndexMemoryComponent) component)
-                        
.getDeletedKeysBTree().createAccessor(NoOpOperationCallback.INSTANCE,
-                                NoOpOperationCallback.INSTANCE);
+                IIndexAccessor deletedKeysAccessor = 
((LSMInvertedIndexMemoryComponent) component).getDeletedKeysBTree()
+                        .createAccessor(NoOpOperationCallback.INSTANCE, 
NoOpOperationCallback.INSTANCE);
                 deletedKeysBTreeAccessors.add(deletedKeysAccessor);
             } else {
                 IIndexAccessor invIndexAccessor = 
((LSMInvertedIndexDiskComponent) component).getInvIndex()
@@ -450,8 +450,8 @@
             initState = new LSMInvertedIndexSearchCursorInitialState(keyCmp, 
keysOnlyTuple, indexAccessors,
                     deletedKeysBTreeAccessors,
                     ((LSMInvertedIndexMemoryComponent) 
memoryComponents.get(currentMutableComponentId.get()))
-                            .getDeletedKeysBTree().getLeafFrameFactory(), 
ictx, includeMutableComponent, lsmHarness,
-                    operationalComponents);
+                            .getDeletedKeysBTree().getLeafFrameFactory(),
+                    ictx, includeMutableComponent, lsmHarness, 
operationalComponents);
         } else {
             LSMInvertedIndexMemoryComponent mutableComponent = 
(LSMInvertedIndexMemoryComponent) memoryComponents
                     .get(currentMutableComponentId.get());
@@ -459,8 +459,9 @@
             MultiComparator tokensAndKeysCmp = 
MultiComparator.create(memInvIndex.getBTree().getComparatorFactories());
             initState = new 
LSMInvertedIndexRangeSearchCursorInitialState(tokensAndKeysCmp, keyCmp, 
keysOnlyTuple,
                     ((LSMInvertedIndexMemoryComponent) 
memoryComponents.get(currentMutableComponentId.get()))
-                            .getDeletedKeysBTree().getLeafFrameFactory(), 
includeMutableComponent, lsmHarness,
-                    indexAccessors, deletedKeysBTreeAccessors, pred, 
operationalComponents);
+                            .getDeletedKeysBTree().getLeafFrameFactory(),
+                    includeMutableComponent, lsmHarness, indexAccessors, 
deletedKeysBTreeAccessors, pred,
+                    operationalComponents);
         }
         return initState;
     }
@@ -488,8 +489,8 @@
         opCtx.setOperation(IndexOperation.FLUSH);
         opCtx.getComponentHolder().add(flushingComponent);
         ioScheduler.scheduleOperation(new LSMInvertedIndexFlushOperation(
-                new LSMInvertedIndexAccessor(lsmHarness, opCtx), 
flushingComponent, componentFileRefs
-                        .getInsertIndexFileReference(), 
componentFileRefs.getDeleteIndexFileReference(),
+                new LSMInvertedIndexAccessor(lsmHarness, opCtx), 
flushingComponent,
+                componentFileRefs.getInsertIndexFileReference(), 
componentFileRefs.getDeleteIndexFileReference(),
                 componentFileRefs.getBloomFilterFileReference(), callback, 
fileManager.getBaseDir()));
     }
 
@@ -500,7 +501,7 @@
         // Create an inverted index instance to be bulk loaded.
         LSMInvertedIndexDiskComponent component = 
createDiskInvIndexComponent(componentFactory,
                 flushOp.getDictBTreeFlushTarget(), 
flushOp.getDeletedKeysBTreeFlushTarget(),
-                flushOp.getBloomFilterFlushTarget(), true);
+                flushOp.getBloomFilterTarget(), true);
         IInvertedIndex diskInvertedIndex = component.getInvIndex();
 
         // Create a scan cursor on the BTree underlying the in-memory inverted 
index.
@@ -525,8 +526,8 @@
         }
         invIndexBulkLoader.end();
 
-        IIndexAccessor deletedKeysBTreeAccessor = 
flushingComponent.getDeletedKeysBTree().createAccessor(
-                NoOpOperationCallback.INSTANCE, 
NoOpOperationCallback.INSTANCE);
+        IIndexAccessor deletedKeysBTreeAccessor = 
flushingComponent.getDeletedKeysBTree()
+                .createAccessor(NoOpOperationCallback.INSTANCE, 
NoOpOperationCallback.INSTANCE);
         IIndexCursor btreeCountingCursor = ((BTreeAccessor) 
deletedKeysBTreeAccessor).createCountingSearchCursor();
         deletedKeysBTreeAccessor.search(btreeCountingCursor, nullPred);
         long numBTreeTuples = 0L;
@@ -585,10 +586,11 @@
     @Override
     public void scheduleMerge(ILSMIndexOperationContext ctx, 
ILSMIOOperationCallback callback)
             throws HyracksDataException, IndexException {
-        LSMInvertedIndexOpContext ictx = 
createOpContext(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        LSMInvertedIndexOpContext ictx = 
createOpContext(NoOpOperationCallback.INSTANCE,
+                NoOpOperationCallback.INSTANCE);
         ictx.setOperation(IndexOperation.MERGE);
         List<ILSMComponent> mergingComponents = ctx.getComponentHolder();
-        IIndexCursor cursor = new LSMInvertedIndexRangeSearchCursor(ictx);
+        ITreeIndexCursor cursor = new LSMInvertedIndexRangeSearchCursor(ictx);
 
         LSMInvertedIndexDiskComponent firstComponent = 
(LSMInvertedIndexDiskComponent) mergingComponents.get(0);
         OnDiskInvertedIndex firstInvIndex = (OnDiskInvertedIndex) 
firstComponent.getInvIndex();
@@ -620,7 +622,7 @@
         // Create an inverted index instance.
         LSMInvertedIndexDiskComponent component = 
createDiskInvIndexComponent(componentFactory,
                 mergeOp.getDictBTreeMergeTarget(), 
mergeOp.getDeletedKeysBTreeMergeTarget(),
-                mergeOp.getBloomFilterMergeTarget(), true);
+                mergeOp.getBloomFilterTarget(), true);
 
         IInvertedIndex mergedDiskInvertedIndex = component.getInvIndex();
 
@@ -806,11 +808,10 @@
     }
 
     protected LSMInvertedIndexDiskComponent 
createDiskInvIndexComponent(ILSMComponentFactory factory,
-            FileReference dictBTreeFileRef, FileReference btreeFileRef, 
FileReference bloomFilterFileRef, boolean create)
-            throws HyracksDataException, IndexException {
-        LSMInvertedIndexDiskComponent component = 
(LSMInvertedIndexDiskComponent) factory
-                .createLSMComponentInstance(new 
LSMComponentFileReferences(dictBTreeFileRef, btreeFileRef,
-                        bloomFilterFileRef));
+            FileReference dictBTreeFileRef, FileReference btreeFileRef, 
FileReference bloomFilterFileRef,
+            boolean create) throws HyracksDataException, IndexException {
+        LSMInvertedIndexDiskComponent component = 
(LSMInvertedIndexDiskComponent) factory.createLSMComponentInstance(
+                new LSMComponentFileReferences(dictBTreeFileRef, btreeFileRef, 
bloomFilterFileRef, null));
         if (create) {
             component.getInvIndex().create();
             component.getDeletedKeysBTree().create();
diff --git 
a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexDiskComponent.java
 
b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexDiskComponent.java
index 799a3da..0539c0a 100644
--- 
a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexDiskComponent.java
+++ 
b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexDiskComponent.java
@@ -30,14 +30,12 @@
 
     private final IInvertedIndex invIndex;
     private final BTree deletedKeysBTree;
-    private final BloomFilter bloomFilter;
 
     public LSMInvertedIndexDiskComponent(IInvertedIndex invIndex, BTree 
deletedKeysBTree, BloomFilter bloomFilter,
             ILSMComponentFilter filter) {
-        super(filter);
+        super(bloomFilter, filter);
         this.invIndex = invIndex;
         this.deletedKeysBTree = deletedKeysBTree;
-        this.bloomFilter = bloomFilter;
     }
 
     @Override
@@ -46,8 +44,7 @@
         invIndex.destroy();
         deletedKeysBTree.deactivate();
         deletedKeysBTree.destroy();
-        bloomFilter.deactivate();
-        bloomFilter.destroy();
+        super.destroy();
     }
 
     public IInvertedIndex getInvIndex() {
@@ -58,16 +55,11 @@
         return deletedKeysBTree;
     }
 
-    public BloomFilter getBloomFilter() {
-        return bloomFilter;
-    }
-
     @Override
     public long getComponentSize() {
-        return ((OnDiskInvertedIndex) 
invIndex).getInvListsFile().getFile().length()
+        return super.getComponentSize() + ((OnDiskInvertedIndex) 
invIndex).getInvListsFile().getFile().length()
                 + ((OnDiskInvertedIndex) 
invIndex).getBTree().getFileReference().getFile().length()
-                + deletedKeysBTree.getFileReference().getFile().length()
-                + bloomFilter.getFileReference().getFile().length();
+                + deletedKeysBTree.getFileReference().getFile().length();
     }
 
     @Override
diff --git 
a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
 
b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
index 6c699da..f0c047f 100644
--- 
a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
+++ 
b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFileManager.java
@@ -66,7 +66,8 @@
         }
     };
 
-    public LSMInvertedIndexFileManager(IFileMapProvider fileMapProvider, 
FileReference file, BTreeFactory btreeFactory) {
+    public LSMInvertedIndexFileManager(IFileMapProvider fileMapProvider, 
FileReference file,
+            BTreeFactory btreeFactory) {
         super(fileMapProvider, file, null);
         this.btreeFactory = btreeFactory;
     }
@@ -77,8 +78,8 @@
         String baseName = baseDir + ts + SPLIT_STRING + ts;
         // Begin timestamp and end timestamp are identical since it is a flush
         return new LSMComponentFileReferences(createFlushFile(baseName + 
SPLIT_STRING + DICT_BTREE_SUFFIX),
-                createFlushFile(baseName + SPLIT_STRING + 
DELETED_KEYS_BTREE_SUFFIX), createFlushFile(baseName
-                        + SPLIT_STRING + BLOOM_FILTER_STRING));
+                createFlushFile(baseName + SPLIT_STRING + 
DELETED_KEYS_BTREE_SUFFIX),
+                createFlushFile(baseName + SPLIT_STRING + 
BLOOM_FILTER_STRING), null);
     }
 
     @Override
@@ -90,8 +91,8 @@
         String baseName = baseDir + firstTimestampRange[0] + SPLIT_STRING + 
lastTimestampRange[1];
         // Get the range of timestamps by taking the earliest and the latest 
timestamps
         return new LSMComponentFileReferences(createMergeFile(baseName + 
SPLIT_STRING + DICT_BTREE_SUFFIX),
-                createMergeFile(baseName + SPLIT_STRING + 
DELETED_KEYS_BTREE_SUFFIX), createMergeFile(baseName
-                        + SPLIT_STRING + BLOOM_FILTER_STRING));
+                createMergeFile(baseName + SPLIT_STRING + 
DELETED_KEYS_BTREE_SUFFIX),
+                createMergeFile(baseName + SPLIT_STRING + 
BLOOM_FILTER_STRING), null);
     }
 
     @Override
@@ -131,8 +132,8 @@
 
         if (allDictBTreeFiles.size() == 1 && allInvListsFiles.size() == 1 && 
allDeletedKeysBTreeFiles.size() == 1
                 && allBloomFilterFiles.size() == 1) {
-            validFiles.add(new 
LSMComponentFileReferences(allDictBTreeFiles.get(0).fileRef, 
allDeletedKeysBTreeFiles
-                    .get(0).fileRef, allBloomFilterFiles.get(0).fileRef));
+            validFiles.add(new 
LSMComponentFileReferences(allDictBTreeFiles.get(0).fileRef,
+                    allDeletedKeysBTreeFiles.get(0).fileRef, 
allBloomFilterFiles.get(0).fileRef, null));
             return validFiles;
         }
 
@@ -182,7 +183,8 @@
                 invalidBloomFilterFile.delete();
             } else {
                 // This scenario should not be possible.
-                throw new HyracksDataException("Found LSM files with 
overlapping but not contained timetamp intervals.");
+                throw new HyracksDataException(
+                        "Found LSM files with overlapping but not contained 
timetamp intervals.");
             }
         }
 
@@ -200,7 +202,7 @@
             ComparableFileName cmpDeletedKeysBTreeFile = 
deletedKeysBTreeIter.next();
             ComparableFileName cmpBloomFilterFileName = 
bloomFilterFileIter.next();
             validFiles.add(new 
LSMComponentFileReferences(cmpDictBTreeFile.fileRef, 
cmpDeletedKeysBTreeFile.fileRef,
-                    cmpBloomFilterFileName.fileRef));
+                    cmpBloomFilterFileName.fileRef, null));
         }
 
         return validFiles;
diff --git 
a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFlushOperation.java
 
b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFlushOperation.java
index b38d23a..5aff65d 100644
--- 
a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFlushOperation.java
+++ 
b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFlushOperation.java
@@ -19,64 +19,36 @@
 
 package org.apache.hyracks.storage.am.lsm.invertedindex.impls;
 
-import java.util.Collections;
-import java.util.HashSet;
 import java.util.Set;
 
-import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IODeviceHandle;
-import org.apache.hyracks.storage.am.common.api.IndexException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessorInternal;
+import 
org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMFlushOperation;
 
-public class LSMInvertedIndexFlushOperation implements ILSMIOOperation, 
Comparable<LSMInvertedIndexFlushOperation> {
-    private final ILSMIndexAccessorInternal accessor;
-    private final ILSMComponent flushingComponent;
+public class LSMInvertedIndexFlushOperation extends AbstractLSMFlushOperation
+        implements Comparable<LSMInvertedIndexFlushOperation> {
+
     private final FileReference dictBTreeFlushTarget;
     private final FileReference deletedKeysBTreeFlushTarget;
-    private final FileReference bloomFilterFlushTarget;
-    private final ILSMIOOperationCallback callback;
-    private final String indexIdentifier;
 
     public LSMInvertedIndexFlushOperation(ILSMIndexAccessorInternal accessor, 
ILSMComponent flushingComponent,
             FileReference dictBTreeFlushTarget, FileReference 
deletedKeysBTreeFlushTarget,
             FileReference bloomFilterFlushTarget, ILSMIOOperationCallback 
callback, String indexIdentifier) {
-        this.accessor = accessor;
-        this.flushingComponent = flushingComponent;
+        super(accessor, flushingComponent, bloomFilterFlushTarget, callback, 
indexIdentifier);
         this.dictBTreeFlushTarget = dictBTreeFlushTarget;
         this.deletedKeysBTreeFlushTarget = deletedKeysBTreeFlushTarget;
-        this.bloomFilterFlushTarget = bloomFilterFlushTarget;
-        this.callback = callback;
-        this.indexIdentifier = indexIdentifier;
-    }
-
-    @Override
-    public Set<IODeviceHandle> getReadDevices() {
-        return Collections.emptySet();
     }
 
     @Override
     public Set<IODeviceHandle> getWriteDevices() {
-        Set<IODeviceHandle> devs = new HashSet<IODeviceHandle>();
+        Set<IODeviceHandle> devs = super.getWriteDevices();
         devs.add(dictBTreeFlushTarget.getDeviceHandle());
         devs.add(deletedKeysBTreeFlushTarget.getDeviceHandle());
-        devs.add(bloomFilterFlushTarget.getDeviceHandle());
         return devs;
 
-    }
-
-    @Override
-    public Boolean call() throws HyracksDataException, IndexException {
-        accessor.flush(this);
-        return true;
-    }
-
-    @Override
-    public ILSMIOOperationCallback getCallback() {
-        return callback;
     }
 
     public FileReference getDictBTreeFlushTarget() {
@@ -85,24 +57,6 @@
 
     public FileReference getDeletedKeysBTreeFlushTarget() {
         return deletedKeysBTreeFlushTarget;
-    }
-
-    public FileReference getBloomFilterFlushTarget() {
-        return bloomFilterFlushTarget;
-    }
-
-    public ILSMComponent getFlushingComponent() {
-        return flushingComponent;
-    }
-
-    @Override
-    public String getIndexUniqueIdentifier() {
-        return indexIdentifier;
-    }
-
-    @Override
-    public LSMIOOpertionType getIOOpertionType() {
-        return LSMIOOpertionType.FLUSH;
     }
 
     @Override
diff --git 
a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexMergeOperation.java
 
b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexMergeOperation.java
index 0a368c6..2abd0a0 100644
--- 
a/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexMergeOperation.java
+++ 
b/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexMergeOperation.java
@@ -19,75 +19,48 @@
 
 package org.apache.hyracks.storage.am.lsm.invertedindex.impls;
 
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IODeviceHandle;
-import org.apache.hyracks.storage.am.common.api.IIndexCursor;
-import org.apache.hyracks.storage.am.common.api.IndexException;
+import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessorInternal;
+import 
org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMMergeOperation;
 import 
org.apache.hyracks.storage.am.lsm.invertedindex.ondisk.OnDiskInvertedIndex;
 
-public class LSMInvertedIndexMergeOperation implements ILSMIOOperation {
-    private final ILSMIndexAccessorInternal accessor;
-    private final List<ILSMComponent> mergingComponents;
-    private final IIndexCursor cursor;
+public class LSMInvertedIndexMergeOperation extends AbstractLSMMergeOperation {
     private final FileReference dictBTreeMergeTarget;
     private final FileReference deletedKeysBTreeMergeTarget;
-    private final FileReference bloomFilterMergeTarget;
-    private final ILSMIOOperationCallback callback;
-    private final String indexIdentifier;
 
     public LSMInvertedIndexMergeOperation(ILSMIndexAccessorInternal accessor, 
List<ILSMComponent> mergingComponents,
-            IIndexCursor cursor, FileReference dictBTreeMergeTarget, 
FileReference deletedKeysBTreeMergeTarget,
+            ITreeIndexCursor cursor, FileReference dictBTreeMergeTarget, 
FileReference deletedKeysBTreeMergeTarget,
             FileReference bloomFilterMergeTarget, ILSMIOOperationCallback 
callback, String indexIdentifier) {
-        this.accessor = accessor;
-        this.mergingComponents = mergingComponents;
-        this.cursor = cursor;
+        super(accessor, mergingComponents, cursor, bloomFilterMergeTarget, 
callback, indexIdentifier);
         this.dictBTreeMergeTarget = dictBTreeMergeTarget;
         this.deletedKeysBTreeMergeTarget = deletedKeysBTreeMergeTarget;
-        this.bloomFilterMergeTarget = bloomFilterMergeTarget;
-        this.callback = callback;
-        this.indexIdentifier = indexIdentifier;
     }
 
     @Override
     public Set<IODeviceHandle> getReadDevices() {
-        Set<IODeviceHandle> devs = new HashSet<IODeviceHandle>();
+        Set<IODeviceHandle> devs = super.getReadDevices();
         for (Object o : mergingComponents) {
             LSMInvertedIndexDiskComponent component = 
(LSMInvertedIndexDiskComponent) o;
             OnDiskInvertedIndex invIndex = (OnDiskInvertedIndex) 
component.getInvIndex();
             devs.add(invIndex.getBTree().getFileReference().getDeviceHandle());
             
devs.add(component.getDeletedKeysBTree().getFileReference().getDeviceHandle());
-            
devs.add(component.getBloomFilter().getFileReference().getDeviceHandle());
         }
         return devs;
     }
 
     @Override
     public Set<IODeviceHandle> getWriteDevices() {
-        Set<IODeviceHandle> devs = new HashSet<IODeviceHandle>();
+        Set<IODeviceHandle> devs = super.getWriteDevices();
         devs.add(dictBTreeMergeTarget.getDeviceHandle());
         devs.add(deletedKeysBTreeMergeTarget.getDeviceHandle());
-        devs.add(bloomFilterMergeTarget.getDeviceHandle());
         return devs;
-    }
-
-    @Override
-    public Boolean call() throws HyracksDataException, IndexException {
-        accessor.merge(this);
-        return true;
-    }
-
-    @Override
-    public ILSMIOOperationCallback getCallback() {
-        return callback;
     }
 
     public FileReference getDictBTreeMergeTarget() {
@@ -98,25 +71,4 @@
         return deletedKeysBTreeMergeTarget;
     }
 
-    public FileReference getBloomFilterMergeTarget() {
-        return bloomFilterMergeTarget;
-    }
-
-    public IIndexCursor getCursor() {
-        return cursor;
-    }
-
-    public List<ILSMComponent> getMergingComponents() {
-        return mergingComponents;
-    }
-
-    @Override
-    public String getIndexUniqueIdentifier() {
-        return indexIdentifier;
-    }
-
-    @Override
-    public LSMIOOpertionType getIOOpertionType() {
-        return LSMIOOpertionType.MERGE;
-    }
 }
\ No newline at end of file
diff --git 
a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java
 
b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java
index 533dfac..540ac0f 100644
--- 
a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java
+++ 
b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java
@@ -101,15 +101,15 @@
         for (IVirtualBufferCache virtualBufferCache : virtualBufferCaches) {
             RTree memRTree = new RTree(virtualBufferCache, 
virtualBufferCache.getFileMapProvider(),
                     new 
VirtualFreePageManager(virtualBufferCache.getNumPages()), 
rtreeInteriorFrameFactory,
-                    rtreeLeafFrameFactory, rtreeCmpFactories, fieldCount, new 
FileReference(new File(
-                            fileManager.getBaseDir() + "_virtual_r_" + i)));
+                    rtreeLeafFrameFactory, rtreeCmpFactories, fieldCount,
+                    new FileReference(new File(fileManager.getBaseDir() + 
"_virtual_r_" + i)));
             BTree memBTree = new BTree(virtualBufferCache, 
virtualBufferCache.getFileMapProvider(),
                     new 
VirtualFreePageManager(virtualBufferCache.getNumPages()), 
btreeInteriorFrameFactory,
-                    btreeLeafFrameFactory, btreeCmpFactories, 
btreeCmpFactories.length, new FileReference(new File(
-                            fileManager.getBaseDir() + "_virtual_b_" + i)));
+                    btreeLeafFrameFactory, btreeCmpFactories, 
btreeCmpFactories.length,
+                    new FileReference(new File(fileManager.getBaseDir() + 
"_virtual_b_" + i)));
             LSMRTreeMemoryComponent mutableComponent = new 
LSMRTreeMemoryComponent(memRTree, memBTree,
-                    virtualBufferCache, i == 0 ? true : false, filterFactory 
== null ? null
-                            : filterFactory.createLSMComponentFilter());
+                    virtualBufferCache, i == 0 ? true : false,
+                    filterFactory == null ? null : 
filterFactory.createLSMComponentFilter());
             memoryComponents.add(mutableComponent);
             ++i;
         }
@@ -309,11 +309,10 @@
 
     protected LSMRTreeDiskComponent createDiskComponent(ILSMComponentFactory 
factory, FileReference insertFileRef,
             FileReference deleteFileRef, FileReference bloomFilterFileRef, 
boolean createComponent)
-            throws HyracksDataException, IndexException {
+                    throws HyracksDataException, IndexException {
         // Create new tree instance.
-        LSMRTreeDiskComponent component = (LSMRTreeDiskComponent) factory
-                .createLSMComponentInstance(new 
LSMComponentFileReferences(insertFileRef, deleteFileRef,
-                        bloomFilterFileRef));
+        LSMRTreeDiskComponent component = (LSMRTreeDiskComponent) 
factory.createLSMComponentInstance(
+                new LSMComponentFileReferences(insertFileRef, deleteFileRef, 
bloomFilterFileRef, null));
         if (createComponent) {
             component.getRTree().create();
             if (component.getBTree() != null) {
@@ -407,8 +406,8 @@
         }
         if (ctx.filterTuple != null) {
             ctx.filterTuple.reset(tuple);
-            
memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter()
-                    .update(ctx.filterTuple, ctx.filterCmp);
+            
memoryComponents.get(currentMutableComponentId.get()).getLSMComponentFilter().update(ctx.filterTuple,
+                    ctx.filterCmp);
         }
     }
 
diff --git 
a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
 
b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
index f5be6c8..d963a54 100644
--- 
a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
+++ 
b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
@@ -233,7 +233,7 @@
         SearchPredicate rtreeNullPredicate = new SearchPredicate(null, null);
         memRTreeAccessor.search(rtreeScanCursor, rtreeNullPredicate);
         LSMRTreeDiskComponent component = 
createDiskComponent(componentFactory, flushOp.getRTreeFlushTarget(),
-                flushOp.getBTreeFlushTarget(), 
flushOp.getBloomFilterFlushTarget(), true);
+                flushOp.getBTreeFlushTarget(), flushOp.getBloomFilterTarget(), 
true);
         RTree diskRTree = component.getRTree();
         IIndexBulkLoader rTreeBulkloader;
         ITreeIndexCursor cursor;
diff --git 
a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeDiskComponent.java
 
b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeDiskComponent.java
index 4e6952b..b839b2c 100644
--- 
a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeDiskComponent.java
+++ 
b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeDiskComponent.java
@@ -28,13 +28,11 @@
 public class LSMRTreeDiskComponent extends AbstractDiskLSMComponent {
     private final RTree rtree;
     private final BTree btree;
-    private final BloomFilter bloomFilter;
 
     public LSMRTreeDiskComponent(RTree rtree, BTree btree, BloomFilter 
bloomFilter, ILSMComponentFilter filter) {
-        super(filter);
+        super(bloomFilter, filter);
         this.rtree = rtree;
         this.btree = btree;
-        this.bloomFilter = bloomFilter;
     }
 
     @Override
@@ -44,8 +42,7 @@
         if (btree != null) {
             btree.deactivate();
             btree.destroy();
-            bloomFilter.deactivate();
-            bloomFilter.destroy();
+            super.destroy();
         }
     }
 
@@ -57,16 +54,12 @@
         return btree;
     }
 
-    public BloomFilter getBloomFilter() {
-        return bloomFilter;
-    }
-
     @Override
     public long getComponentSize() {
         long size = rtree.getFileReference().getFile().length();
         if (btree != null) {
             size += btree.getFileReference().getFile().length();
-            size += bloomFilter.getFileReference().getFile().length();
+            size += super.getComponentSize();
         }
         return size;
     }
diff --git 
a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
 
b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
index 4f50980..5eda83f 100644
--- 
a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
+++ 
b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFileManager.java
@@ -73,8 +73,8 @@
         String baseName = baseDir + ts + SPLIT_STRING + ts;
         // Begin timestamp and end timestamp are identical since it is a flush
         return new LSMComponentFileReferences(createFlushFile(baseName + 
SPLIT_STRING + RTREE_STRING),
-                createFlushFile(baseName + SPLIT_STRING + BTREE_STRING), 
createFlushFile(baseName + SPLIT_STRING
-                        + BLOOM_FILTER_STRING));
+                createFlushFile(baseName + SPLIT_STRING + BTREE_STRING),
+                createFlushFile(baseName + SPLIT_STRING + 
BLOOM_FILTER_STRING), null);
     }
 
     @Override
@@ -87,8 +87,8 @@
         // Get the range of timestamps by taking the earliest and the latest
         // timestamps
         return new LSMComponentFileReferences(createMergeFile(baseName + 
SPLIT_STRING + RTREE_STRING),
-                createMergeFile(baseName + SPLIT_STRING + BTREE_STRING), 
createMergeFile(baseName + SPLIT_STRING
-                        + BLOOM_FILTER_STRING));
+                createMergeFile(baseName + SPLIT_STRING + BTREE_STRING),
+                createMergeFile(baseName + SPLIT_STRING + 
BLOOM_FILTER_STRING), null);
     }
 
     @Override
@@ -109,7 +109,8 @@
             btreeFilesSet.add(cmpFileName.fileName.substring(0, index));
         }
         validateFiles(btreeFilesSet, allRTreeFiles, 
getCompoundFilter(transactionFilter, rtreeFilter), rtreeFactory);
-        validateFiles(btreeFilesSet, allBloomFilterFiles, 
getCompoundFilter(transactionFilter, bloomFilterFilter), null);
+        validateFiles(btreeFilesSet, allBloomFilterFiles, 
getCompoundFilter(transactionFilter, bloomFilterFilter),
+                null);
 
         // Sanity check.
         if (allRTreeFiles.size() != allBTreeFiles.size() || 
allBTreeFiles.size() != allBloomFilterFiles.size()) {
@@ -124,7 +125,7 @@
 
         if (allRTreeFiles.size() == 1 && allBTreeFiles.size() == 1 && 
allBloomFilterFiles.size() == 1) {
             validFiles.add(new 
LSMComponentFileReferences(allRTreeFiles.get(0).fileRef, 
allBTreeFiles.get(0).fileRef,
-                    allBloomFilterFiles.get(0).fileRef));
+                    allBloomFilterFiles.get(0).fileRef, null));
             return validFiles;
         }
 
@@ -174,7 +175,8 @@
                 invalidBloomFilterFile.delete();
             } else {
                 // This scenario should not be possible.
-                throw new HyracksDataException("Found LSM files with 
overlapping but not contained timetamp intervals.");
+                throw new HyracksDataException(
+                        "Found LSM files with overlapping but not contained 
timetamp intervals.");
             }
         }
 
@@ -192,7 +194,7 @@
             ComparableFileName cmpBTreeFileName = btreeFileIter.next();
             ComparableFileName cmpBloomFilterFileName = 
bloomFilterFileIter.next();
             validFiles.add(new 
LSMComponentFileReferences(cmpRTreeFileName.fileRef, cmpBTreeFileName.fileRef,
-                    cmpBloomFilterFileName.fileRef));
+                    cmpBloomFilterFileName.fileRef, null));
         }
         return validFiles;
     }
@@ -205,8 +207,8 @@
 
         String baseName = baseDir + ts + SPLIT_STRING + ts;
         return new LSMComponentFileReferences(createFlushFile(baseName + 
SPLIT_STRING + RTREE_STRING),
-                createFlushFile(baseName + SPLIT_STRING + BTREE_STRING), 
createFlushFile(baseName + SPLIT_STRING
-                        + BLOOM_FILTER_STRING));
+                createFlushFile(baseName + SPLIT_STRING + BTREE_STRING),
+                createFlushFile(baseName + SPLIT_STRING + 
BLOOM_FILTER_STRING), null);
     }
 
     @Override
@@ -250,6 +252,6 @@
         FileReference rTreeFileRef = new FileReference(rTreeFile);
         FileReference bTreeFileRef = new FileReference(bTreeFile);
         FileReference bloomFilterFileRef = new FileReference(bloomFilterFile);
-        return new LSMComponentFileReferences(rTreeFileRef, bTreeFileRef, 
bloomFilterFileRef);
+        return new LSMComponentFileReferences(rTreeFileRef, bTreeFileRef, 
bloomFilterFileRef, null);
     }
 }
diff --git 
a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFlushOperation.java
 
b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFlushOperation.java
index 31455ae..09abf66 100644
--- 
a/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFlushOperation.java
+++ 
b/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFlushOperation.java
@@ -18,44 +18,27 @@
  */
 package org.apache.hyracks.storage.am.lsm.rtree.impls;
 
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
-import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IODeviceHandle;
-import org.apache.hyracks.storage.am.common.api.IndexException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessorInternal;
+import 
org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMFlushOperation;
 
-public class LSMRTreeFlushOperation implements ILSMIOOperation, 
Comparable<LSMRTreeFlushOperation> {
+public class LSMRTreeFlushOperation extends AbstractLSMFlushOperation 
implements Comparable<LSMRTreeFlushOperation> {
 
-    private final ILSMIndexAccessorInternal accessor;
-    private final ILSMComponent flushingComponent;
     private final FileReference rtreeFlushTarget;
     private final FileReference btreeFlushTarget;
-    private final FileReference bloomFilterFlushTarget;
-    private final ILSMIOOperationCallback callback;
-    private final String indexIdentifier;
 
     public LSMRTreeFlushOperation(ILSMIndexAccessorInternal accessor, 
ILSMComponent flushingComponent,
             FileReference rtreeFlushTarget, FileReference btreeFlushTarget, 
FileReference bloomFilterFlushTarget,
             ILSMIOOperationCallback callback, String indexIdentifier) {
-        this.accessor = accessor;
-        this.flushingComponent = flushingComponent;
+        super(accessor, flushingComponent, bloomFilterFlushTarget, callback, 
indexIdentifier);
         this.rtreeFlushTarget = rtreeFlushTarget;
         this.btreeFlushTarget = btreeFlushTarget;
-        this.bloomFilterFlushTarget = bloomFilterFlushTarget;
-        this.callback = callback;
-        this.indexIdentifier = indexIdentifier;
-    }
-
-    @Override
-    public Set<IODeviceHandle> getReadDevices() {
-        return Collections.emptySet();
     }
 
     @Override
@@ -64,20 +47,9 @@
         devs.add(rtreeFlushTarget.getDeviceHandle());
         if (btreeFlushTarget != null) {
             devs.add(btreeFlushTarget.getDeviceHandle());
-            devs.add(bloomFilterFlushTarget.getDeviceHandle());
+            devs.add(bloomFilterTarget.getDeviceHandle());
         }
         return devs;
-    }
-
-    @Override
-    public Boolean call() throws HyracksDataException, IndexException {
-        accessor.flush(this);
-        return true;
-    }
-
-    @Override
-    public ILSMIOOperationCallback getCallback() {
-        return callback;
     }
 
     public FileReference getRTreeFlushTarget() {
@@ -86,24 +58,6 @@
 
     public FileReference getBTreeFlushTarget() {
         return btreeFlushTarget;
-    }
-
-    public FileReference getBloomFilterFlushTarget() {
-        return bloomFilterFlushTarget;
-    }
-
-    public ILSMComponent getFlushingComponent() {
-        return flushingComponent;
-    }
-
-    @Override
-    public String getIndexUniqueIdentifier() {
-        return indexIdentifier;
-    }
-
-    @Override
-    public LSMIOOpertionType getIOOpertionType() {
-        return LSMIOOpertionType.FLUSH;
     }
 
     @Override
diff --git a/hyracks/pom.xml b/hyracks/pom.xml
index 6ed530a..f427b2c 100644
--- a/hyracks/pom.xml
+++ b/hyracks/pom.xml
@@ -40,6 +40,35 @@
         <version>1.2</version>
       </plugin>
     </plugins>
+    <pluginManagement>
+        <plugins>
+            <!--This plugin's configuration is used to store Eclipse m2e 
settings only. It has no influence on the Maven build itself.-->
+            <plugin>
+                <groupId>org.eclipse.m2e</groupId>
+                <artifactId>lifecycle-mapping</artifactId>
+                <version>1.0.0</version>
+                <configuration>
+                    <lifecycleMappingMetadata>
+                        <pluginExecutions>
+                            <pluginExecution>
+                                <pluginExecutionFilter>
+                                    <groupId>org.apache.maven.plugins</groupId>
+                                    
<artifactId>maven-plugin-plugin</artifactId>
+                                    <versionRange>[3.4,)</versionRange>
+                                    <goals>
+                                        <goal>descriptor</goal>
+                                    </goals>
+                                </pluginExecutionFilter>
+                                <action>
+                                    <ignore></ignore>
+                                </action>
+                            </pluginExecution>
+                        </pluginExecutions>
+                    </lifecycleMappingMetadata>
+                </configuration>
+            </plugin>
+        </plugins>
+    </pluginManagement>
   </build>
 
   <repositories>

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/453
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifc8927a7fe90577d787c3d30c371ea95dd4aa24e
Gerrit-PatchSet: 1
Gerrit-Project: hyracks
Gerrit-Branch: master
Gerrit-Owner: Ildar Absalyamov <[email protected]>

Reply via email to