/* * 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.handler.loader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.client.solrj.request.JavaBinUpdateRequestCodec; import org.apache.solr.client.solrj.request.UpdateRequest; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.common.util.ContentStreamBase; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.update.AddUpdateCommand; import org.apache.solr.update.processor.BufferingRequestProcessor; import org.junit.BeforeClass; public class JavabinLoaderTest extends SolrTestCaseJ4 { @BeforeClass public static void beforeTests() throws Exception { initCore("solrconfig.xml","schema.xml"); } /** * Verifies the isLastDocInBatch flag gets set correctly for a batch of docs and for a request with a single doc. */ public void testLastDocInBatchFlag() throws Exception { doTestLastDocInBatchFlag(1); // single doc doTestLastDocInBatchFlag(2); // multiple docs } protected void doTestLastDocInBatchFlag(int numDocsInBatch) throws Exception { List<SolrInputDocument> batch = new ArrayList<>(numDocsInBatch); for (int d=0; d < numDocsInBatch; d++) { SolrInputDocument doc = new SolrInputDocument(); doc.setField("id", String.valueOf(d)); batch.add(doc); } UpdateRequest updateRequest = new UpdateRequest(); if (batch.size() > 1) { updateRequest.add(batch); } else { updateRequest.add(batch.get(0)); } // client-side SolrJ would do this ... ByteArrayOutputStream os = new ByteArrayOutputStream(); (new JavaBinUpdateRequestCodec()).marshal(updateRequest, os); // need to override the processAdd method b/c JavabinLoader calls // clear on the addCmd after it is passed on to the handler ... a simple clone will suffice for this test BufferingRequestProcessor mockUpdateProcessor = new BufferingRequestProcessor(null) { @Override public void processAdd(AddUpdateCommand cmd) throws IOException { addCommands.add((AddUpdateCommand)cmd.clone()); } }; SolrQueryRequest req = req(); (new JavabinLoader()).load(req, new SolrQueryResponse(), new ContentStreamBase.ByteArrayStream(os.toByteArray(), "test"), mockUpdateProcessor); req.close(); assertTrue(mockUpdateProcessor.addCommands.size() == numDocsInBatch); for (int i=0; i < numDocsInBatch-1; i++) assertFalse(mockUpdateProcessor.addCommands.get(i).isLastDocInBatch); // not last doc in batch // last doc should have the flag set assertTrue(mockUpdateProcessor.addCommands.get(batch.size()-1).isLastDocInBatch); } }