blob: 70b0ea81f0f9711383d99d018359dadf91ecf2b1 [file] [log] [blame]
/*
* 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.client.solrj;
import junit.framework.Assert;
import org.apache.solr.SolrJettyTestBase;
import org.apache.solr.client.solrj.request.AbstractUpdateRequest.ACTION;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.util.TimeSource;
import org.apache.solr.util.TimeOut;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
abstract public class SolrExampleTestsBase extends SolrJettyTestBase {
/**
* query the example
*/
@Test
public void testCommitWithinOnAdd() throws Exception {
// make sure it is empty...
SolrClient client = getSolrClient();
client.deleteByQuery("*:*");// delete everything!
client.commit();
QueryResponse rsp = client.query(new SolrQuery("*:*"));
Assert.assertEquals(0, rsp.getResults().getNumFound());
// Now try a timed commit...
SolrInputDocument doc3 = new SolrInputDocument();
doc3.addField("id", "id3");
doc3.addField("name", "doc3");
doc3.addField("price", 10);
UpdateRequest up = new UpdateRequest();
up.add(doc3);
up.setCommitWithin(500); // a smaller commitWithin caused failures on the
// following assert
up.process(client);
rsp = client.query(new SolrQuery("*:*"));
Assert.assertEquals(0, rsp.getResults().getNumFound());
// TODO: not a great way to test this - timing is easily out
// of whack due to parallel tests and various computer specs/load
Thread.sleep(1000); // wait 1 sec
// now check that it comes out...
rsp = client.query(new SolrQuery("id:id3"));
int cnt = 0;
while (rsp.getResults().getNumFound() == 0) {
// wait and try again for slower/busier machines
// and/or parallel test effects.
if (cnt++ == 10) {
break;
}
Thread.sleep(2000); // wait 2 seconds...
rsp = client.query(new SolrQuery("id:id3"));
}
Assert.assertEquals(1, rsp.getResults().getNumFound());
// Now test the new convenience parameter on the add() for commitWithin
SolrInputDocument doc4 = new SolrInputDocument();
doc4.addField("id", "id4");
doc4.addField("name", "doc4");
doc4.addField("price", 10);
client.add(doc4, 500);
Thread.sleep(1000); // wait 1 sec
// now check that it comes out...
rsp = client.query(new SolrQuery("id:id4"));
cnt = 0;
while (rsp.getResults().getNumFound() == 0) {
// wait and try again for slower/busier machines
// and/or parallel test effects.
if (cnt++ == 10) {
break;
}
Thread.sleep(2000); // wait 2 seconds...
rsp = client.query(new SolrQuery("id:id3"));
}
Assert.assertEquals(1, rsp.getResults().getNumFound());
}
@Test
public void testCommitWithinOnDelete() throws Exception {
// make sure it is empty...
SolrClient client = getSolrClient();
client.deleteByQuery("*:*");// delete everything!
client.commit();
QueryResponse rsp = client.query(new SolrQuery("*:*"));
Assert.assertEquals(0, rsp.getResults().getNumFound());
// Now add one document...
SolrInputDocument doc3 = new SolrInputDocument();
doc3.addField("id", "id3");
doc3.addField("name", "doc3");
doc3.addField("price", 10);
client.add(doc3);
client.commit();
// now check that it comes out...
rsp = client.query(new SolrQuery("id:id3"));
Assert.assertEquals(1, rsp.getResults().getNumFound());
// now test commitWithin on a delete
UpdateRequest up = new UpdateRequest();
up.setCommitWithin(1000);
up.deleteById("id3");
up.process(client);
// the document should still be there
rsp = client.query(new SolrQuery("id:id3"));
Assert.assertEquals(1, rsp.getResults().getNumFound());
// check if the doc has been deleted every 250 ms for 30 seconds
TimeOut timeout = new TimeOut(30, TimeUnit.SECONDS, TimeSource.NANO_TIME);
do {
Thread.sleep(250); // wait 250 ms
rsp = client.query(new SolrQuery("id:id3"));
if (rsp.getResults().getNumFound() == 0) {
return;
}
} while (! timeout.hasTimedOut());
Assert.fail("commitWithin failed to commit");
}
@Test
public void testAddDelete() throws Exception {
SolrClient client = getSolrClient();
// Empty the database...
client.deleteByQuery("*:*");// delete everything!
SolrInputDocument[] doc = new SolrInputDocument[3];
for (int i = 0; i < 3; i++) {
doc[i] = new SolrInputDocument();
doc[i].setField("id", i + " & 222");
}
String id = (String) doc[0].getField("id").getFirstValue();
client.add(doc[0]);
client.commit();
assertNumFound("*:*", 1); // make sure it got in
// make sure it got in there
client.deleteById(id);
client.commit();
assertNumFound("*:*", 0); // make sure it got out
// add it back
client.add(doc[0]);
client.commit();
assertNumFound("*:*", 1); // make sure it got in
client.deleteByQuery("id:\"" + ClientUtils.escapeQueryChars(id) + "\"");
client.commit();
assertNumFound("*:*", 0); // make sure it got out
// Add two documents
for (SolrInputDocument d : doc) {
client.add(d);
}
client.commit();
assertNumFound("*:*", 3); // make sure it got in
// should be able to handle multiple delete commands in a single go
List<String> ids = new ArrayList<>();
for (SolrInputDocument d : doc) {
ids.add(d.getFieldValue("id").toString());
}
client.deleteById(ids);
client.commit();
assertNumFound("*:*", 0); // make sure it got out
}
@Test
public void testStreamingRequest() throws Exception {
SolrClient client = getSolrClient();
// Empty the database...
client.deleteByQuery("*:*");// delete everything!
client.commit();
assertNumFound("*:*", 0); // make sure it got in
// Add some docs to the index
UpdateRequest req = new UpdateRequest();
for (int i = 0; i < 10; i++) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "" + i);
doc.addField("cat", "foocat");
req.add(doc);
}
req.setAction(ACTION.COMMIT, true, true);
req.process(client);
// Make sure it ran OK
SolrQuery query = new SolrQuery("*:*");
query.set(CommonParams.FL, "id,score,_docid_");
QueryResponse response = client.query(query);
assertEquals(0, response.getStatus());
assertEquals(10, response.getResults().getNumFound());
// Now make sure each document gets output
final AtomicInteger cnt = new AtomicInteger(0);
client.queryAndStreamResponse(query, new StreamingResponseCallback() {
@Override
public void streamDocListInfo(long numFound, long start, Float maxScore) {
assertEquals(10, numFound);
}
@Override
public void streamSolrDocument(SolrDocument doc) {
cnt.incrementAndGet();
// Make sure the transformer works for streaming
Float score = (Float) doc.get("score");
assertEquals("should have score", Float.valueOf(1.0f), score);
}
});
assertEquals(10, cnt.get());
}
protected QueryResponse assertNumFound(String query, int num)
throws SolrServerException, IOException {
QueryResponse rsp = getSolrClient().query(new SolrQuery(query));
if (num != rsp.getResults().getNumFound()) {
fail("expected: " + num + " but had: " + rsp.getResults().getNumFound()
+ " :: " + rsp.getResults());
}
return rsp;
}
}