1 /*******************************************************************************
2 * Copyright (c) 2013 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Marc-Andre Laperle - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.tracecompass
.tmf
.core
.trace
.indexer
;
17 import org
.eclipse
.tracecompass
.internal
.tmf
.core
.trace
.indexer
.BTree
;
18 import org
.eclipse
.tracecompass
.internal
.tmf
.core
.trace
.indexer
.FlatArray
;
19 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
20 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
21 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
22 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.indexer
.checkpoint
.ITmfCheckpoint
;
23 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.indexer
.checkpoint
.ITmfCheckpointIndex
;
26 * A checkpoint index that uses a BTree to store and search checkpoints by time stamps.
27 * It's possible to have the checkpoints time stamps in a different order than their checkpoint ranks.
28 * Because of that, we use a separate structure FlatArray that is better suited for searching
29 * by checkpoint rank (O(1)).
32 * @author Marc-Andre Laperle
34 public class TmfBTreeTraceIndex
implements ITmfCheckpointIndex
{
36 private final BTree fCheckpoints
;
37 private final FlatArray fCheckpointRanks
;
39 private static final int BTREE_DEGREE
= 15;
42 * Creates an index for the given trace
44 * @param trace the trace
46 public TmfBTreeTraceIndex(ITmfTrace trace
) {
47 BTree bTree
= createBTree(trace
);
48 FlatArray flatArray
= createFlatArray(trace
);
50 // If one of the files is created from scratch, make sure we rebuild the other one too
51 if (bTree
.isCreatedFromScratch() != flatArray
.isCreatedFromScratch()) {
54 bTree
= createBTree(trace
);
55 flatArray
= createFlatArray(trace
);
59 fCheckpointRanks
= flatArray
;
62 private static FlatArray
createFlatArray(ITmfTrace trace
) {
63 return new FlatArray(getIndexFile(trace
, FlatArray
.INDEX_FILE_NAME
), (ITmfPersistentlyIndexable
)trace
);
66 private static BTree
createBTree(ITmfTrace trace
) {
67 return new BTree(BTREE_DEGREE
, getIndexFile(trace
, BTree
.INDEX_FILE_NAME
), (ITmfPersistentlyIndexable
)trace
);
70 private static File
getIndexFile(ITmfTrace trace
, String fileName
) {
71 String directory
= TmfTraceManager
.getSupplementaryFileDir(trace
);
72 return new File(directory
+ fileName
);
76 public void dispose() {
77 fCheckpoints
.dispose();
78 fCheckpointRanks
.dispose();
82 public void insert(ITmfCheckpoint checkpoint
) {
83 fCheckpoints
.insert(checkpoint
);
84 fCheckpointRanks
.insert(checkpoint
);
85 fCheckpoints
.setSize(fCheckpoints
.size() + 1);
89 public ITmfCheckpoint
get(long checkpoint
) {
90 return fCheckpointRanks
.get(checkpoint
);
94 public long binarySearch(ITmfCheckpoint checkpoint
) {
95 return fCheckpoints
.binarySearch(checkpoint
);
99 public boolean isEmpty() {
105 return fCheckpoints
.size();
109 public boolean isCreatedFromScratch() {
110 return fCheckpoints
.isCreatedFromScratch();
114 public void setTimeRange(TmfTimeRange timeRange
) {
115 fCheckpoints
.setTimeRange(timeRange
);
119 public void setNbEvents(long nbEvents
) {
120 fCheckpoints
.setNbEvents(nbEvents
);
124 public TmfTimeRange
getTimeRange() {
125 return fCheckpoints
.getTimeRange();
129 public long getNbEvents() {
130 return fCheckpoints
.getNbEvents();
134 public void setIndexComplete() {
135 fCheckpoints
.setIndexComplete();
136 fCheckpointRanks
.setIndexComplete();