You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2013/12/03 17:10:58 UTC
svn commit: r1547452 - in /lucene/dev/trunk/solr: ./
core/src/test/org/apache/solr/cloud/
solrj/src/java/org/apache/solr/common/cloud/
Author: markrmiller
Date: Tue Dec 3 16:10:58 2013
New Revision: 1547452
URL: http://svn.apache.org/r1547452
Log:
SOLR-5502: A "/" in a document id will cause an exception to be thrown when using the composite id router.
Modified:
lucene/dev/trunk/solr/CHANGES.txt
lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java
lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java
lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1547452&r1=1547451&r2=1547452&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Tue Dec 3 16:10:58 2013
@@ -189,6 +189,9 @@ Bug Fixes
* SOLR-5527: DIH logs spurious warning for special commands. (shalin)
+* SOLR-5502: A "/" in a document id will cause an exception to be thrown
+ when using the composite id router. (Anshum Gupta via Mark Miller)
+
Optimizations
----------------------
@@ -220,9 +223,6 @@ Other Changes
* SOLR-5499: Log a warning if /get is not registered when using SolrCloud.
(Daniel Collins via shalin)
-* SOLR-5517: Return HTTP error on POST requests with no Content-Type.
- (Ryan Ernst, Uwe Schindler)
-
================== 4.6.0 ==================
Versions of Major Components
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java?rev=1547452&r1=1547451&r2=1547452&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java Tue Dec 3 16:10:58 2013
@@ -148,30 +148,33 @@ public class ShardRoutingTest extends Ab
doAddDoc("d!doc3");
doAddDoc("e!doc4");
doAddDoc("f1!f2!doc5");
+ // Check successful addition of a document with a '/' in the id part.
+ doAddDoc("f1!f2!doc5/5");
doRTG("b!doc1");
doRTG("c!doc2");
doRTG("d!doc3");
doRTG("e!doc4");
doRTG("f1!f2!doc5");
+ doRTG("f1!f2!doc5/5");
doRTG("b!doc1,c!doc2");
doRTG("d!doc3,e!doc4");
commit();
- doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*");
- doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*", "shards","shard1,shard2,shard3,shard4");
- doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*", shardKeys,"b!,c!,d!,e!,f1!f2!");
+ doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*");
+ doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", "shards","shard1,shard2,shard3,shard4");
+ doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", shardKeys,"b!,c!,d!,e!,f1!f2!");
doQuery("b!doc1", "q","*:*", shardKeys,"b!");
doQuery("c!doc2", "q","*:*", shardKeys,"c!");
- doQuery("d!doc3,f1!f2!doc5", "q","*:*", shardKeys,"d!");
+ doQuery("d!doc3,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", shardKeys,"d!");
doQuery("e!doc4", "q","*:*", shardKeys,"e!");
- doQuery("f1!f2!doc5,d!doc3", "q","*:*", shardKeys,"f1/8!");
+ doQuery("f1!f2!doc5,d!doc3,f1!f2!doc5/5", "q","*:*", shardKeys,"f1/8!");
// try using shards parameter
doQuery("b!doc1", "q","*:*", "shards",bucket1);
doQuery("c!doc2", "q","*:*", "shards",bucket2);
- doQuery("d!doc3,f1!f2!doc5", "q","*:*", "shards",bucket3);
+ doQuery("d!doc3,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", "shards",bucket3);
doQuery("e!doc4", "q","*:*", "shards",bucket4);
@@ -181,16 +184,16 @@ public class ShardRoutingTest extends Ab
doQuery("b!doc1,c!doc2", "q","*:*", shardKeys,"b,c"); // query shards that would contain *documents* "b" and "c" (i.e. not prefixes). The upper bits are the same, so the shards should be the same.
doQuery("b!doc1,c!doc2", "q","*:*", shardKeys,"b/1!"); // top bit of hash(b)==1, so shard1 and shard2
- doQuery("d!doc3,e!doc4,f1!f2!doc5", "q","*:*", shardKeys,"d/1!"); // top bit of hash(b)==0, so shard3 and shard4
+ doQuery("d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", shardKeys,"d/1!"); // top bit of hash(b)==0, so shard3 and shard4
doQuery("b!doc1,c!doc2", "q","*:*", shardKeys,"b!,c!");
- doQuery("b!doc1,f1!f2!doc5,c!doc2,d!doc3,e!doc4", "q","*:*", shardKeys,"foo/0!");
+ doQuery("b!doc1,f1!f2!doc5,c!doc2,d!doc3,e!doc4,f1!f2!doc5/5", "q","*:*", shardKeys,"foo/0!");
// test targeting deleteByQuery at only certain shards
doDBQ("*:*", shardKeys,"b!");
commit();
- doQuery("c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*");
+ doQuery("c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*");
doAddDoc("b!doc1");
doDBQ("*:*", shardKeys,"f1!");
Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java?rev=1547452&r1=1547451&r2=1547452&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java Tue Dec 3 16:10:58 2013
@@ -143,7 +143,6 @@ public class TriLevelCompositeIdRoutingT
Set<String> doQueryGetUniqueIdKeys(String... queryParams) throws Exception {
QueryResponse rsp = cloudClient.query(params(queryParams));
Set<String> obtainedIdKeys = new HashSet<String>();
- Set<String> obtainedIdKeys2 = new HashSet<String>();
for (SolrDocument doc : rsp.getResults()) {
obtainedIdKeys.add(getKey((String) doc.get("id")));
}
Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java?rev=1547452&r1=1547451&r2=1547452&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java Tue Dec 3 16:10:58 2013
@@ -202,15 +202,16 @@ public class CompositeIdRouter extends H
} else {
numBits[0] = 16;
triLevel = false;
-
}
for (int i = 0; i < parts.length; i++) {
- int commaIdx = parts[i].indexOf(bitsSeparator);
+ if (i < pieces - 1) {
+ int commaIdx = parts[i].indexOf(bitsSeparator);
- if (commaIdx > 0) {
- numBits[i] = getNumBits(parts[i], commaIdx);
- parts[i] = parts[i].substring(0, commaIdx);
+ if (commaIdx > 0) {
+ numBits[i] = getNumBits(parts[i], commaIdx);
+ parts[i] = parts[i].substring(0, commaIdx);
+ }
}
hashes[i] = Hash.murmurhash3_x86_32(parts[i], 0, parts[i].length(), 0);
}
Re: svn commit: r1547452 - in /lucene/dev/trunk/solr: ./ core/src/test/org/apache/solr/cloud/ solrj/src/java/org/apache/solr/common/cloud/
Posted by Mark Miller <ma...@gmail.com>.
Nope - messed up on the merge conflict I think - thanks.
- Mark
On Dec 3, 2013, at 12:59 PM, Alan Woodward <al...@flax.co.uk> wrote:
> Hi Mark,
>
> I don't think you meant to remove the CHANGES entry for SOLR-5517 here?
>
> Alan Woodward
> www.flax.co.uk
>
>
> On 3 Dec 2013, at 16:10, markrmiller@apache.org wrote:
>
>> Author: markrmiller
>> Date: Tue Dec 3 16:10:58 2013
>> New Revision: 1547452
>>
>> URL: http://svn.apache.org/r1547452
>> Log:
>> SOLR-5502: A "/" in a document id will cause an exception to be thrown when using the composite id router.
>>
>> Modified:
>> lucene/dev/trunk/solr/CHANGES.txt
>> lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java
>> lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java
>> lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
>>
>> Modified: lucene/dev/trunk/solr/CHANGES.txt
>> URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1547452&r1=1547451&r2=1547452&view=diff
>> ==============================================================================
>> --- lucene/dev/trunk/solr/CHANGES.txt (original)
>> +++ lucene/dev/trunk/solr/CHANGES.txt Tue Dec 3 16:10:58 2013
>> @@ -189,6 +189,9 @@ Bug Fixes
>>
>> * SOLR-5527: DIH logs spurious warning for special commands. (shalin)
>>
>> +* SOLR-5502: A "/" in a document id will cause an exception to be thrown
>> + when using the composite id router. (Anshum Gupta via Mark Miller)
>> +
>> Optimizations
>> ----------------------
>>
>> @@ -220,9 +223,6 @@ Other Changes
>> * SOLR-5499: Log a warning if /get is not registered when using SolrCloud.
>> (Daniel Collins via shalin)
>>
>> -* SOLR-5517: Return HTTP error on POST requests with no Content-Type.
>> - (Ryan Ernst, Uwe Schindler)
>> -
>> ================== 4.6.0 ==================
>>
>> Versions of Major Components
>>
>> Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java
>> URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java?rev=1547452&r1=1547451&r2=1547452&view=diff
>> ==============================================================================
>> --- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java (original)
>> +++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java Tue Dec 3 16:10:58 2013
>> @@ -148,30 +148,33 @@ public class ShardRoutingTest extends Ab
>> doAddDoc("d!doc3");
>> doAddDoc("e!doc4");
>> doAddDoc("f1!f2!doc5");
>> + // Check successful addition of a document with a '/' in the id part.
>> + doAddDoc("f1!f2!doc5/5");
>>
>> doRTG("b!doc1");
>> doRTG("c!doc2");
>> doRTG("d!doc3");
>> doRTG("e!doc4");
>> doRTG("f1!f2!doc5");
>> + doRTG("f1!f2!doc5/5");
>> doRTG("b!doc1,c!doc2");
>> doRTG("d!doc3,e!doc4");
>>
>> commit();
>>
>> - doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*");
>> - doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*", "shards","shard1,shard2,shard3,shard4");
>> - doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*", shardKeys,"b!,c!,d!,e!,f1!f2!");
>> + doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*");
>> + doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", "shards","shard1,shard2,shard3,shard4");
>> + doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", shardKeys,"b!,c!,d!,e!,f1!f2!");
>> doQuery("b!doc1", "q","*:*", shardKeys,"b!");
>> doQuery("c!doc2", "q","*:*", shardKeys,"c!");
>> - doQuery("d!doc3,f1!f2!doc5", "q","*:*", shardKeys,"d!");
>> + doQuery("d!doc3,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", shardKeys,"d!");
>> doQuery("e!doc4", "q","*:*", shardKeys,"e!");
>> - doQuery("f1!f2!doc5,d!doc3", "q","*:*", shardKeys,"f1/8!");
>> + doQuery("f1!f2!doc5,d!doc3,f1!f2!doc5/5", "q","*:*", shardKeys,"f1/8!");
>>
>> // try using shards parameter
>> doQuery("b!doc1", "q","*:*", "shards",bucket1);
>> doQuery("c!doc2", "q","*:*", "shards",bucket2);
>> - doQuery("d!doc3,f1!f2!doc5", "q","*:*", "shards",bucket3);
>> + doQuery("d!doc3,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", "shards",bucket3);
>> doQuery("e!doc4", "q","*:*", "shards",bucket4);
>>
>>
>> @@ -181,16 +184,16 @@ public class ShardRoutingTest extends Ab
>> doQuery("b!doc1,c!doc2", "q","*:*", shardKeys,"b,c"); // query shards that would contain *documents* "b" and "c" (i.e. not prefixes). The upper bits are the same, so the shards should be the same.
>>
>> doQuery("b!doc1,c!doc2", "q","*:*", shardKeys,"b/1!"); // top bit of hash(b)==1, so shard1 and shard2
>> - doQuery("d!doc3,e!doc4,f1!f2!doc5", "q","*:*", shardKeys,"d/1!"); // top bit of hash(b)==0, so shard3 and shard4
>> + doQuery("d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", shardKeys,"d/1!"); // top bit of hash(b)==0, so shard3 and shard4
>>
>> doQuery("b!doc1,c!doc2", "q","*:*", shardKeys,"b!,c!");
>>
>> - doQuery("b!doc1,f1!f2!doc5,c!doc2,d!doc3,e!doc4", "q","*:*", shardKeys,"foo/0!");
>> + doQuery("b!doc1,f1!f2!doc5,c!doc2,d!doc3,e!doc4,f1!f2!doc5/5", "q","*:*", shardKeys,"foo/0!");
>>
>> // test targeting deleteByQuery at only certain shards
>> doDBQ("*:*", shardKeys,"b!");
>> commit();
>> - doQuery("c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*");
>> + doQuery("c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*");
>> doAddDoc("b!doc1");
>>
>> doDBQ("*:*", shardKeys,"f1!");
>>
>> Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java
>> URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java?rev=1547452&r1=1547451&r2=1547452&view=diff
>> ==============================================================================
>> --- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java (original)
>> +++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java Tue Dec 3 16:10:58 2013
>> @@ -143,7 +143,6 @@ public class TriLevelCompositeIdRoutingT
>> Set<String> doQueryGetUniqueIdKeys(String... queryParams) throws Exception {
>> QueryResponse rsp = cloudClient.query(params(queryParams));
>> Set<String> obtainedIdKeys = new HashSet<String>();
>> - Set<String> obtainedIdKeys2 = new HashSet<String>();
>> for (SolrDocument doc : rsp.getResults()) {
>> obtainedIdKeys.add(getKey((String) doc.get("id")));
>> }
>>
>> Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
>> URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java?rev=1547452&r1=1547451&r2=1547452&view=diff
>> ==============================================================================
>> --- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java (original)
>> +++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java Tue Dec 3 16:10:58 2013
>> @@ -202,15 +202,16 @@ public class CompositeIdRouter extends H
>> } else {
>> numBits[0] = 16;
>> triLevel = false;
>> -
>> }
>>
>> for (int i = 0; i < parts.length; i++) {
>> - int commaIdx = parts[i].indexOf(bitsSeparator);
>> + if (i < pieces - 1) {
>> + int commaIdx = parts[i].indexOf(bitsSeparator);
>>
>> - if (commaIdx > 0) {
>> - numBits[i] = getNumBits(parts[i], commaIdx);
>> - parts[i] = parts[i].substring(0, commaIdx);
>> + if (commaIdx > 0) {
>> + numBits[i] = getNumBits(parts[i], commaIdx);
>> + parts[i] = parts[i].substring(0, commaIdx);
>> + }
>> }
>> hashes[i] = Hash.murmurhash3_x86_32(parts[i], 0, parts[i].length(), 0);
>> }
>>
>>
>
Re: svn commit: r1547452 - in /lucene/dev/trunk/solr: ./ core/src/test/org/apache/solr/cloud/ solrj/src/java/org/apache/solr/common/cloud/
Posted by Alan Woodward <al...@flax.co.uk>.
Hi Mark,
I don't think you meant to remove the CHANGES entry for SOLR-5517 here?
Alan Woodward
www.flax.co.uk
On 3 Dec 2013, at 16:10, markrmiller@apache.org wrote:
> Author: markrmiller
> Date: Tue Dec 3 16:10:58 2013
> New Revision: 1547452
>
> URL: http://svn.apache.org/r1547452
> Log:
> SOLR-5502: A "/" in a document id will cause an exception to be thrown when using the composite id router.
>
> Modified:
> lucene/dev/trunk/solr/CHANGES.txt
> lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java
> lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java
> lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
>
> Modified: lucene/dev/trunk/solr/CHANGES.txt
> URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1547452&r1=1547451&r2=1547452&view=diff
> ==============================================================================
> --- lucene/dev/trunk/solr/CHANGES.txt (original)
> +++ lucene/dev/trunk/solr/CHANGES.txt Tue Dec 3 16:10:58 2013
> @@ -189,6 +189,9 @@ Bug Fixes
>
> * SOLR-5527: DIH logs spurious warning for special commands. (shalin)
>
> +* SOLR-5502: A "/" in a document id will cause an exception to be thrown
> + when using the composite id router. (Anshum Gupta via Mark Miller)
> +
> Optimizations
> ----------------------
>
> @@ -220,9 +223,6 @@ Other Changes
> * SOLR-5499: Log a warning if /get is not registered when using SolrCloud.
> (Daniel Collins via shalin)
>
> -* SOLR-5517: Return HTTP error on POST requests with no Content-Type.
> - (Ryan Ernst, Uwe Schindler)
> -
> ================== 4.6.0 ==================
>
> Versions of Major Components
>
> Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java
> URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java?rev=1547452&r1=1547451&r2=1547452&view=diff
> ==============================================================================
> --- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java (original)
> +++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/ShardRoutingTest.java Tue Dec 3 16:10:58 2013
> @@ -148,30 +148,33 @@ public class ShardRoutingTest extends Ab
> doAddDoc("d!doc3");
> doAddDoc("e!doc4");
> doAddDoc("f1!f2!doc5");
> + // Check successful addition of a document with a '/' in the id part.
> + doAddDoc("f1!f2!doc5/5");
>
> doRTG("b!doc1");
> doRTG("c!doc2");
> doRTG("d!doc3");
> doRTG("e!doc4");
> doRTG("f1!f2!doc5");
> + doRTG("f1!f2!doc5/5");
> doRTG("b!doc1,c!doc2");
> doRTG("d!doc3,e!doc4");
>
> commit();
>
> - doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*");
> - doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*", "shards","shard1,shard2,shard3,shard4");
> - doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*", shardKeys,"b!,c!,d!,e!,f1!f2!");
> + doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*");
> + doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", "shards","shard1,shard2,shard3,shard4");
> + doQuery("b!doc1,c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", shardKeys,"b!,c!,d!,e!,f1!f2!");
> doQuery("b!doc1", "q","*:*", shardKeys,"b!");
> doQuery("c!doc2", "q","*:*", shardKeys,"c!");
> - doQuery("d!doc3,f1!f2!doc5", "q","*:*", shardKeys,"d!");
> + doQuery("d!doc3,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", shardKeys,"d!");
> doQuery("e!doc4", "q","*:*", shardKeys,"e!");
> - doQuery("f1!f2!doc5,d!doc3", "q","*:*", shardKeys,"f1/8!");
> + doQuery("f1!f2!doc5,d!doc3,f1!f2!doc5/5", "q","*:*", shardKeys,"f1/8!");
>
> // try using shards parameter
> doQuery("b!doc1", "q","*:*", "shards",bucket1);
> doQuery("c!doc2", "q","*:*", "shards",bucket2);
> - doQuery("d!doc3,f1!f2!doc5", "q","*:*", "shards",bucket3);
> + doQuery("d!doc3,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", "shards",bucket3);
> doQuery("e!doc4", "q","*:*", "shards",bucket4);
>
>
> @@ -181,16 +184,16 @@ public class ShardRoutingTest extends Ab
> doQuery("b!doc1,c!doc2", "q","*:*", shardKeys,"b,c"); // query shards that would contain *documents* "b" and "c" (i.e. not prefixes). The upper bits are the same, so the shards should be the same.
>
> doQuery("b!doc1,c!doc2", "q","*:*", shardKeys,"b/1!"); // top bit of hash(b)==1, so shard1 and shard2
> - doQuery("d!doc3,e!doc4,f1!f2!doc5", "q","*:*", shardKeys,"d/1!"); // top bit of hash(b)==0, so shard3 and shard4
> + doQuery("d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*", shardKeys,"d/1!"); // top bit of hash(b)==0, so shard3 and shard4
>
> doQuery("b!doc1,c!doc2", "q","*:*", shardKeys,"b!,c!");
>
> - doQuery("b!doc1,f1!f2!doc5,c!doc2,d!doc3,e!doc4", "q","*:*", shardKeys,"foo/0!");
> + doQuery("b!doc1,f1!f2!doc5,c!doc2,d!doc3,e!doc4,f1!f2!doc5/5", "q","*:*", shardKeys,"foo/0!");
>
> // test targeting deleteByQuery at only certain shards
> doDBQ("*:*", shardKeys,"b!");
> commit();
> - doQuery("c!doc2,d!doc3,e!doc4,f1!f2!doc5", "q","*:*");
> + doQuery("c!doc2,d!doc3,e!doc4,f1!f2!doc5,f1!f2!doc5/5", "q","*:*");
> doAddDoc("b!doc1");
>
> doDBQ("*:*", shardKeys,"f1!");
>
> Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java
> URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java?rev=1547452&r1=1547451&r2=1547452&view=diff
> ==============================================================================
> --- lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java (original)
> +++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/cloud/TriLevelCompositeIdRoutingTest.java Tue Dec 3 16:10:58 2013
> @@ -143,7 +143,6 @@ public class TriLevelCompositeIdRoutingT
> Set<String> doQueryGetUniqueIdKeys(String... queryParams) throws Exception {
> QueryResponse rsp = cloudClient.query(params(queryParams));
> Set<String> obtainedIdKeys = new HashSet<String>();
> - Set<String> obtainedIdKeys2 = new HashSet<String>();
> for (SolrDocument doc : rsp.getResults()) {
> obtainedIdKeys.add(getKey((String) doc.get("id")));
> }
>
> Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
> URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java?rev=1547452&r1=1547451&r2=1547452&view=diff
> ==============================================================================
> --- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java (original)
> +++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java Tue Dec 3 16:10:58 2013
> @@ -202,15 +202,16 @@ public class CompositeIdRouter extends H
> } else {
> numBits[0] = 16;
> triLevel = false;
> -
> }
>
> for (int i = 0; i < parts.length; i++) {
> - int commaIdx = parts[i].indexOf(bitsSeparator);
> + if (i < pieces - 1) {
> + int commaIdx = parts[i].indexOf(bitsSeparator);
>
> - if (commaIdx > 0) {
> - numBits[i] = getNumBits(parts[i], commaIdx);
> - parts[i] = parts[i].substring(0, commaIdx);
> + if (commaIdx > 0) {
> + numBits[i] = getNumBits(parts[i], commaIdx);
> + parts[i] = parts[i].substring(0, commaIdx);
> + }
> }
> hashes[i] = Hash.murmurhash3_x86_32(parts[i], 0, parts[i].length(), 0);
> }
>
>