Skip to content

Commit

Permalink
[ issue #96 ] New lazy implementation of BGP execution (not yet working)
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrea Gazzarini committed Aug 20, 2015
1 parent 2ffaf5a commit fbe3bc7
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 93 deletions.
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package org.gazzax.labs.solrdf.handler.search.algebra;

import org.apache.lucene.search.Query;
import org.apache.solr.search.DocSet;

import com.hp.hpl.jena.graph.Triple;

public class DocSetAndTriplePattern {
public final Triple pattern;
public final DocSet children;
public final Query query;

DocSetAndTriplePattern(final DocSet children, final Triple pattern) {
DocSetAndTriplePattern(final DocSet children, final Triple pattern, final Query query) {
this.children = children;
this.pattern = pattern;
this.query = query;
}

public int size() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@

import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toList;
import static org.gazzax.labs.solrdf.NTriples.*;
import static org.gazzax.labs.solrdf.NTriples.asNode;
import static org.gazzax.labs.solrdf.NTriples.asNt;

import java.io.IOException;
import java.util.ArrayList;
Expand All @@ -17,7 +18,6 @@
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.DocIterator;
Expand All @@ -28,7 +28,6 @@
import org.gazzax.labs.solrdf.Field;
import org.gazzax.labs.solrdf.Names;
import org.gazzax.labs.solrdf.graph.standalone.LocalGraph;
import org.gazzax.labs.solrdf.handler.search.algebra.tt.ExtendedQueryIterator;
import org.gazzax.labs.solrdf.log.Log;
import org.gazzax.labs.solrdf.log.MessageCatalog;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -62,7 +61,7 @@ public class QueryIterBasicGraphPattern2 extends QueryIter1 {
final static OpFilter NULL_FILTER = OpFilter.filter(null);

final static List<Binding> EMPTY_BINDINGS = Collections.emptyList();
final static DocSetAndTriplePattern EMPTY_DOCSET = new DocSetAndTriplePattern(new EmptyDocSet(), null);
final static DocSetAndTriplePattern EMPTY_DOCSET = new DocSetAndTriplePattern(new EmptyDocSet(), null, null);
final static List<DocSetAndTriplePattern> NULL_DOCSETS = new ArrayList<DocSetAndTriplePattern>(2);
static {
NULL_DOCSETS.add(EMPTY_DOCSET);
Expand All @@ -72,9 +71,10 @@ public class QueryIterBasicGraphPattern2 extends QueryIter1 {
private final BasicPattern bgp;
private OpFilter filter = NULL_FILTER;

private final DocSetAndTriplePattern master;
private final DocIterator masterIterator;
private final List<DocSetAndTriplePattern> subsequents;
private DocSetAndTriplePattern master;
private DocIterator masterIterator;
private List<DocSetAndTriplePattern> subsequents;
private Iterator<DocSetAndTriplePattern> dstpIterator;

/**
* Builds a new iterator with the given data.
Expand All @@ -92,87 +92,80 @@ public QueryIterBasicGraphPattern2(

this.filter = filter != null ? filter : NULL_FILTER;
this.bgp = bgp;
final SolrQueryRequest request = (SolrQueryRequest)context.getContext().get(Names.SOLR_REQUEST_SYM);
final SolrIndexSearcher searcher = (SolrIndexSearcher) request.getSearcher();

try {
final List<DocSetAndTriplePattern> docsets = docsets(bgp, request, (LocalGraph)context.getActiveGraph());
final List<DocSetAndTriplePattern> docsets = docsets(
bgp,
(SolrQueryRequest)context.getContext().get(Names.SOLR_REQUEST_SYM),
(LocalGraph)context.getActiveGraph());
master = docsets.get(0);
masterIterator = master.children.iterator();
subsequents = docsets.subList(1, docsets.size());

/*
1 -->
Q ---> 2
Q --->
*/
// NodeDocSet pivot = iterator.next();

// PatternDocSet pivot = input instanceof ExtendedQueryIterator ? ((ExtendedQueryIterator)input).patternDocSet() : iterator.next();

// while (iterator.hasNext()) {
// final PatternDocSet subsequent = iterator.next();
// pivot = collectBindings(pivot, subsequent, searcher);
// }
//
// final List<Binding> bindings = collectBindings(pivot, searcher);
//
// this.docset = pivot;
// this.iterator = bindings.iterator();
dstpIterator = subsequents.iterator();
} catch (final Exception exception) {
LOGGER.error(MessageCatalog._00113_NWS_FAILURE, exception);
// FIXME : NULL OBJECTS
master = EMPTY_DOCSET;
masterIterator = master.children.iterator();
subsequents = Collections.emptyList();
dstpIterator = subsequents.iterator();
}
}

void collectBindings(
final Binding parent,
final int docId,
final DocSetAndTriplePattern second,
private List<Binding> bindings = new ArrayList<Binding>();
private Iterator<Binding> bindingsIterator;

void join(
final Binding parentBinding,
final int parent,
final DocSetAndTriplePattern data,
final SolrIndexSearcher searcher) throws IOException {

final Triple pattern = master.pattern;
final Document document = searcher.doc(docId);
final BindingMap binding = BindingFactory.create(parent);
final Triple masterSourcePattern = master.pattern;
final Document triple = searcher.doc(parent);
final BindingMap binding = parentBinding != null
? BindingFactory.create(parentBinding)
: BindingFactory.create();

final BooleanQuery query = new BooleanQuery();

collectBinding(pattern.getSubject(), second.pattern.getSubject(), binding, document, Field.S, query);
collectBinding(pattern.getPredicate(), second.pattern.getPredicate(), binding, document, Field.P, query);
collectBinding(pattern.getObject(), second.pattern.getObject(), binding, document, Field.O, query);
collectBinding(masterSourcePattern.getSubject(), data.pattern.getSubject(), binding, triple, Field.S, query);
collectBinding(masterSourcePattern.getPredicate(), data.pattern.getPredicate(), binding, triple, Field.P, query);
collectBinding(masterSourcePattern.getObject(), data.pattern.getObject(), binding, triple, Field.O, query);

final DocSet docset = query.clauses().isEmpty()
? second.children
: searcher.getDocSet(query, second.children);
final DocSet result = query.clauses().isEmpty()
? data.children
: searcher.getDocSet(query, data.children);


}



List<Binding> collectBindings(
final PatternDocSet docset,
final SolrIndexSearcher searcher) throws IOException {
final DocIterator iterator = docset.iterator();
final List<Binding> bindings = new ArrayList<Binding>(docset.size());
final DocIterator iterator = result.iterator();

while (iterator.hasNext()) {
final Document document = searcher.doc(iterator.nextDoc());
final Triple pattern = docset.getTriplePattern();
final BindingMap binding = BindingFactory.create(docset.getParentBinding());

collectBinding(pattern.getSubject(), binding, document, Field.S);
collectBinding(pattern.getPredicate(), binding, document, Field.P);
collectBinding(pattern.getObject(), binding, document, Field.O);

if (!binding.isEmpty()) {
bindings.add(binding);
while (iterator.hasNext()) {
if (dstpIterator.hasNext()) {
join(binding, iterator.nextDoc(), dstpIterator.next(), searcher);
} else {
join(binding, iterator.nextDoc(), data.pattern, searcher);
}
}
}

void join(
final Binding parentBinding,
final int current,
final Triple pattern,
final SolrIndexSearcher searcher) throws IOException {

final Document triple = searcher.doc(current);
final BindingMap binding = parentBinding != null
? BindingFactory.create(parentBinding)
: BindingFactory.create();

collectLeafBinding(pattern.getSubject(), binding, triple, Field.S);
collectLeafBinding(pattern.getPredicate(), binding, triple, Field.P);
collectLeafBinding(pattern.getObject(), binding, triple, Field.O);

return bindings;
bindings.add(binding);
}

void collectBinding(
void collectLeafBinding(
final Node member,
final BindingMap binding,
final Document document,
Expand Down Expand Up @@ -250,51 +243,67 @@ List<DocSetAndTriplePattern> docsets(final BasicPattern bgp, final SolrQueryRequ
}
}

return new DocSetAndTriplePattern(request.getSearcher().getDocSet(query), triplePattern);
return new DocSetAndTriplePattern(request.getSearcher().getDocSet(query), triplePattern, query);
} catch (final IOException exception) {
LOGGER.error(MessageCatalog._00118_IO_FAILURE, exception);
return new DocSetAndTriplePattern(new EmptyDocSet(), triplePattern);
return new DocSetAndTriplePattern(new EmptyDocSet(), triplePattern, null);
} catch (final SyntaxError exception) {
LOGGER.error(MessageCatalog._00119_QUERY_PARSING_FAILURE, exception);
return new DocSetAndTriplePattern(new EmptyDocSet(), triplePattern);
return new DocSetAndTriplePattern(new EmptyDocSet(), triplePattern, null);
} catch (final Exception exception) {
LOGGER.error(MessageCatalog._00113_NWS_FAILURE, exception);
return new DocSetAndTriplePattern(new EmptyDocSet(), triplePattern);
return new DocSetAndTriplePattern(new EmptyDocSet(), triplePattern, null);
}
})
.sorted(comparing(DocSetAndTriplePattern::size))
.collect(toList());

// if (LOGGER.isDebugEnabled()) {
// final long tid = System.currentTimeMillis();
// docsets.stream().forEach(
// docset -> LOGGER.debug(
// MessageCatalog._00120_BGP_EXPLAIN,
// tid,
// docset.getTriplePattern(),
// ((LeafPatternDocSet)docset).getQuery(),
// docset.size()));
// }
if (LOGGER.isDebugEnabled()) {
final long tid = System.currentTimeMillis();
docsets.stream().forEach(
data -> LOGGER.debug(
MessageCatalog._00120_BGP_EXPLAIN,
tid,
data.pattern,
data.query,
data.children.size()));
}

return (docsets.size() > 0 && docsets.iterator().next().size() > 0) ? docsets : NULL_DOCSETS;
}

// Per gestire i prodotti cartesiani senza dover ricordarmi che non devo fare next sull'iteratore
private List<Binding> preparedBindings;

@Override
protected boolean hasNextBinding() {
while (masterIterator.hasNext()) {
final int docId = masterIterator.next();
final Triple mainPattern = master.pattern;


if (bindingsIterator != null && bindingsIterator.hasNext()) {
return true;
}

try {
final SolrQueryRequest request = (SolrQueryRequest)getExecContext().getContext().get(Names.SOLR_REQUEST_SYM);
final SolrIndexSearcher searcher = (SolrIndexSearcher) request.getSearcher();

while (masterIterator.hasNext()) {
bindings.clear();
final int docId = masterIterator.next();
if (dstpIterator.hasNext()) {
join(null, docId, dstpIterator.next(), searcher);
} else {
join(null, docId, master.pattern, searcher);
}
if (!bindings.isEmpty()) {
bindingsIterator = bindings.iterator();
return true;
}
}
return false;
} catch (final Exception exception) {
throw new RuntimeException(exception);
}
}

@Override
protected Binding moveToNextBinding() {
return iterator.next();
return bindingsIterator.next();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,6 @@ protected QueryIterator execute(
}

Explain.explain("Reorder/generic", pattern, execCxt.getContext()) ;
return new QueryIterBasicGraphPattern(input, pattern, execCxt, null) ;
return new QueryIterBasicGraphPattern2(input, pattern, execCxt, null) ;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,12 @@ public void queryWithTwoVariables() throws Exception {
}

@Test
public void multipleTriplePatterns_I() throws Exception {
public void twoTriplePatterns() throws Exception {
selectTest(misteryGuest("ex013.rq", "ex012.ttl"));
}

@Test
public void multipleTriplePatterns_II() throws Exception {
public void threeTriplePatterns() throws Exception {
selectTest(misteryGuest("ex015.rq", "ex012.ttl"));
}

Expand Down

0 comments on commit fbe3bc7

Please sign in to comment.