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