/******************************************************************************* * Copyright (c) 2015 MINRES Technologies GmbH and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * MINRES Technologies GmbH - initial API and implementation *******************************************************************************/ package com.minres.scviewer.database.leveldb; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.iq80.leveldb.impl.SeekingIterator; import org.json.JSONObject; import java.util.NavigableMap; import java.util.TreeMap; import java.util.Vector; import com.minres.scviewer.database.HierNode; import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.ITxEvent; import com.minres.scviewer.database.ITxGenerator; import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.IWaveform; import com.minres.scviewer.database.IWaveformDb; import com.minres.scviewer.database.RelationType; public class TxStream extends HierNode implements ITxStream { private TxDBWrapper levelDb; private String fullName; private String kind; private IWaveformDb db; private long id; private TreeMap generators; private TreeMap transactions; private Integer maxConcurrency; private TreeMap> events; private List usedRelationsList; public TxStream(TxDBWrapper database, IWaveformDb waveformDb, JSONObject object) { super(object.get("name").toString()); this.levelDb=database; this.db=waveformDb; this.fullName=object.getString("name"); this.kind=object.getString("kind"); this.id = object.getLong("id"); } @Override public IWaveformDb getDb() { return db; } @Override public String getFullName() { return fullName; } @Override public Long getId() { return id; } @Override public String getKind() { return kind; } @Override public List getGenerators() { if(generators==null){ generators=new TreeMap(); SeekingIterator it = levelDb.iterator(); String key="sg~"+String.format("%016x", id); it.seek(key); while(it.hasNext()) { Entry val = it.next(); if(!val.getKey().startsWith(key)) break; JSONObject jVal = new JSONObject(val.getValue()); generators.put(jVal.getLong("id"), new TxGenerator(this, jVal)); } } return new ArrayList(generators.values()); } @Override public int getMaxConcurrency() { if(maxConcurrency==null){ getTransactions(); } return maxConcurrency; } @Override public NavigableMap> getEvents(){ if(events==null){ events=new TreeMap>(); for(Entry entry:getTransactions().entrySet()){ ITx tx = entry.getValue(); putEvent(new TxEvent(TxEvent.Type.BEGIN, tx)); putEvent(new TxEvent(TxEvent.Type.END, tx)); } } return events; } private void putEvent(TxEvent ev){ Long time = ev.getTime(); if(!events.containsKey(time)){ Vector vector=new Vector(); vector.add(ev); events.put(time, vector); } else { events.get(time).add(ev); } } protected Map getTransactions() { if(transactions==null){ if(generators==null) getGenerators(); transactions = new TreeMap(); maxConcurrency=0; SeekingIterator it = levelDb.iterator(); String key = "sgx~"+String.format("%016x", id); it.seek(key); while(it.hasNext()) { Entry val = it.next(); if(!val.getKey().startsWith(key)) break; String[] token = val.getKey().split("~"); long gid = Long.parseLong(token[2], 16); // gen id long id = Long.parseLong(token[3], 16); // tx id ITx tx = new Tx(levelDb, this, generators.get(gid), id); transactions.put(id, tx); maxConcurrency= Math.max(maxConcurrency, tx.getConcurrencyIndex()); } maxConcurrency++; } return transactions; } @Override public Collection getWaveformEventsAtTime(Long time) { return getEvents().get(time); } public void setRelationTypeList(List usedRelationsList){ this.usedRelationsList=usedRelationsList; } public RelationType getRelationType(String name) { RelationType relType=RelationType.create(name); if(!usedRelationsList.contains(relType)) usedRelationsList.add(relType); return relType; } @Override public Boolean equals(IWaveform other) { return(other instanceof TxStream && this.getId()==other.getId()); } }