/* * (c) Copyright 2008, 2009 Hewlett-Packard Development Company, LP * All rights reserved. * [See end of file] */ package tdb_mem; import java.util.Iterator; import org.openjena.atlas.iterator.NullIterator ; import org.openjena.atlas.iterator.SingletonIterator ; import org.openjena.atlas.lib.ColumnMap ; import org.openjena.atlas.lib.InternalErrorException ; import org.openjena.atlas.lib.Tuple ; import com.hp.hpl.jena.tdb.index.TupleIndexBase ; import com.hp.hpl.jena.tdb.store.NodeId; /** In-memory structures and indexing. */ public class TupleIndexMem extends TupleIndexBase { // Not used. // Convert to TupleIndexBaseFind. // Simple in-memory structure. private Index3> index = new Index3>() ; public TupleIndexMem(int N, ColumnMap colMapping) { super(N, colMapping) ; if ( N != 3 ) throw new UnsupportedOperationException("TupleIndexMem - triples only") ; } @Override protected boolean performAdd(Tuple tuple) { NodeId x1 = colMap.mapSlot(0, tuple) ; NodeId x2 = colMap.mapSlot(1, tuple) ; NodeId x3 = colMap.mapSlot(2, tuple) ; return index.put(x1,x2,x3, tuple) ; } @Override protected boolean performDelete(Tuple tuple) { NodeId x1 = colMap.mapSlot(0, tuple) ; NodeId x2 = colMap.mapSlot(1, tuple) ; NodeId x3 = colMap.mapSlot(2, tuple) ; return index.remove(x1,x2,x3 ) ; } //@Override @Override public Iterator> all() { return index.flatten() ; } @Override protected Iterator> performFind(Tuple pattern) { NodeId x1 = colMap.mapSlot(0, pattern) ; if ( NodeId.doesNotExist(x1) ) return new NullIterator>() ; if ( undef(x1) ) x1 = null ; NodeId x2 = colMap.mapSlot(1, pattern) ; if ( NodeId.doesNotExist(x2) ) return new NullIterator>() ; if (undef(x2) ) x2 = null ; NodeId x3 = colMap.mapSlot(2, pattern) ; if ( NodeId.doesNotExist(x3) ) return new NullIterator>() ; if ( undef(x3) ) x3 = null ; if ( x1 == null ) throw new InternalErrorException("TupleIndexMem.find: no first index") ; if ( x2 == null ) { Index>> idx = index.get(x1) ; return IterFunc.flattenII(idx) ; } if ( x3 == null ) { Index> idx = index.get(x1, x2) ; return idx.values().iterator() ; } Tuple t = index.get(x1, x2, x3) ; if ( t == null ) return new NullIterator>() ; return new SingletonIterator>(t) ; } //@Override @Override public boolean isEmpty() { return index.isEmpty() ; } //@Override @Override public void clear() { index = new Index3>() ; } //@Override @Override public long size() { return index.size() ; } //@Override @Override public void sync() {} //@Override @Override public void close() {} } /* * (c) Copyright 2008, 2009 Hewlett-Packard Development Company, LP * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */