/*
* Constellation - An open source and standard compliant SDI
* http://www.constellation-sdi.org
*
* Copyright 2014 Geomatys.
*
* Licensed 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.
*/
/*
* Constellation - An open source and Keyword compliant SDI
* http://www.constellation-sdi.org
*
* (C) 2005, Institut de Recherche pour le Développement
* (C) 2007 - 2008, Geomatys
*
* This library 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 3 of the License, or (at your option) any later version.
*
* This library 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.
*/
package org.constellation.metadata.index.analyzer;
import org.apache.lucene.analysis.core.KeywordAnalyzer;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.sis.geometry.GeneralEnvelope;
import org.constellation.metadata.index.generic.GenericIndexer;
import org.geotoolkit.lucene.filter.LuceneOGCFilter;
import org.geotoolkit.lucene.filter.SerialChainFilter;
import org.geotoolkit.lucene.filter.SpatialQuery;
import org.geotoolkit.lucene.index.LuceneIndexSearcher;
import org.geotoolkit.referencing.CRS;
import org.geotoolkit.util.FileUtilities;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import java.io.File;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
//Junit dependencies
/**
*
* @author Guilhem Legal (Geomatys)
*/
public class KeywordAnalyzerTest extends AbstractAnalyzerTest {
private static File configDirectory = new File("KeywordAnalyzerTest");
@BeforeClass
public static void setUpClass() throws Exception {
FileUtilities.deleteDirectory(configDirectory);
List<Object> object = fillTestData();
GenericIndexer indexer = new GenericIndexer(object, null, configDirectory, "", new KeywordAnalyzer(), Level.FINER, true);
indexer.destroy();
indexSearcher = new LuceneIndexSearcher(configDirectory, "", new KeywordAnalyzer(), true);
indexSearcher.setLogLevel(Level.FINER);
}
@AfterClass
public static void tearDownClass() throws Exception {
FileUtilities.deleteDirectory(configDirectory);
indexSearcher.destroy();
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
/**
* Test simple lucene search.
*
* @throws java.lang.Exception
*/
@Test
public void simpleSearchTest() throws Exception {
Filter nullFilter = null;
String resultReport = "";
/**
* Test 1 simple search: title = 90008411.ctd
*/
SpatialQuery spatialQuery = new SpatialQuery("Title:\"90008411.ctd\"", nullFilter, SerialChainFilter.AND);
Set<String> result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "SimpleSearch 1:\n{0}", resultReport);
// the result we want are this
Set<String> expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
assertEquals(expectedResult, result);
/**
* Test 2 simple search: indentifier != 40510_145_19930221211500
*/
spatialQuery = new SpatialQuery("metafile:doc NOT identifier:\"40510_145_19930221211500\"", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "SimpleSearch 2:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("11325_158_19640418141800");
expectedResult.add("CTDF02");
expectedResult.add("MDWeb_FR_SY_couche_vecteur_258");
expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1");
assertEquals(expectedResult, result);
/**
* Test 3 simple search: originator = Donnees CTD NEDIPROD VI 120
*/
spatialQuery = new SpatialQuery("abstract:\"Donnees CTD NEDIPROD VI 120\"", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "simpleSearch 3:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
assertEquals(expectedResult, result);
/**
* Test 4 simple search: ID = World Geodetic System 84
*/
spatialQuery = new SpatialQuery("ID:\"World Geodetic System 84\"", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "simpleSearch 4:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("40510_145_19930221211500");
assertEquals(expectedResult, result);
/**
* Test 5 simple search: ID = 0UINDITENE
*/
spatialQuery = new SpatialQuery("ID:\"0UINDITENE\"", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "simpleSearch 5:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("11325_158_19640418141800");
assertEquals(expectedResult, result);
/**
* Test 6 range search: Title <= FRA
*/
spatialQuery = new SpatialQuery("Title_sort:[0 TO FRA]", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "simpleSearch 6:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("11325_158_19640418141800");
expectedResult.add("40510_145_19930221211500");
assertEquals(expectedResult, result);
/**
* Test 7 range search: Title > FRA
*/
spatialQuery = new SpatialQuery("Title_sort:[FRA TO z]", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "simpleSearch 7:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("CTDF02");
expectedResult.add("MDWeb_FR_SY_couche_vecteur_258");
expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1");
assertEquals(expectedResult, result);
}
/**
* Test simple lucene search.
*
* @throws java.lang.Exception
*/
@Test
public void wildCharSearchTest() throws Exception {
Filter nullFilter = null;
String resultReport = "";
/**
* Test 1 simple search: title = title1
*/
SpatialQuery spatialQuery = new SpatialQuery("Title:90008411*", nullFilter, SerialChainFilter.AND);
Set<String> result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "wildCharSearch 1:\n{0}", resultReport);
Set<String> expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("42292_9s_19900610041000");
assertEquals(expectedResult, result);
/**
* Test 2 wildChar search: abstract LIKE *NEDIPROD*
*/
spatialQuery = new SpatialQuery("abstract:*NEDIPROD*", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "wildCharSearch 2:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
// it didn't find any result (why???)
expectedResult = new LinkedHashSet<>();
assertEquals(expectedResult, result);
/**
* Test 3 wildChar search: title like *.ctd
*/
resultReport = "";
spatialQuery = new SpatialQuery("Title:*.ctd", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "wildCharSearch 3:\n{0}", resultReport);
assertTrue(result.contains("39727_22_19750113062500"));
assertTrue(result.contains("40510_145_19930221211500"));
assertTrue(result.contains("42292_5p_19900609195600"));
assertTrue(result.contains("42292_9s_19900610041000"));
/**
* Test 4 wildCharSearch: anstract LIKE *onnees CTD NEDIPROD VI 120
*/
spatialQuery = new SpatialQuery("abstract:(*onnees CTD NEDIPROD VI 120)", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "wildCharSearch 4:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
// ERROR it didn't find any result (why???)
expectedResult = new LinkedHashSet<>();
assertEquals(expectedResult, result);
/**
* Test 5 wildCharSearch: Format LIKE *MEDATLAS ASCII*
*/
spatialQuery = new SpatialQuery("Format:(*MEDATLAS ASCII*)", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "wildCharSearch 5:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("40510_145_19930221211500");
// ERROR it didn't find any result (why???)
expectedResult = new LinkedHashSet<>();
assertEquals(expectedResult, result);
}
/**
* Test simple lucene search.
*
* @throws java.lang.Exception
*/
@Test
public void wildCharUnderscoreSearchTest() throws Exception {
Filter nullFilter = null;
String resultReport = "";
/**
* Test 1 simple search: title = title1
*/
SpatialQuery spatialQuery = new SpatialQuery("identifier:*MDWeb_FR_SY*", nullFilter, SerialChainFilter.AND);
Set<String> result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, " wildCharUnderscoreSearch 1:\n{0}", resultReport);
Set<String> expectedResult = new LinkedHashSet<>();
//expectedResult.add("MDWeb_FR_SY_couche_vecteur_258"); error '_' is tokenized
assertEquals(expectedResult, result);
/**
* Test 2 simple search: title = identifier:Spot5-Cyprus-THX-IMAGERY3_ortho*
*/
spatialQuery = new SpatialQuery("identifier:Spot5-Cyprus-THX-IMAGERY3_ortho*", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, " wildCharUnderscoreSearch 1:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
//expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1"); // error
assertEquals(expectedResult, result);
}
/**
* Test simple lucene date search.
*
* @throws java.lang.Exception
*/
@Test
public void dateSearchTest() throws Exception {
Filter nullFilter = null;
String resultReport = "";
/**
* Test 1 date search: date after 25/01/2009
*/
SpatialQuery spatialQuery = new SpatialQuery("date:{20090125 30000101}", nullFilter, SerialChainFilter.AND);
Set<String> result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "DateSearch 1:\n{0}", resultReport);
Set<String> expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("11325_158_19640418141800");
expectedResult.add("CTDF02");
assertEquals(expectedResult, result);
}
/**
* Test sorted lucene search.
*
* @throws java.lang.Exception
*/
@Test
public void sortedSearchTest() throws Exception {
Filter nullFilter = null;
String resultReport = "";
/**
* Test 1 sorted search: all orderBy identifier ASC
*/
SpatialQuery spatialQuery = new SpatialQuery("metafile:doc", nullFilter, SerialChainFilter.AND);
SortField sf = new SortField("identifier_sort", SortField.Type.STRING, false);
spatialQuery.setSort(new Sort(sf));
Set<String> result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "SortedSearch 1:\n{0}", resultReport);
Set<String> expectedResult = new LinkedHashSet<>();
expectedResult.add("11325_158_19640418141800");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("40510_145_19930221211500");
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("CTDF02");
expectedResult.add("MDWeb_FR_SY_couche_vecteur_258");
expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1");
assertEquals(expectedResult, result);
/**
* Test 2 sorted search: all orderBy identifier DSC
*/
resultReport = "";
spatialQuery = new SpatialQuery("metafile:doc", nullFilter, SerialChainFilter.AND);
sf = new SortField("identifier_sort", SortField.Type.STRING, true);
spatialQuery.setSort(new Sort(sf));
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "SortedSearch 2:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1");
expectedResult.add("MDWeb_FR_SY_couche_vecteur_258");
expectedResult.add("CTDF02");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("40510_145_19930221211500");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("11325_158_19640418141800");
assertEquals(expectedResult, result);
/**
* Test 3 sorted search: all orderBy Abstract ASC
*/
resultReport = "";
spatialQuery = new SpatialQuery("metafile:doc", nullFilter, SerialChainFilter.AND);
sf = new SortField("Abstract_sort", SortField.Type.STRING, false);
spatialQuery.setSort(new Sort(sf));
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "SortedSearch 3:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("MDWeb_FR_SY_couche_vecteur_258");
expectedResult.add("CTDF02");
expectedResult.add("11325_158_19640418141800");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("40510_145_19930221211500");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1");
assertEquals(expectedResult, result);
/**
* Test 4 sorted search: all orderBy Abstract DSC
*/
resultReport = "";
spatialQuery = new SpatialQuery("metafile:doc", nullFilter, SerialChainFilter.AND);
sf = new SortField("Abstract_sort", SortField.Type.STRING, true);
spatialQuery.setSort(new Sort(sf));
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "SortedSearch 4:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1");
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("40510_145_19930221211500");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("11325_158_19640418141800");
expectedResult.add("CTDF02");
expectedResult.add("MDWeb_FR_SY_couche_vecteur_258");
assertEquals(expectedResult, result);
}
/**
*
* Test spatial lucene search.
*
* @throws java.lang.Exception
*/
@Test
public void spatialSearchTest() throws Exception {
String resultReport = "";
/**
* Test 1 spatial search: BBOX filter
*/
double min1[] = {-20, -20};
double max1[] = { 20, 20};
GeneralEnvelope bbox = new GeneralEnvelope(min1, max1);
CoordinateReferenceSystem crs = CRS.decode("EPSG:4326", true);
bbox.setCoordinateReferenceSystem(crs);
LuceneOGCFilter sf = LuceneOGCFilter.wrap(FF.bbox(LuceneOGCFilter.GEOMETRY_PROPERTY, -20, -20, 20, 20, "EPSG:4326"));
SpatialQuery spatialQuery = new SpatialQuery("metafile:doc", sf, SerialChainFilter.AND);
Set<String> result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "spatialSearch 1:\n{0}", resultReport);
Set<String> expectedResult = new LinkedHashSet<>();
expectedResult.add("39727_22_19750113062500");
expectedResult.add("11325_158_19640418141800");
expectedResult.add("CTDF02");
assertEquals(expectedResult, result);
/**
* Test 1 spatial search: NOT BBOX filter
*/
resultReport = "";
List<Filter> lf = new ArrayList<>();
//sf = new BBOXFilter(bbox, "urn:x-ogc:def:crs:EPSG:6.11:4326");
sf = LuceneOGCFilter.wrap(FF.bbox(LuceneOGCFilter.GEOMETRY_PROPERTY, -20, -20, 20, 20, "EPSG:4326"));
lf.add(sf);
int[] op = {SerialChainFilter.NOT};
SerialChainFilter f = new SerialChainFilter(lf, op);
spatialQuery = new SpatialQuery("metafile:doc", f, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
logger.log(Level.FINER, "spatialSearch 2:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("40510_145_19930221211500");
expectedResult.add("MDWeb_FR_SY_couche_vecteur_258");
expectedResult.add("Spot5-Cyprus-THX-IMAGERY3_ortho1");
assertEquals(expectedResult, result);
}
/**
*
* Test spatial lucene search.
*
* @throws java.lang.Exception
*/
@Test
public void TermQueryTest() throws Exception {
/**
* Test 1
*/
String identifier = "39727_22_19750113062500";
String result = indexSearcher.identifierQuery(identifier);
logger.log(Level.FINER, "identifier query 1:\n{0}", result);
String expectedResult = "39727_22_19750113062500";
assertEquals(expectedResult, result);
/**
* Test 2
*/
identifier = "CTDF02";
result = indexSearcher.identifierQuery(identifier);
logger.log(Level.FINER, "identifier query 2:\n{0}", result);
expectedResult = "CTDF02";
assertEquals(expectedResult, result);
}
}