![JAR search and dependency download from the Maven repository](/logo.png)
com.clarkparsia.pellet.sparqldl.model.MultiQueryResults Maven / Gradle / Ivy
// Copyright (c) 2006 - 2008, Clark & Parsia, LLC.
// This source code is available under the terms of the Affero General Public License v3.
//
// Please see LICENSE.txt for full license terms, including the availability of proprietary exceptions.
// Questions, comments, or requests for clarification: [email protected]
package com.clarkparsia.pellet.sparqldl.model;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import aterm.ATermAppl;
/**
*
* Title: Result combining more disjoint query results to prevent generating
* cross-products.
*
*
* Description:
*
*
* Copyright: Copyright (c) 2007
*
*
* Company: Clark & Parsia, LLC.
*
*
* @author Petr Kremen
*/
public class MultiQueryResults implements QueryResult {
private final List resultVars;
private final List queryResults;
private int size;
public MultiQueryResults(final List resultVars, final List queryResults) {
this.resultVars = resultVars;
this.queryResults = queryResults;
size = 1;
for( final QueryResult result : queryResults ) {
size *= result.size();
}
}
/**
* {@inheritDoc}
*/
public void add(ResultBinding binding) {
throw new UnsupportedOperationException( "MultiQueryResults do not support addition!" );
}
/**
* {@inheritDoc}
*/
public List getResultVars() {
return resultVars;
}
/**
* {@inheritDoc}
*/
public boolean isDistinct() {
for( final QueryResult result : queryResults ) {
if( !result.isDistinct() )
return false;
}
return true;
}
/**
* {@inheritDoc}
*/
public boolean isEmpty() {
return size == 0;
}
/**
* {@inheritDoc}
*/
public Iterator iterator() {
return new Iterator() {
private List> iterators = new ArrayList>();
private List bindings = new ArrayList();
private boolean hasNext = init();
private boolean init() {
for( QueryResult result : queryResults ) {
Iterator iterator = result.iterator();
if( !iterator.hasNext() )
return false;
iterators.add( iterator );
bindings.add( iterator.next() );
}
return true;
}
private void findNext() {
ListIterator> i = iterators.listIterator();
for( int index = 0; index < iterators.size(); index++ ) {
Iterator iterator = i.next();
if( iterator.hasNext() ) {
bindings.set( index, iterator.next() );
return;
}
else if( index == iterators.size() - 1 ) {
hasNext = false;
return;
}
else {
iterator = queryResults.get( index ).iterator();
i.set( iterator );
bindings.set( index, iterator.next() );
}
}
}
public boolean hasNext() {
return hasNext;
}
public ResultBinding next() {
if( !hasNext() )
throw new NoSuchElementException();
ResultBinding result = new ResultBindingImpl();
for( ResultBinding binding : bindings ) {
result.setValues( binding );
}
findNext();
return result;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
/**
* {@inheritDoc}
*/
public int size() {
return size;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy