@Override public boolean containsCompatibleWithSharedDomain(Binding bindingLeft) { if ( commonVars.size() == 0 ) return false ; for ( Binding bindingRight: table ) { if ( hasCommonVars(bindingLeft, bindingRight) && Algebra.compatible(bindingLeft, bindingRight) ) return true ; } return false ; }
@Override protected Binding getNextSlot(Binding bindingLeft) { boolean accept = true ; for ( Iterator<Binding> iter = tableRight.iterator(null) ; iter.hasNext() ; ) { Binding bindingRight = iter.next() ; if ( Algebra.compatible(bindingLeft, bindingRight) ) { accept = false ; break ; } } if ( accept ) return bindingLeft ; return null ; } }
@Override protected Binding computeNext() { while(bindings.hasNext()) { List<Binding> cand = bindings.next(); Binding r = null; for(Binding b : cand) { if(r == null) { r = b; } else { boolean isCompatible = Algebra.compatible(r, b); if(isCompatible) { r = Algebra.merge(r, b); } else { continue; } } } return r; } return endOfData(); } }
public static Binding merge(Binding bindingLeft, Binding bindingRight) { // Test to see if compatible: Iterate over variables in left boolean matches = compatible(bindingLeft, bindingRight) ; if ( ! matches ) return null ; // If compatible, merge. Iterate over variables in right but not in left. BindingMap b = BindingFactory.create(bindingLeft) ; for ( Iterator<Var> vIter = bindingRight.vars() ; vIter.hasNext() ; ) { Var v = vIter.next(); Node n = bindingRight.get(v) ; if ( ! bindingLeft.contains(v) ) b.add(v, n) ; } return b ; }
if ( ! Algebra.compatible(bindingLeft, bindingRight) )