mirror of https://github.com/apache/lucene.git
SOLR-139 add solrj test that exercises field update and optimistic locking
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1350464 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
77e0c78b04
commit
a440c1c1ad
|
@ -23,6 +23,7 @@ import java.io.StringWriter;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
@ -525,8 +526,7 @@ abstract public class SolrExampleTests extends SolrJettyTestBase
|
||||||
} else if (server instanceof ConcurrentUpdateSolrServer) {
|
} else if (server instanceof ConcurrentUpdateSolrServer) {
|
||||||
//XXX concurrentupdatesolrserver reports errors differently
|
//XXX concurrentupdatesolrserver reports errors differently
|
||||||
ConcurrentUpdateSolrServer cs = (ConcurrentUpdateSolrServer) server;
|
ConcurrentUpdateSolrServer cs = (ConcurrentUpdateSolrServer) server;
|
||||||
Field field = cs.getClass().getDeclaredField("lastError");
|
Field field = getCUSSExceptionField(cs);
|
||||||
field.setAccessible(true);
|
|
||||||
field.set(cs, null);
|
field.set(cs, null);
|
||||||
cs.add(doc);
|
cs.add(doc);
|
||||||
cs.blockUntilFinished();
|
cs.blockUntilFinished();
|
||||||
|
@ -537,6 +537,14 @@ abstract public class SolrExampleTests extends SolrJettyTestBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Field getCUSSExceptionField(Object cs)
|
||||||
|
throws SecurityException, NoSuchFieldException, IllegalArgumentException,
|
||||||
|
IllegalAccessException {
|
||||||
|
Field field = cs.getClass().getDeclaredField("lastError");
|
||||||
|
field.setAccessible(true);
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAugmentFields() throws Exception
|
public void testAugmentFields() throws Exception
|
||||||
{
|
{
|
||||||
|
@ -1176,6 +1184,71 @@ abstract public class SolrExampleTests extends SolrJettyTestBase
|
||||||
assertEquals("aaa", out.get("aaa"));
|
assertEquals("aaa", out.get("aaa"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUpdateField() throws Exception {
|
||||||
|
//no versions
|
||||||
|
SolrServer server = getSolrServer();
|
||||||
|
server.deleteByQuery("*:*");
|
||||||
|
server.commit();
|
||||||
|
SolrInputDocument doc = new SolrInputDocument();
|
||||||
|
doc.addField("id", "unique");
|
||||||
|
doc.addField("name", "gadget");
|
||||||
|
doc.addField("price_f", 1);
|
||||||
|
server.add(doc);
|
||||||
|
server.commit();
|
||||||
|
SolrQuery q = new SolrQuery("*:*");
|
||||||
|
q.setFields("id","price_f","name", "_version_");
|
||||||
|
QueryResponse resp = server.query(q);
|
||||||
|
assertEquals("Doc count does not match", 1, resp.getResults().getNumFound());
|
||||||
|
Long version = (Long)resp.getResults().get(0).getFirstValue("_version_");
|
||||||
|
assertNotNull("no version returned", version);
|
||||||
|
assertEquals(1.0f, resp.getResults().get(0).getFirstValue("price_f"));
|
||||||
|
|
||||||
|
//update "price" with incorrect version (optimistic locking)
|
||||||
|
HashMap<String, Object> oper = new HashMap<String, Object>(); //need better api for this???
|
||||||
|
oper.put("set",100);
|
||||||
|
|
||||||
|
doc = new SolrInputDocument();
|
||||||
|
doc.addField("id", "unique");
|
||||||
|
doc.addField("_version_", version+1);
|
||||||
|
doc.addField("price_f", oper);
|
||||||
|
try {
|
||||||
|
server.add(doc);
|
||||||
|
if(server instanceof HttpSolrServer) { //XXX concurrent server reports exceptions differently
|
||||||
|
fail("Operation should throw an exception!");
|
||||||
|
} else {
|
||||||
|
server.commit(); //just to be sure the client has sent the doc
|
||||||
|
assertTrue("CUSS did not report an error", ((Throwable)getCUSSExceptionField(server).get(server)).getMessage().contains("Conflict"));
|
||||||
|
}
|
||||||
|
} catch (SolrException se) {
|
||||||
|
assertTrue("No identifiable error message", se.getMessage().contains("version conflict for unique"));
|
||||||
|
}
|
||||||
|
|
||||||
|
//update "price", use correct version (optimistic locking)
|
||||||
|
doc = new SolrInputDocument();
|
||||||
|
doc.addField("id", "unique");
|
||||||
|
doc.addField("_version_", version);
|
||||||
|
doc.addField("price_f", oper);
|
||||||
|
server.add(doc);
|
||||||
|
server.commit();
|
||||||
|
resp = server.query(q);
|
||||||
|
assertEquals("Doc count does not match", 1, resp.getResults().getNumFound());
|
||||||
|
assertEquals("price was not updated?", 100.0f, resp.getResults().get(0).getFirstValue("price_f"));
|
||||||
|
assertEquals("no name?", "gadget", resp.getResults().get(0).getFirstValue("name"));
|
||||||
|
|
||||||
|
//update "price", no version
|
||||||
|
oper.put("set", 200);
|
||||||
|
doc = new SolrInputDocument();
|
||||||
|
doc.addField("id", "unique");
|
||||||
|
doc.addField("price_f", oper);
|
||||||
|
server.add(doc);
|
||||||
|
server.commit();
|
||||||
|
resp = server.query(q);
|
||||||
|
assertEquals("Doc count does not match", 1, resp.getResults().getNumFound());
|
||||||
|
assertEquals("price was not updated?", 200.0f, resp.getResults().get(0).getFirstValue("price_f"));
|
||||||
|
assertEquals("no name?", "gadget", resp.getResults().get(0).getFirstValue("name"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testQueryWithParams() throws SolrServerException {
|
public void testQueryWithParams() throws SolrServerException {
|
||||||
SolrServer server = getSolrServer();
|
SolrServer server = getSolrServer();
|
||||||
|
|
Loading…
Reference in New Issue