Commit | Line | Data |
---|---|---|
032ecd45 | 1 | /******************************************************************************* |
ed902a2b | 2 | * Copyright (c) 2013, 2014 Ericsson |
032ecd45 MAL |
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 | ||
2bdf0193 | 13 | package org.eclipse.tracecompass.tmf.core.trace.indexer; |
032ecd45 MAL |
14 | |
15 | import java.io.File; | |
16 | ||
2bdf0193 AM |
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; | |
032ecd45 MAL |
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 | * | |
032ecd45 MAL |
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 | } |