/* * 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.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); 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", new Float(1.0), 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; } }