Hello,

Why is q=$JOIN_QUERY parsed differently than q=($JOIN_QUERY) where
$JOIN_QUERY is a query with a join? In other words, why does adding
enclosing parentheses change the query?

Context:

There are two cores: parent and child.

In the parent core:

{
  "p": "p1",
  "x_s": "x1"
}

In the child core:

{
  "id": "c1",
  "p_id_s": "p1",
  "y_s": "y1",
  "z_s": "z1"
}


The following query returns p1 (which is expected):

q={!join fromIndex=child from=p_id_s to=id}y_s:y1 AND z_s:z1


The following query returns nothing (which is not expected):

q=({!join fromIndex=child from=p_id_s to=id}y_s:y1 AND z_s:z1)


See below for the complete test case.


Thank you,

Mathieu Larose



/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.solr.search.join;

import com.google.common.collect.ImmutableMap;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.core.SolrCore;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.servlet.DirectSolrConnection;
import org.junit.BeforeClass;
import org.junit.Test;

public class JoinTest extends SolrTestCaseJ4 {

  private static SolrCore parentCore;
  private static SolrCore childCore;

  @BeforeClass
  public static void beforeTests() throws Exception {
    initCore("solrconfig.xml", "schema_latest.xml", TEST_HOME(),
"collection1");

    parentCore = h.getCoreContainer().create("parent",
ImmutableMap.of("configSet", "minimal"));
    update(parentCore, add(doc("id", "p1", "x_s", "x1")));
    update(parentCore, commit());

    childCore = h.getCoreContainer().create("child",
ImmutableMap.of("configSet", "minimal"));
    update(childCore, add(doc("id", "c1", "p_id_s", "p1", "y_s", "y1",
"z_s", "z1")));
    update(childCore, commit());
  }

  public static String update(SolrCore core, String xml) throws Exception {
    DirectSolrConnection connection = new DirectSolrConnection(core);
    SolrRequestHandler handler = core.getRequestHandler("/update");
    return connection.request(handler, null, xml);
  }

  /**
   * When a child match for multiple child filters it returns the parent
   */
  @Test
  public void whenAChildMatchForMultipleChildFiltersItReturnsTheParent()
throws Exception {
    SolrParams solrParams = new SolrQuery("q", "{!join fromIndex=child
from=p_id_s to=id}y_s:y1 AND z_s:z1", "qt", "/select", "wt", "json",
"indent", "true", "fl", "id");
    LocalSolrQueryRequest queryRequest = new
LocalSolrQueryRequest(parentCore, solrParams);

    // OK
    assertJQ(queryRequest,
"/response=={'numFound':1,'start':0,'docs':[{'id': 'p1'}]}");
  }

  /**
   * When a child match for multiple child filters *with parentheses* it
returns the parent
   * <p>
   * The only difference between this test and {@link
JoinTest#whenAChildMatchForMultipleChildFiltersItReturnsTheParent} is the
enclosing parentheses.
   */
  @Test
  public void
whenAChildMatchForMultipleChildFiltersWithParenthesesItReturnsTheParent()
throws Exception {
    SolrParams solrParams = new SolrQuery("q", "({!join fromIndex=child
from=p_id_s to=id}y_s:y1 AND z_s:z1)", "qt", "/select", "wt", "json",
"indent", "true", "fl", "id");
    LocalSolrQueryRequest queryRequest = new
LocalSolrQueryRequest(parentCore, solrParams);

    // FAIL
    assertJQ(queryRequest,
"/response=={'numFound':1,'start':0,'docs':[{'id': 'p1'}]}");
  }
}

Reply via email to