From af388b24627f95c5d5a10179d7024e304dec1256 Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Fri, 8 Jan 2021 20:31:24 +0100 Subject: [PATCH] add TX attribute value caching --- .../scviewer/database/sqlite/TxGenerator.java | 9 ---- .../scviewer/database/text/TextDbLoader.java | 44 ++++++++++++++----- .../scviewer/database/text/TxAttribute.java | 19 ++------ .../scviewer/database/text/TxGenerator.java | 17 ++----- .../scviewer/database/text/TxStream.java | 11 ++--- .../scviewer/database/tx/ITxGenerator.java | 3 -- 6 files changed, 48 insertions(+), 55 deletions(-) diff --git a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxGenerator.java b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxGenerator.java index 5ceca40..08cc6f3 100644 --- a/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxGenerator.java +++ b/plugins/com.minres.scviewer.database.sqlite/src/com/minres/scviewer/database/sqlite/TxGenerator.java @@ -10,12 +10,8 @@ *******************************************************************************/ package com.minres.scviewer.database.sqlite; -import java.util.ArrayList; -import java.util.List; - import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.sqlite.tables.ScvGenerator; -import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITxGenerator; public class TxGenerator implements ITxGenerator { @@ -44,9 +40,4 @@ public class TxGenerator implements ITxGenerator { return scvGenerator.getName(); } - @Override - public List getTransactions() { - return new ArrayList<>(); - } - } 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 ef34fb4..09affa2 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 @@ -26,6 +26,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; +import org.eclipse.collections.impl.map.mutable.UnifiedMap; import org.mapdb.DB; import org.mapdb.DB.TreeMapSink; import org.mapdb.DBMaker; @@ -48,16 +49,18 @@ public class TextDbLoader implements IWaveformDbLoader{ private Long maxTime=0L; DB mapDb=null; + + final List attrValues = new ArrayList<>(); - final Map relationTypes=new HashMap<>(); + final Map relationTypes = UnifiedMap.newMap(); - final Map txStreams = new HashMap<>(); + final Map txStreams = UnifiedMap.newMap(); - final Map txGenerators = new HashMap<>(); + final Map txGenerators = UnifiedMap.newMap(); Map transactions = null; - final Map attributeTypes = new HashMap<>(); + final Map attributeTypes = UnifiedMap.newMap(); final HashMultimap relationsIn = HashMultimap.create(); @@ -144,6 +147,7 @@ public class TextDbLoader implements IWaveformDbLoader{ } public void dispose() { + attrValues.clear(); relationTypes.clear(); txStreams.clear(); txGenerators.clear(); @@ -202,6 +206,8 @@ public class TextDbLoader implements IWaveformDbLoader{ TxGenerator generator=null; + Map attrValueLut = new HashMap<>(); + public TextDbParser(TextDbLoader loader) { super(); this.loader = loader; @@ -238,13 +244,12 @@ public class TextDbLoader implements IWaveformDbLoader{ DataType type = DataType.valueOf(tokens[3]); String remaining = tokens.length>5?String.join(" ", Arrays.copyOfRange(tokens, 5, tokens.length)):""; TxAttributeType attrType = getAttrType(name, type, AssociationType.RECORD); - transactionById.get(id).attributes.add(new TxAttribute(attrType, remaining)); + transactionById.get(id).attributes.add(new TxAttribute(attrType, getAttrString(attrType, remaining))); } else if("tx_begin".equals(tokens[0])){ Long id = Long.parseLong(tokens[1]); Long genId = Long.parseLong(tokens[2]); TxGenerator gen=loader.txGenerators.get(genId); ScvTx scvTx = new ScvTx(id, gen.stream.getId(), genId, Long.parseLong(tokens[3])*stringToScale(tokens[4])); - Tx tx = new Tx(loader, scvTx); loader.maxTime = loader.maxTime>scvTx.beginTime?loader.maxTime:scvTx.beginTime; TxStream stream = loader.txStreams.get(gen.stream.getId()); stream.setConcurrency(stream.getConcurrency()+1); @@ -252,7 +257,8 @@ public class TextDbLoader implements IWaveformDbLoader{ int idx=0; while(nextLine!=null && nextLine.charAt(0)=='a') { String[] attrTokens=nextLine.split("\\s+"); - TxAttribute attr = new TxAttribute(gen.beginAttrs.get(idx), attrTokens[1]); + TxAttributeType attrType = gen.beginAttrs.get(idx); + TxAttribute attr = new TxAttribute(attrType, getAttrString(attrType, attrTokens[1])); scvTx.attributes.add(attr); idx++; nextLine=reader.readLine(); @@ -260,10 +266,8 @@ public class TextDbLoader implements IWaveformDbLoader{ } txSink.put(id, scvTx); transactionById.put(id, scvTx); - gen.getTransactions().add(tx); } else if("tx_end".equals(tokens[0])){ Long id = Long.parseLong(tokens[1]); - //ScvTx tx = loader.transactions.get(id); ScvTx scvTx = transactionById.get(id); assert Long.parseLong(tokens[2])==scvTx.generatorId; scvTx.endTime=Long.parseLong(tokens[3])*stringToScale(tokens[4]); @@ -281,7 +285,8 @@ public class TextDbLoader implements IWaveformDbLoader{ int idx=0; while(nextLine!=null && nextLine.charAt(0)=='a') { String[] attrTokens=nextLine.split("\\s+"); - TxAttribute attr = new TxAttribute(gen.endAttrs.get(idx), attrTokens[1]); + TxAttributeType attrType = gen.endAttrs.get(idx); + TxAttribute attr = new TxAttribute(attrType, getAttrString(attrType, attrTokens[1])); scvTx.attributes.add(attr); idx++; nextLine=reader.readLine(); @@ -332,6 +337,25 @@ public class TextDbLoader implements IWaveformDbLoader{ return nextLine; } + private String getAttrString(TxAttributeType attrType, String string) { + String value; + switch(attrType.getDataType()){ + case STRING: + case ENUMERATION: + value=string.substring(1, string.length()-1); + break; + default: + value=string; + } + if(attrValueLut.containsKey(value)){ + return loader.attrValues.get(attrValueLut.get(value)); + } else { + attrValueLut.put(value, loader.attrValues.size()); + loader.attrValues.add(value); + return value; + } + } + private long stringToScale(String scale){ String cmp = scale.trim(); if("fs".equals(cmp)) return 1L; diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.java b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.java index 79a0bd7..26e316c 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.java +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.java @@ -23,24 +23,13 @@ public class TxAttribute implements ITxAttribute, Serializable { */ private static final long serialVersionUID = 4767726016651807152L; - private TxAttributeType attributeType; + private final TxAttributeType attributeType; - private String value=null; - - TxAttribute(TxAttributeType attributeType){ - this.attributeType=attributeType; - } + private final String value; TxAttribute(TxAttributeType type, String value){ - attributeType=type; - switch(type.getDataType()){ - case STRING: - case ENUMERATION: - this.value=value.substring(1, value.length()-1); - break; - default: - this.value=value; - } + this.attributeType=type; + this.value=value; } @Override diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxGenerator.java b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxGenerator.java index f8082f3..662fd80 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxGenerator.java +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxGenerator.java @@ -13,30 +13,26 @@ package com.minres.scviewer.database.text; import java.util.ArrayList; import java.util.List; +import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.IWaveform; -import com.minres.scviewer.database.tx.ITx; import com.minres.scviewer.database.tx.ITxGenerator; -class TxGenerator implements ITxGenerator { +class TxGenerator extends HierNode implements ITxGenerator { Long id; IWaveform stream; - - String name; - + Boolean active = false; - List transactions=new ArrayList<>(); - List beginAttrs = new ArrayList<>(); List endAttrs= new ArrayList<>(); TxGenerator(Long id, TxStream stream, String name){ + super(name, stream); this.id=id; this.stream=stream; - this.name=name; } @Override @@ -54,11 +50,6 @@ class TxGenerator implements ITxGenerator { return name; } - @Override - public List getTransactions(){ - return transactions; - } - public List getBeginAttrs() { return beginAttrs; } diff --git a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.java b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.java index 1951613..265efba 100644 --- a/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.java +++ b/plugins/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.java @@ -22,6 +22,7 @@ import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.IEvent; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.WaveformType; +import com.minres.scviewer.database.tx.ITxEvent; import com.minres.scviewer.database.tx.ITxGenerator; class TxStream extends HierNode implements IWaveform { @@ -63,14 +64,14 @@ class TxStream extends HierNode implements IWaveform { return maxConcurrency; } - public void addEvent(TxEvent evt) { - if(!events.containsKey(evt.time)) - events.put(evt.time, new IEvent[] {evt}); + public void addEvent(ITxEvent evt) { + if(!events.containsKey(evt.getTime())) + events.put(evt.getTime(), new IEvent[] {evt}); else { - IEvent[] evts = events.get(evt.time); + IEvent[] evts = events.get(evt.getTime()); IEvent[] newEvts = Arrays.copyOf(evts, evts.length+1); newEvts[evts.length]=evt; - events.put(evt.time, newEvts); + events.put(evt.getTime(), newEvts); } } diff --git a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxGenerator.java b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxGenerator.java index 92a8e2b..424051f 100644 --- a/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxGenerator.java +++ b/plugins/com.minres.scviewer.database/src/com/minres/scviewer/database/tx/ITxGenerator.java @@ -10,13 +10,10 @@ *******************************************************************************/ package com.minres.scviewer.database.tx; -import java.util.List; - import com.minres.scviewer.database.IWaveform; public interface ITxGenerator { public Long getId(); public IWaveform getStream(); public String getName(); - public List getTransactions(); }