@Override public boolean add(Tuple<NodeId> tuple) { return index.add(tuple) ; }
@Override public Iterator<Tuple<NodeId>> all() { return index.all() ; }
@Override final public void close() { for ( TupleIndex idx : indexes ) { if ( idx != null ) idx.close(); } }
/** Set index - for code that manipulates internal structures directly - use with care */ public void setTupleIndex(int i, TupleIndex index) { if ( index != null && index.getTupleLength() != tupleLen ) throw new TDBException("Incompatible index: "+index.getMapping()) ; indexes[i] = index ; }
public static void dumpTupleIndex(TupleIndex tIdx) { System.out.print("## "+tIdx.getMapping()+"\n") ; Iterator<Tuple<NodeId>> iter = tIdx.all() ; for ( ; iter.hasNext() ; ) { Tuple<NodeId> t = iter.next() ; System.out.print(t) ; System.out.print("\n") ; } }
@Override public Iterator<Tuple<NodeId>> find(Tuple<NodeId> pattern) { return index.find(pattern) ; }
private static void tupleIndexCopy(TupleIndex index1, TupleIndex index2, String label) { ProgressMonitor monitor = ProgressMonitor.create(log, label, tickQuantum, superTick); monitor.start(); Iterator<Tuple<NodeId>> iter1 = index1.all(); long counter = 0; for ( ; iter1.hasNext() ; ) { counter++; Tuple<NodeId> tuple = iter1.next(); index2.add(tuple); monitor.tick(); } index2.sync(); long time = monitor.finish(); float elapsedSecs = time / 1000F; float rate = (elapsedSecs != 0) ? counter / elapsedSecs : 0; print("Total: %,d records : %,.2f seconds : %,.2f records/sec [%s]", counter, elapsedSecs, rate, DateTimeUtils.nowAsString()); }
/** Insert a tuple - return true if it was really added, false if it was a duplicate */ public boolean add(Tuple<NodeId> t) { if ( tupleLen != t.len() ) throw new TDBException(format("Mismatch: inserting tuple of length %d into a table of tuples of length %d", t.len(), tupleLen)) ; for ( int i = 0 ; i < indexes.length ; i++ ) { if ( indexes[i] == null ) continue ; if ( ! indexes[i].add(t) ) { if ( i == 0 ) { duplicate(t) ; return false ; } unexpectedDuplicate(t, i) ; throw new TDBException(format("Secondary index duplicate: %s -> %s",indexes[i].getMapping(), t)) ; } syncNeeded = true ; } return true ; }
@Override public String getName() { return index.getName() ; }
public void clear() { for ( TupleIndex idx : indexes ) { if ( idx != null ) idx.clear() ; } syncNeeded = true ; }
@Override public boolean delete(Tuple<NodeId> tuple) { return index.delete(tuple) ; }
@Override public String getMapping() { return index.getMapping() ; }
@Override public ColumnMap getColumnMap() { return index.getColumnMap() ; }
@Test public void TupleIndexRecordPOS_3() { TupleIndex index = createIndex("POS") ; add(index, n1, n2, n3) ; Tuple<NodeId> tuple2 = TupleFactory.tuple(null, n2, n3) ; Iterator<Tuple<NodeId>> iter = index.find(tuple2) ; assertTrue("Can't find tuple", iter.hasNext()) ; iter.next(); assertFalse(iter.hasNext()) ; }
@Override public void createSecondaryIndexes(TupleIndex primaryIndex , TupleIndex[] secondaryIndexes) { Timer timer = new Timer() ; timer.startTimer() ; for ( TupleIndex index : secondaryIndexes ) { if ( index != null ) { long time1 = timer.readTimer() ; LoaderNodeTupleTable.copyIndex(primaryIndex.all(), new TupleIndex[]{index}, index.getMapping(), monitor) ; long time2 = timer.readTimer() ; // if ( printTiming ) // printf("Time for %s indexing: %.2fs\n", index.getLabel(), (time2-time1)/1000.0) ; // if ( printTiming ) // printer.println() ; } } } }
public NodeTupleTableConcrete(int N, TupleIndex[] indexes, NodeTable nodeTable, DatasetControl dsControl) { if (indexes.length == 0 || indexes[0] == null) throw new TDBException("A primary index is required") ; for (TupleIndex index : indexes) { if (N != index.getTupleLength()) throw new TDBException(format("Inconsistent: TupleTable width is %d but index %s is %d", N, index.getMapping(), index.getTupleLength())) ; } this.dsPolicy = dsControl ; this.tupleTable = new TupleTable(N, indexes) ; this.nodeTable = nodeTable ; }
/** Choose an index to scan in case we are asked for everything * This needs to be ???G for the distinctAdjacent filter in union query to work. */ private static TupleIndex chooseScanAllIndex(int tupleLen, TupleIndex[] indexes) { if ( tupleLen != 4 ) return indexes[0] ; for ( TupleIndex index : indexes ) { // First look for SPOG if ( index.getName().equals("SPOG") ) return index ; } for ( TupleIndex index : indexes ) { // Then look for any ???G if ( index.getName().endsWith("G") ) return index ; } Log.warn(SystemTDB.errlog, "Did not find a ???G index for full scans") ; return indexes[0] ; }