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