1 /*******************************************************************************
2 * Copyright (c) 2013, 2014 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)).
31 * @author Marc-Andre Laperle
33 public class TmfBTreeTraceIndex
implements ITmfCheckpointIndex
{
35 private final BTree fCheckpoints
;
36 private final FlatArray fCheckpointRanks
;
38 private static final int BTREE_DEGREE
= 15;
41 * Creates an index for the given trace
43 * @param trace the trace
45 public TmfBTreeTraceIndex(ITmfTrace trace
) {
46 BTree bTree
= createBTree(trace
);
47 FlatArray flatArray
= createFlatArray(trace
);
49 // If one of the files is created from scratch, make sure we rebuild the other one too
50 if (bTree
.isCreatedFromScratch() != flatArray
.isCreatedFromScratch()) {
53 bTree
= createBTree(trace
);
54 flatArray
= createFlatArray(trace
);
58 fCheckpointRanks
= flatArray
;
61 private static FlatArray
createFlatArray(ITmfTrace trace
) {
62 return new FlatArray(getIndexFile(trace
, FlatArray
.INDEX_FILE_NAME
), (ITmfPersistentlyIndexable
)trace
);
65 private static BTree
createBTree(ITmfTrace trace
) {
66 return new BTree(BTREE_DEGREE
, getIndexFile(trace
, BTree
.INDEX_FILE_NAME
), (ITmfPersistentlyIndexable
)trace
);
69 private static File
getIndexFile(ITmfTrace trace
, String fileName
) {
70 String directory
= TmfTraceManager
.getSupplementaryFileDir(trace
);
71 return new File(directory
+ fileName
);
75 public void dispose() {
76 fCheckpoints
.dispose();
77 fCheckpointRanks
.dispose();
81 public void insert(ITmfCheckpoint checkpoint
) {
82 fCheckpoints
.insert(checkpoint
);
83 fCheckpointRanks
.insert(checkpoint
);
84 fCheckpoints
.setSize(fCheckpoints
.size() + 1);
88 public ITmfCheckpoint
get(long checkpoint
) {
89 return fCheckpointRanks
.get(checkpoint
);
93 public long binarySearch(ITmfCheckpoint checkpoint
) {
94 return fCheckpoints
.binarySearch(checkpoint
);
98 public boolean isEmpty() {
104 return fCheckpoints
.size();
108 public boolean isCreatedFromScratch() {
109 return fCheckpoints
.isCreatedFromScratch();
113 public void setTimeRange(TmfTimeRange timeRange
) {
114 fCheckpoints
.setTimeRange(timeRange
);
118 public void setNbEvents(long nbEvents
) {
119 fCheckpoints
.setNbEvents(nbEvents
);
123 public TmfTimeRange
getTimeRange() {
124 return fCheckpoints
.getTimeRange();
128 public long getNbEvents() {
129 return fCheckpoints
.getNbEvents();
133 public void setIndexComplete() {
134 fCheckpoints
.setIndexComplete();
135 fCheckpointRanks
.setIndexComplete();