/* * (c) Copyright 2010 Epimorphics Ltd. * All rights reserved. * [See end of file] */ package dev.joinengine; import java.util.ArrayList ; import java.util.List ; import org.openjena.atlas.lib.Tuple ; import com.hp.hpl.jena.graph.Node ; import com.hp.hpl.jena.sparql.core.Var ; import com.hp.hpl.jena.tdb.index.TupleIndex ; import com.hp.hpl.jena.tdb.store.NodeId ; public class JoinChooser { // Temporary class for holding code being structured static List matchingIndexesStep1(Tuple pattern1, Tuple pattern2,TupleIndex[] indexes) { List indexes1 = matchingIndexesForPattern(pattern1, indexes) ; List indexes2 = matchingIndexesForPattern(pattern2, indexes) ; // Find common vars between pattern1 and pattern2 // pattern1[i] -> pattern2[j] return null ; } private static List patternMapping(Tuple pattern1, Tuple pattern2) { List x = new ArrayList() ; for ( Node n : pattern1.tuple() ) { x.add(varLocation(pattern2, n)) ; } return x ; } /** Return the first index of Node n in Tuple pattern */ // Function of Tuple? Tuple.find(T x) -> int or -1 private static Integer location(Tuple pattern, Node n) { for ( int i = 0 ; i < pattern.size() ; i++ ) { Node n2 = pattern.get(i) ; if ( n2 == null ) continue ; if ( n2.equals(n) ) return i ; } return null ; } /** Return the first index of Node n in Tuple pattern */ // Function of Tuple? private static Integer varLocation(Tuple pattern, Node n) { if ( Var.isVar(n)) return null ; return location(pattern, n) ; } /* * Find all indexes with maximal prefix for pattern. */ static List matchingIndexesForPattern(Tuple pattern, TupleIndex[] indexes) { // Return all possibilities. List x = new ArrayList() ; // Step 1: fixedCols. // Assumes the weight function does this. int indexNumSlots = 0 ; for ( TupleIndex idx : indexes ) { if ( idx == null ) continue ; int w = idx.weight(pattern) ; if ( w == indexNumSlots ) { x.add(idx) ; continue ; } if ( w > indexNumSlots ) { indexNumSlots = w ; x.add(idx) ; continue ; } } return x ; } } /* * (c) Copyright 2010 Epimorphics Ltd. * 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. */