/* * Copyright (C) 2010 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.xcmis.search.query; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import org.apache.commons.io.FileUtils; import org.apache.tika.config.TikaConfig; import org.apache.tika.exception.TikaException; import org.apache.tika.mime.MimeTypeException; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.xcmis.search.InvalidQueryException; import org.xcmis.search.SearchService; import org.xcmis.search.SearchServiceException; import org.xcmis.search.config.IndexConfiguration; import org.xcmis.search.config.SearchServiceConfiguration; import org.xcmis.search.content.ContentEntry; import org.xcmis.search.content.InMemorySchema; import org.xcmis.search.content.Property; import org.xcmis.search.content.Schema; import org.xcmis.search.content.InMemorySchema.Builder; import org.xcmis.search.content.Property.BinaryValue; import org.xcmis.search.content.interceptors.ContentReaderInterceptor; import org.xcmis.search.lucene.content.SchemaTableResolver; import org.xcmis.search.model.Query; import org.xcmis.search.result.ScoredRow; import org.xcmis.search.value.CastSystem; import org.xcmis.search.value.NameConverter; import org.xcmis.search.value.PropertyType; import org.xcmis.search.value.ToStringNameConverter; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.UUID; /** * Test for search service. * */ public class SearchServiceTest { private QueryBuilder builder; private File tempDir; private Builder schemaBuilder; private Schema schema; @Before public void beforeEach() { builder = new QueryBuilder(mock(CastSystem.class)); schemaBuilder = InMemorySchema.createBuilder(); schema = schemaBuilder.addTable("someTable", "column1", "column2", "column3").build(); tempDir = new File(System.getProperty("java.io.tmpdir"), "search-service"); if (tempDir.exists()) { assertThat(FileUtils.deleteQuietly(tempDir), is(true)); } assertThat(tempDir.mkdirs(), is(true)); } @After public void tearDown() throws Exception { if (tempDir.exists()) { assertThat(FileUtils.deleteQuietly(tempDir), is(true)); } } @Test(expected = IllegalArgumentException.class) public void shouldNotCreateSearchServieWithEmptyReadOnlyInterceptor() throws SearchServiceException { SearchServiceConfiguration configuration = mock(SearchServiceConfiguration.class); SearchService searchService = new SearchService(configuration); } @Test public void testShouldCreateSearchService() throws SearchServiceException, MimeTypeException, IOException, TikaException { NameConverter<String> nameConverter = new ToStringNameConverter(); SchemaTableResolver tableResolver = new SchemaTableResolver(nameConverter, schema); //index configuration IndexConfiguration indexConfuration = new IndexConfiguration(tempDir.getAbsolutePath(), "rootParentUuid", "rootUuid"); //search service configuration SearchServiceConfiguration configuration = new SearchServiceConfiguration(mock(Schema.class), tableResolver, mock(ContentReaderInterceptor.class), indexConfuration); SearchService luceneSearchService = new SearchService(configuration); assertThat(luceneSearchService, notNullValue()); } @Test public void testShouldCreateSearchServiceWithRamDirectory() throws SearchServiceException, MimeTypeException, IOException, TikaException { NameConverter<String> nameConverter = new ToStringNameConverter(); SchemaTableResolver tableResolver = new SchemaTableResolver(nameConverter, schema); //index configuration IndexConfiguration indexConfuration = new IndexConfiguration("rootParentUuid", "rootUuid"); //search service configuration SearchServiceConfiguration configuration = new SearchServiceConfiguration(schema, tableResolver, mock(ContentReaderInterceptor.class), indexConfuration); SearchService luceneSearchService = new SearchService(configuration); assertThat(luceneSearchService, notNullValue()); } @Test(expected = SearchServiceException.class) public void testShouldNotCreateSearchServiceWithWrongStorage() throws SearchServiceException, MimeTypeException, IOException, TikaException { NameConverter<String> nameConverter = new ToStringNameConverter(); SchemaTableResolver tableResolver = new SchemaTableResolver(nameConverter, schema); //index configuration IndexConfiguration indexConfuration = new IndexConfiguration(tempDir.getAbsolutePath(), "rootParentUuid", "rootUuid", TikaConfig.class.getName(), new TikaConfig()); //search service configuration SearchServiceConfiguration configuration = new SearchServiceConfiguration(schema, tableResolver, mock(ContentReaderInterceptor.class), indexConfuration); SearchService luceneSearchService = new SearchService(configuration); } //TODO check public void testShouldRunQuerySearchServie() throws SearchServiceException, InvalidQueryException, MimeTypeException, IOException, TikaException { //value NameConverter<String> nameConverter = new ToStringNameConverter(); SchemaTableResolver tableResolver = new SchemaTableResolver(nameConverter, schema); //index configuration IndexConfiguration indexConfuration = new IndexConfiguration("rootParentUuid", "rootUuid"); //search service configuration SearchServiceConfiguration configuration = new SearchServiceConfiguration(schema, tableResolver, mock(ContentReaderInterceptor.class), indexConfuration); SearchService luceneSearchService = new SearchService(configuration); luceneSearchService.start(); Query query = builder.selectStar().from("someTable").query(); luceneSearchService.execute(query); } @Test public void testShouldIndexBinaryDocument() throws SearchServiceException, InvalidQueryException, MimeTypeException, IOException, TikaException { NameConverter<String> nameConverter = new ToStringNameConverter(); SchemaTableResolver tableResolver = new SchemaTableResolver(nameConverter, schema); //index configuration IndexConfiguration indexConfuration = new IndexConfiguration("rootParentUuid", "rootUuid"); //search service configuration SearchServiceConfiguration configuration = new SearchServiceConfiguration(schema, tableResolver, mock(ContentReaderInterceptor.class), indexConfuration); SearchService luceneSearchService = new SearchService(configuration); luceneSearchService.start(); byte[] bytes = ("Apollo 7 (October 11-22, 1968) was the first manned mission " + "in the Apollo program to be launched. It was an eleven-day " + "Earth-orbital mission, the first manned launch of the " + "Saturn IB launch vehicle, and the first three-person " + "American space mission").getBytes(); Collection<BinaryValue> values = new ArrayList<BinaryValue>(); values.add(new BinaryValue(new ByteArrayInputStream(bytes), "plain/text", null, bytes.length)); Property[] props = new Property[]{new Property(PropertyType.BINARY, "content", values)}; List<ContentEntry> entys = new ArrayList<ContentEntry>(); entys.add(new ContentEntry("doc", new String[]{"someTable"}, UUID.randomUUID().toString(), new String[]{UUID .randomUUID().toString()}, props)); luceneSearchService.update(entys, new HashSet<String>()); Query query = builder.selectStar().from("someTable AS someTable").query(); List<ScoredRow> result = luceneSearchService.execute(query); assertThat(result.size(), is(1)); } }