mirror of https://github.com/apache/lucene.git
SOLR-8925: Integrate the GraphTermsQuery into the gatherNodes expression
This commit is contained in:
parent
d66f5515e6
commit
9ce830d8f2
|
@ -133,7 +133,7 @@ public class GraphTermsQParserPlugin extends QParserPlugin {
|
|||
collectTermContext(reader, contexts, termContexts, this.queryTerms);
|
||||
for(int i=0; i<termContexts.length; i++) {
|
||||
TermContext termContext = termContexts[i];
|
||||
if(termContext != null && termContext.docFreq() < this.maxDocFreq) {
|
||||
if(termContext != null && termContext.docFreq() <= this.maxDocFreq) {
|
||||
this.finalContexts.add(termContext);
|
||||
this.finalTerms.add(queryTerms[i]);
|
||||
}
|
||||
|
|
|
@ -125,7 +125,7 @@ public class TestGraphTermsQParserPlugin extends SolrTestCaseJ4 {
|
|||
|
||||
//Test with int field
|
||||
params = new ModifiableSolrParams();
|
||||
params.add("q", "{!graphTerms f=test_ti maxDocFreq=3}5,10");
|
||||
params.add("q", "{!graphTerms f=test_ti maxDocFreq=2}5,10");
|
||||
params.add("sort", "id asc");
|
||||
assertQ(req(params, "indent", "on"), "*[count(//doc)=2]",
|
||||
"//result/doc[1]/float[@name='id'][.='6.0']",
|
||||
|
|
|
@ -66,6 +66,7 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
private Iterator<Tuple> out;
|
||||
private Traversal traversal;
|
||||
private List<Metric> metrics;
|
||||
private int maxDocFreq;
|
||||
|
||||
public GatherNodesStream(String zkHost,
|
||||
String collection,
|
||||
|
@ -76,7 +77,8 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
Map queryParams,
|
||||
List<Metric> metrics,
|
||||
boolean trackTraversal,
|
||||
Set<Traversal.Scatter> scatter) {
|
||||
Set<Traversal.Scatter> scatter,
|
||||
int maxDocFreq) {
|
||||
|
||||
init(zkHost,
|
||||
collection,
|
||||
|
@ -87,7 +89,8 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
queryParams,
|
||||
metrics,
|
||||
trackTraversal,
|
||||
scatter);
|
||||
scatter,
|
||||
maxDocFreq);
|
||||
}
|
||||
|
||||
public GatherNodesStream(StreamExpression expression, StreamFactory factory) throws IOException {
|
||||
|
@ -185,10 +188,11 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
useDefaultTraversal = true;
|
||||
}
|
||||
|
||||
StreamExpressionNamedParameter scopeExpression = factory.getNamedOperand(expression, "localScope");
|
||||
StreamExpressionNamedParameter docFreqExpression = factory.getNamedOperand(expression, "maxDocFreq");
|
||||
int docFreq = -1;
|
||||
|
||||
if(trackExpression != null) {
|
||||
trackTraversal = Boolean.parseBoolean(((StreamExpressionValue) trackExpression.getParameter()).getValue());
|
||||
if(docFreqExpression != null) {
|
||||
docFreq = Integer.parseInt(((StreamExpressionValue) docFreqExpression.getParameter()).getValue());
|
||||
}
|
||||
|
||||
Map<String,String> params = new HashMap<String,String>();
|
||||
|
@ -197,6 +201,7 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
!namedParam.getName().equals("gather") &&
|
||||
!namedParam.getName().equals("walk") &&
|
||||
!namedParam.getName().equals("scatter") &&
|
||||
!namedParam.getName().equals("maxDocFreq") &&
|
||||
!namedParam.getName().equals("trackTraversal"))
|
||||
{
|
||||
params.put(namedParam.getName(), namedParam.getParameter().toString().trim());
|
||||
|
@ -228,7 +233,8 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
params,
|
||||
metrics,
|
||||
trackTraversal,
|
||||
scatter);
|
||||
scatter,
|
||||
docFreq);
|
||||
}
|
||||
|
||||
private void init(String zkHost,
|
||||
|
@ -240,7 +246,8 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
Map queryParams,
|
||||
List<Metric> metrics,
|
||||
boolean trackTraversal,
|
||||
Set<Traversal.Scatter> scatter) {
|
||||
Set<Traversal.Scatter> scatter,
|
||||
int maxDocFreq) {
|
||||
this.zkHost = zkHost;
|
||||
this.collection = collection;
|
||||
this.tupleStream = tupleStream;
|
||||
|
@ -251,6 +258,7 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
this.metrics = metrics;
|
||||
this.trackTraversal = trackTraversal;
|
||||
this.scatter = scatter;
|
||||
this.maxDocFreq = maxDocFreq;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -298,6 +306,9 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
|
||||
expression.addParameter(new StreamExpressionNamedParameter("zkHost", zkHost));
|
||||
expression.addParameter(new StreamExpressionNamedParameter("gather", zkHost));
|
||||
if(maxDocFreq > -1) {
|
||||
expression.addParameter(new StreamExpressionNamedParameter("maxDocFreq", Integer.toString(maxDocFreq)));
|
||||
}
|
||||
expression.addParameter(new StreamExpressionNamedParameter("walk", traverseFrom+"->"+traverseTo));
|
||||
expression.addParameter(new StreamExpressionNamedParameter("trackTraversal", Boolean.toString(trackTraversal)));
|
||||
|
||||
|
@ -410,7 +421,7 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
}
|
||||
|
||||
if(queryParams.containsKey("fl")) {
|
||||
String flString = (String)queryParams.get("fl");
|
||||
String flString = queryParams.get("fl");
|
||||
String[] flArray = flString.split(",");
|
||||
for(String f : flArray) {
|
||||
flSet.add(f.trim());
|
||||
|
@ -433,14 +444,22 @@ public class GatherNodesStream extends TupleStream implements Expressible {
|
|||
|
||||
StringBuffer nodeQuery = new StringBuffer();
|
||||
|
||||
boolean comma = false;
|
||||
for(String node : nodes) {
|
||||
nodeQuery.append(node).append(" ");
|
||||
if(comma) {
|
||||
nodeQuery.append(",");
|
||||
}
|
||||
nodeQuery.append(node);
|
||||
comma = true;
|
||||
}
|
||||
|
||||
String q = traverseTo + ":(" + nodeQuery.toString().trim() + ")";
|
||||
if(maxDocFreq > -1) {
|
||||
String docFreqParam = " maxDocFreq="+maxDocFreq;
|
||||
joinParams.put("q", "{!graphTerms f=" + traverseTo + docFreqParam + "}" + nodeQuery.toString());
|
||||
} else {
|
||||
joinParams.put("q", "{!terms f=" + traverseTo+"}" + nodeQuery.toString());
|
||||
}
|
||||
|
||||
|
||||
joinParams.put("q", q);
|
||||
TupleStream stream = null;
|
||||
try {
|
||||
stream = new UniqueStream(new CloudSolrStream(zkHost, collection, joinParams), new MultipleFieldEqualitor(new FieldEqualitor(gather), new FieldEqualitor(traverseTo)));
|
||||
|
|
|
@ -326,6 +326,23 @@ public class GraphExpressionTest extends AbstractFullDistribZkTestBase {
|
|||
assertTrue(tuples.get(2).getString("node").equals("basket3"));
|
||||
assertTrue(tuples.get(3).getString("node").equals("basket4"));
|
||||
|
||||
|
||||
//Test maxDocFreq param
|
||||
String docFreqExpr = "gatherNodes(collection1, " +
|
||||
"walk=\"product1, product7->product_s\"," +
|
||||
"maxDocFreq=\"2\","+
|
||||
"gather=\"basket_s\")";
|
||||
|
||||
stream = (GatherNodesStream)factory.constructStream(docFreqExpr);
|
||||
stream.setStreamContext(context);
|
||||
|
||||
tuples = getTuples(stream);
|
||||
Collections.sort(tuples, new FieldComparator("node", ComparatorOrder.ASCENDING));
|
||||
assertTrue(tuples.size() == 1);
|
||||
assertTrue(tuples.get(0).getString("node").equals("basket2"));
|
||||
|
||||
|
||||
|
||||
String expr2 = "gatherNodes(collection1, " +
|
||||
expr+","+
|
||||
"walk=\"node->basket_s\"," +
|
||||
|
|
Loading…
Reference in New Issue