mkhludnev commented on code in PR #1691:
URL: https://github.com/apache/solr/pull/1691#discussion_r1252046404


##########
solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java:
##########
@@ -355,43 +375,163 @@ private static String resolveAlias(String fromIndex, 
ZkController zkController)
     }
   }
 
-  private static String findLocalReplicaForFromIndex(ZkController 
zkController, String fromIndex) {
-    String fromReplica = null;
-
-    String nodeName = zkController.getNodeName();
-    for (Slice slice :
-        
zkController.getClusterState().getCollection(fromIndex).getActiveSlicesArr()) {
-      if (fromReplica != null)
-        throw new SolrException(
-            SolrException.ErrorCode.BAD_REQUEST,
-            "SolrCloud join: To join with a sharded collection, use 
method=crossCollection.");
-
-      for (Replica replica : slice.getReplicas()) {
-        if (replica.getNodeName().equals(nodeName)) {
-          fromReplica = replica.getStr(ZkStateReader.CORE_NAME_PROP);
-          // found local replica, but is it Active?
-          if (replica.getState() != Replica.State.ACTIVE)
-            throw new SolrException(
-                SolrException.ErrorCode.BAD_REQUEST,
-                "SolrCloud join: "
-                    + fromIndex
-                    + " has a local replica ("
-                    + fromReplica
-                    + ") on "
-                    + nodeName
-                    + ", but it is "
-                    + replica.getState());
+  private static String findLocalReplicaForFromIndex(
+      ZkController zkController,
+      String fromIndex,
+      SolrCore toCore,
+      String toField,
+      String fromField,
+      SolrParams localParams) {
+    final DocCollection fromCollection = 
zkController.getClusterState().getCollection(fromIndex);
+    final String nodeName = zkController.getNodeName();
+    final String hitTheRoad =
+        "SolrCloud join: To join with a collection that might not be 
co-located, use method=crossCollection.";
+    if (fromCollection.getSlices().size() == 1) {
+      String fromReplica = null;
+
+      for (Slice slice : fromCollection.getActiveSlicesArr()) {
+        if (fromReplica != null)
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, 
hitTheRoad);
+
+        for (Replica replica : slice.getReplicas()) {
+          if (replica.getNodeName().equals(nodeName)) {
+            fromReplica = replica.getStr(ZkStateReader.CORE_NAME_PROP);
+            // found local replica, but is it Active?
+            if (replica.getState() != Replica.State.ACTIVE)
+              throw new SolrException(
+                  SolrException.ErrorCode.BAD_REQUEST,
+                  "SolrCloud join: "
+                      + fromIndex
+                      + " has a local replica ("
+                      + fromReplica
+                      + ") on "
+                      + nodeName
+                      + ", but it is "
+                      + replica.getState());
+
+            break;
+          }
+        }
+      }
 
+      if (fromReplica == null)
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, 
hitTheRoad);
+
+      return fromReplica;
+    } else { // sharded from
+      final CloudDescriptor toCoreDescriptor = 
toCore.getCoreDescriptor().getCloudDescriptor();
+      final String toShardId = toCoreDescriptor.getShardId();
+      final DocCollection toCollection =
+          
zkController.getClusterState().getCollection(toCoreDescriptor.getCollectionName());
+
+      String routerName = checkRouters(toCollection, fromCollection, 
hitTheRoad);
+      boolean checkField = false;
+      switch (routerName) {
+        case PlainIdRouter.NAME: // mandatory field check
+          checkField = true;
+          checkRouterField(toCore, toCollection, toField, hitTheRoad);
+          break;
+        case CompositeIdRouter.NAME: // let you shoot your legs
+          if (localParams.getBool(CHECK_ROUTER_FIELD, true)) {
+            checkField = true;
+            checkRouterField(toCore, toCollection, toField, hitTheRoad);
+          }
           break;
+        case ImplicitDocRouter.NAME: // don't check field, you know what you do
+        default:
+          break;
+      }
+      // if router field is not set, "to" may fallback to uniqueKey
+      if (localParams.getBool(CHECK_ROUTER_FIELD, true)) {
+        checkRouterField(toCore, toCollection, toField, hitTheRoad);
+      }
+      checkShardNumber(toCollection, fromCollection, hitTheRoad);

Review Comment:
   ok. Thanks for the clue. I've moved to the range check. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@solr.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@solr.apache.org
For additional commands, e-mail: issues-h...@solr.apache.org

Reply via email to