Commit | Line | Data |
---|---|---|
032ecd45 MAL |
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 | } |