From 7e28f316fa11077d59a45271997ada9ea8b926bf Mon Sep 17 00:00:00 2001 From: Daniel Collins Date: Thu, 1 Dec 2016 12:36:54 +0000 Subject: [PATCH] Support spanQueries in CoreParser and SolrCoreParser --- .../lucene/queryparser/xml/CoreParser.java | 9 ++++-- .../apache/solr/search/SolrCoreParser.java | 30 +++++++++++++------ .../apache/solr/search/SolrQueryBuilder.java | 19 +++++++++++- .../apache/solr/search/HandyQueryBuilder.java | 23 ++++++++++++-- 4 files changed, 67 insertions(+), 14 deletions(-) diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java index 1bf82ac3f7e2..31a81c6360bf 100644 --- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java +++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java @@ -20,6 +20,7 @@ import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.queryparser.xml.builders.*; import org.apache.lucene.search.Query; +import org.apache.lucene.search.spans.SpanQuery; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -31,7 +32,7 @@ /** * Assembles a QueryBuilder which uses only core Lucene Query objects */ -public class CoreParser implements QueryBuilder { +public class CoreParser implements QueryBuilder, SpanQueryBuilder { protected String defaultField; protected Analyzer analyzer; @@ -141,9 +142,13 @@ static Document parseXML(InputStream pXmlFile) throws ParserException { return doc; } - @Override public Query getQuery(Element e) throws ParserException { return queryFactory.getQuery(e); } + + @Override + public SpanQuery getSpanQuery(Element e) throws ParserException { + return spanFactory.getSpanQuery(e); + } } diff --git a/solr/core/src/java/org/apache/solr/search/SolrCoreParser.java b/solr/core/src/java/org/apache/solr/search/SolrCoreParser.java index 3f6596b7cc24..6a20c10f89d3 100755 --- a/solr/core/src/java/org/apache/solr/search/SolrCoreParser.java +++ b/solr/core/src/java/org/apache/solr/search/SolrCoreParser.java @@ -21,6 +21,8 @@ import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.queryparser.xml.CoreParser; import org.apache.lucene.queryparser.xml.QueryBuilder; +import org.apache.lucene.queryparser.xml.builders.SpanQueryBuilder; +import org.apache.solr.common.SolrException; import org.apache.solr.common.util.NamedList; import org.apache.solr.core.SolrResourceLoader; import org.apache.solr.request.SolrQueryRequest; @@ -42,7 +44,7 @@ public SolrCoreParser(String defaultField, Analyzer analyzer, } @Override - public void init(NamedList initArgs) { + public void init(@SuppressWarnings("rawtypes") NamedList initArgs) { if (initArgs == null || initArgs.size() == 0) { return; } @@ -53,19 +55,29 @@ public void init(NamedList initArgs) { loader = req.getCore().getResourceLoader(); } + @SuppressWarnings("unchecked") final Iterable> args = initArgs; for (final Map.Entry entry : args) { final String queryName = entry.getKey(); final String queryBuilderClassName = (String)entry.getValue(); - final SolrQueryBuilder queryBuilder = loader.newInstance( - queryBuilderClassName, - SolrQueryBuilder.class, - null, - new Class[] {String.class, Analyzer.class, SolrQueryRequest.class, QueryBuilder.class}, - new Object[] {defaultField, analyzer, req, this}); - - this.queryFactory.addBuilder(queryName, queryBuilder); + try { + final SolrQueryBuilder queryBuilder = loader.newInstance( + queryBuilderClassName, + SolrQueryBuilder.class, + null, + new Class[] {String.class, Analyzer.class, SolrQueryRequest.class, QueryBuilder.class}, + new Object[] {defaultField, analyzer, req, this}); + this.queryFactory.addBuilder(queryName, queryBuilder); + } catch (SolrException ex) { + final SolrQueryBuilder queryBuilder = loader.newInstance( + queryBuilderClassName, + SolrQueryBuilder.class, + null, + new Class[] {String.class, Analyzer.class, SolrQueryRequest.class, QueryBuilder.class, SpanQueryBuilder.class}, + new Object[] {defaultField, analyzer, req, this, this}); + this.queryFactory.addBuilder(queryName, queryBuilder); + } } } diff --git a/solr/core/src/java/org/apache/solr/search/SolrQueryBuilder.java b/solr/core/src/java/org/apache/solr/search/SolrQueryBuilder.java index e81351283378..4d35da7a35c8 100644 --- a/solr/core/src/java/org/apache/solr/search/SolrQueryBuilder.java +++ b/solr/core/src/java/org/apache/solr/search/SolrQueryBuilder.java @@ -17,18 +17,35 @@ package org.apache.solr.search; import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.queryparser.xml.ParserException; import org.apache.lucene.queryparser.xml.QueryBuilder; +import org.apache.lucene.queryparser.xml.builders.SpanQueryBuilder; +import org.apache.lucene.search.spans.SpanQuery; import org.apache.solr.request.SolrQueryRequest; +import org.w3c.dom.Element; -public abstract class SolrQueryBuilder implements QueryBuilder { +public abstract class SolrQueryBuilder implements QueryBuilder, SpanQueryBuilder { protected final SolrQueryRequest req; protected final QueryBuilder queryFactory; + protected SpanQueryBuilder spanFactory; + @Deprecated public SolrQueryBuilder(String defaultField, Analyzer analyzer, SolrQueryRequest req, QueryBuilder queryFactory) { this.req = req; this.queryFactory = queryFactory; } + public SolrQueryBuilder(String defaultField, Analyzer analyzer, + SolrQueryRequest req, QueryBuilder queryFactory, SpanQueryBuilder spanFactory) { + this(defaultField, analyzer, req, queryFactory); + this.spanFactory = spanFactory; + } + + @Override + public SpanQuery getSpanQuery(Element e) throws ParserException { + return null; + } + } diff --git a/solr/core/src/test/org/apache/solr/search/HandyQueryBuilder.java b/solr/core/src/test/org/apache/solr/search/HandyQueryBuilder.java index 14a8aac66f50..bb4a1da4a3f2 100644 --- a/solr/core/src/test/org/apache/solr/search/HandyQueryBuilder.java +++ b/solr/core/src/test/org/apache/solr/search/HandyQueryBuilder.java @@ -20,9 +20,12 @@ import org.apache.lucene.queryparser.xml.DOMUtils; import org.apache.lucene.queryparser.xml.ParserException; import org.apache.lucene.queryparser.xml.QueryBuilder; +import org.apache.lucene.queryparser.xml.builders.SpanQueryBuilder; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Query; +import org.apache.lucene.search.spans.SpanOrQuery; +import org.apache.lucene.search.spans.SpanQuery; import org.apache.solr.request.SolrQueryRequest; import org.w3c.dom.Element; @@ -31,8 +34,8 @@ public class HandyQueryBuilder extends SolrQueryBuilder { public HandyQueryBuilder(String defaultField, Analyzer analyzer, - SolrQueryRequest req, QueryBuilder queryFactory) { - super(defaultField, analyzer, req, queryFactory); + SolrQueryRequest req, QueryBuilder queryFactory, SpanQueryBuilder spanFactory) { + super(defaultField, analyzer, req, queryFactory, spanFactory); } @Override @@ -45,9 +48,25 @@ public Query getQuery(Element e) throws ParserException { return bq.build(); } + @Override + public SpanQuery getSpanQuery(Element e) throws ParserException { + SpanQuery subQueries[] = { + getSubSpanQuery(e, "Left"), + getSubSpanQuery(e, "Right"), + }; + + return new SpanOrQuery(subQueries); + } + private Query getSubQuery(Element e, String name) throws ParserException { Element subE = DOMUtils.getChildByTagOrFail(e, name); subE = DOMUtils.getFirstChildOrFail(subE); return queryFactory.getQuery(subE); } + + private SpanQuery getSubSpanQuery(Element e, String name) throws ParserException { + Element subE = DOMUtils.getChildByTagOrFail(e, name); + subE = DOMUtils.getFirstChildOrFail(subE); + return spanFactory.getSpanQuery(subE); + } }