analysis: Move plugins to their own sub-directory
[deliverable/tracecompass.git] / org.eclipse.tracecompass.tmf.core / src / org / eclipse / tracecompass / tmf / core / trace / indexer / TmfBTreeTraceIndex.java
1 /*******************************************************************************
2 * Copyright (c) 2013, 2014 Ericsson
3 *
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
8 *
9 * Contributors:
10 * Marc-Andre Laperle - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.tracecompass.tmf.core.trace.indexer;
14
15 import java.io.File;
16
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;
24
25 /**
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)).
30 *
31 * @author Marc-Andre Laperle
32 */
33 public class TmfBTreeTraceIndex implements ITmfCheckpointIndex {
34
35 private final BTree fCheckpoints;
36 private final FlatArray fCheckpointRanks;
37
38 private static final int BTREE_DEGREE = 15;
39
40 /**
41 * Creates an index for the given trace
42 *
43 * @param trace the trace
44 */
45 public TmfBTreeTraceIndex(ITmfTrace trace) {
46 BTree bTree = createBTree(trace);
47 FlatArray flatArray = createFlatArray(trace);
48
49 // If one of the files is created from scratch, make sure we rebuild the other one too
50 if (bTree.isCreatedFromScratch() != flatArray.isCreatedFromScratch()) {
51 bTree.delete();
52 flatArray.delete();
53 bTree = createBTree(trace);
54 flatArray = createFlatArray(trace);
55 }
56
57 fCheckpoints = bTree;
58 fCheckpointRanks = flatArray;
59 }
60
61 private static FlatArray createFlatArray(ITmfTrace trace) {
62 return new FlatArray(getIndexFile(trace, FlatArray.INDEX_FILE_NAME), (ITmfPersistentlyIndexable)trace);
63 }
64
65 private static BTree createBTree(ITmfTrace trace) {
66 return new BTree(BTREE_DEGREE, getIndexFile(trace, BTree.INDEX_FILE_NAME), (ITmfPersistentlyIndexable)trace);
67 }
68
69 private static File getIndexFile(ITmfTrace trace, String fileName) {
70 String directory = TmfTraceManager.getSupplementaryFileDir(trace);
71 return new File(directory + fileName);
72 }
73
74 @Override
75 public void dispose() {
76 fCheckpoints.dispose();
77 fCheckpointRanks.dispose();
78 }
79
80 @Override
81 public void insert(ITmfCheckpoint checkpoint) {
82 fCheckpoints.insert(checkpoint);
83 fCheckpointRanks.insert(checkpoint);
84 fCheckpoints.setSize(fCheckpoints.size() + 1);
85 }
86
87 @Override
88 public ITmfCheckpoint get(long checkpoint) {
89 return fCheckpointRanks.get(checkpoint);
90 }
91
92 @Override
93 public long binarySearch(ITmfCheckpoint checkpoint) {
94 return fCheckpoints.binarySearch(checkpoint);
95 }
96
97 @Override
98 public boolean isEmpty() {
99 return size() == 0;
100 }
101
102 @Override
103 public int size() {
104 return fCheckpoints.size();
105 }
106
107 @Override
108 public boolean isCreatedFromScratch() {
109 return fCheckpoints.isCreatedFromScratch();
110 }
111
112 @Override
113 public void setTimeRange(TmfTimeRange timeRange) {
114 fCheckpoints.setTimeRange(timeRange);
115 }
116
117 @Override
118 public void setNbEvents(long nbEvents) {
119 fCheckpoints.setNbEvents(nbEvents);
120 }
121
122 @Override
123 public TmfTimeRange getTimeRange() {
124 return fCheckpoints.getTimeRange();
125 }
126
127 @Override
128 public long getNbEvents() {
129 return fCheckpoints.getNbEvents();
130 }
131
132 @Override
133 public void setIndexComplete() {
134 fCheckpoints.setIndexComplete();
135 fCheckpointRanks.setIndexComplete();
136 }
137
138 }
This page took 0.050123 seconds and 5 git commands to generate.