From ba6446378add3e47a750a9c0bf4a172fa3fa03fa Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Tue, 12 Jan 2021 07:16:42 +0100 Subject: [PATCH] store complete transactions only complete ScvTx should be put into MapDB otherwise later property updates might get lost. Since they might not end in the order they start an additional redirection is need to insert with ascending keys --- .../scviewer/database/text/TextDbLoader.java | 11 +++++++- .../com/minres/scviewer/database/text/Tx.java | 26 +++++++------------ .../database/test/DatabaseServicesTest.java | 10 +++++++ 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java index ac0c1d9..f84577c 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.java @@ -76,6 +76,8 @@ public class TextDbLoader implements IWaveformDbLoader { /** The transactions. */ Map transactions = null; + Map id2index = new HashMap<>(); + /** The attribute types. */ final Map attributeTypes = UnifiedMap.newMap(); @@ -107,6 +109,10 @@ public class TextDbLoader implements IWaveformDbLoader { return maxTime; } + public ScvTx getScvTx(long id) { + return transactions.get(id2index.get(id)); + } + /** * Gets the all waves. * @@ -280,6 +286,7 @@ public class TextDbLoader implements IWaveformDbLoader { /** The attr value lut. */ Map attrValueLut = new HashMap<>(); + long indexCount = 0; /** * Instantiates a new text db parser. * @@ -367,7 +374,6 @@ public class TextDbLoader implements IWaveformDbLoader { nextLine = reader.readLine(); } } - txSink.put(id, scvTx); transactionById.put(id, scvTx); } else if ("tx_end".equals(tokens[0])) { Long id = Long.parseLong(tokens[1]); @@ -401,6 +407,9 @@ public class TextDbLoader implements IWaveformDbLoader { nextLine = reader.readLine(); } } + txSink.put(indexCount, scvTx); + loader.id2index.put(scvTx.getId(), indexCount++); + transactionById.remove(id); } else if ("tx_relation".equals(tokens[0])) { Long tr2 = Long.parseLong(tokens[2]); Long tr1 = Long.parseLong(tokens[3]); diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.java b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.java index 3f288b1..10af42a 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.java +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.java @@ -113,7 +113,7 @@ class Tx implements ITx { return true; if (obj == null || getClass() != obj.getClass()) return false; - return this.getScvTx().equals(((Tx) obj).getScvTx()); + return this.loader.getScvTx(id).equals(((Tx) obj).loader.getScvTx(id)); } /** @@ -123,7 +123,7 @@ class Tx implements ITx { */ @Override public int hashCode() { - return getScvTx().hashCode(); + return loader.getScvTx(id).hashCode(); } /** @@ -143,7 +143,7 @@ class Tx implements ITx { */ @Override public Long getId() { - return getScvTx().id; + return loader.getScvTx(id).id; } /** @@ -153,7 +153,7 @@ class Tx implements ITx { */ @Override public IWaveform getStream() { - return loader.txStreams.get(getScvTx().streamId); + return loader.txStreams.get(loader.getScvTx(id).streamId); } /** @@ -163,7 +163,7 @@ class Tx implements ITx { */ @Override public ITxGenerator getGenerator() { - return loader.txGenerators.get(getScvTx().generatorId); + return loader.txGenerators.get(loader.getScvTx(id).generatorId); } /** @@ -174,7 +174,7 @@ class Tx implements ITx { @Override public Long getBeginTime() { if (beginTime < 0) - beginTime = getScvTx().beginTime; + beginTime = loader.getScvTx(id).beginTime; return beginTime; } @@ -186,7 +186,7 @@ class Tx implements ITx { @Override public Long getEndTime() { if (endTime < 0) - endTime = getScvTx().endTime; + endTime = loader.getScvTx(id).endTime; return endTime; } @@ -196,7 +196,7 @@ class Tx implements ITx { * @param time the new end time */ void setEndTime(Long time) { - getScvTx().endTime = time; + loader.getScvTx(id).endTime = time; } /** @@ -225,15 +225,7 @@ class Tx implements ITx { */ @Override public List getAttributes() { - return getScvTx().attributes; + return loader.getScvTx(id).attributes; } - /** - * Gets the scv tx. - * - * @return the scv tx - */ - private ScvTx getScvTx() { - return loader.transactions.get(id); - } } diff --git a/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java b/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java index 761c264..7ee3fc1 100644 --- a/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java +++ b/tests/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java @@ -120,5 +120,15 @@ public class DatabaseServicesTest { assertEquals(1, waveformDb.getChildNodes().size()); } + @Test + public void testLargeTxText() throws Exception { + File f = new File("inputs/hw_config_10_10.txlog").getAbsoluteFile(); + assertTrue(f.exists()); + waveformDb.load(f); + assertNotNull(waveformDb); + List waveforms = waveformDb.getAllWaves(); + assertEquals(100, waveforms.size()); + assertEquals(1, waveformDb.getChildNodes().size()); + } }