/*
* 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.
*/
package org.constellation.metadata.index.mdweb;
// J2SE dependencies
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.apache.sis.util.logging.Logging;
import org.constellation.generic.database.Automatic;
import org.constellation.generic.database.BDD;
import org.constellation.test.utils.Order;
import org.constellation.test.utils.TestRunner;
import org.constellation.util.Util;
import org.geotoolkit.factory.FactoryFinder;
import org.geotoolkit.factory.Hints;
import org.geotoolkit.internal.sql.DefaultDataSource;
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.geotoolkit.util.sql.DerbySqlScriptRunner;
import org.junit.runner.RunWith;
import org.mdweb.io.MD_IOFactory;
import org.mdweb.io.Reader;
import org.mdweb.model.storage.FullRecord;
import org.mdweb.model.storage.TextValue;
import org.mdweb.model.storage.Value;
import org.opengis.filter.FilterFactory2;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import javax.imageio.spi.ServiceRegistry;
import java.io.File;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import static org.junit.Assert.*;
// MDWeb dependencies
// Constellation dependencies
// lucene dependencies
// geotoolkit dependencies
// GeoAPI dependencies
//Junit dependencies
/**
* Test class for constellation lucene index
*
* @author Guilhem Legal (Geomatys)
*/
@RunWith(TestRunner.class)
public class MdwebIndexTest {
protected static final FilterFactory2 FF = (FilterFactory2)
FactoryFinder.getFilterFactory(new Hints(Hints.FILTER_FACTORY,FilterFactory2.class));
private static DefaultDataSource ds;
private static final Logger LOGGER = Logging.getLogger("org.constellation.metadata");
private static LuceneIndexSearcher indexSearcher;
private static MDWebIndexer indexer;
@BeforeClass
public static void setUpClass() throws Exception {
File configDirectory = new File("MDwebIndexTest");
FileUtilities.deleteDirectory(configDirectory);
final String url = "jdbc:derby:memory:MDITest;create=true";
ds = new DefaultDataSource(url);
Connection con = ds.getConnection();
DerbySqlScriptRunner sr = new DerbySqlScriptRunner(con);
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/model/mdw_schema_2.4_derby.sql"));
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/schemas/ISO19115.sql"));
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/schemas/ISO19119.sql"));
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/schemas/ISO19108.sql"));
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/schemas/ISO19115-2.sql"));
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/schemas/ISO19110.sql"));
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/data/defaultRecordSets.sql"));
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/users/creation_user.sql"));
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/schemas/catalog_web_service.sql"));
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/schemas/ebrimv2.5.sql"));
sr.run(Util.getResourceAsStream("org/mdweb/sql/v24/metadata/schemas/ebrimv3.0.sql"));
sr.run(Util.getResourceAsStream("org/constellation/sql/csw-data.sql"));
sr.run(Util.getResourceAsStream("org/constellation/sql/csw-data-2.sql"));
sr.run(Util.getResourceAsStream("org/constellation/sql/csw-data-6.sql"));
sr.run(Util.getResourceAsStream("org/constellation/sql/csw-data-6.5.sql"));
sr.close(false);
con.close();
//we write the configuration file
BDD bdd = new BDD("org.apache.derby.jdbc.EmbeddedDriver", url, "", "");
Automatic configuration = new Automatic("mdweb", bdd);
configuration.setConfigurationDirectory(configDirectory);
indexer = new MDWebIndexer(configuration, "", true);
indexSearcher = new LuceneIndexSearcher(configDirectory, "", null, true);
indexer.setLogLevel(Level.FINER);
indexSearcher.setLogLevel(Level.FINER);
}
@AfterClass
public static void tearDownClass() throws Exception {
if (ds != null) {
ds.shutdown();
}
FileUtilities.deleteDirectory(new File("MDwebIndexTest"));
File f = new File("derby.log");
if (f.exists()) {
f.delete();
}
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
/**
* Test simple lucene search.
*
* @throws java.lang.Exception
*/
@Test
@Order(order = 1)
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);
Set<String> expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
//expectedResult.add("42292_9s_19900610041000");
assertEquals(expectedResult, result);
/**
* Test 2 simple search: identifier != 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("11325_158_19640418141800");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("CTDF02");
expectedResult.add("cat-1");
expectedResult.add("gov.noaa.nodc.ncddc. MODXXYYYYJJJ.L3_Mosaic_NOAA_GMX or MODXXYYYYJJJHHMMSS.L3_NOAA_GMX");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7c3");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7k7");
expectedResult.add("28644bf0-5d9d-4ebd-bef0-f2b0b2067b26");
expectedResult.add("937491cd-4bc4-43e4-9509-f6cc606f906e");
expectedResult.add("666-999-666");
expectedResult.add("999-666-999");
expectedResult.add("urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd");
expectedResult.add("meta_NaN_id");
assertEquals(expectedResult, result);
/**
* Test 3 simple search: originator = UNIVERSITE DE LA MEDITERRANNEE (U2) / COM - LAB. OCEANOG. BIOGEOCHIMIE - LUMINY
*/
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: Title = 92005711.ctd
*/
spatialQuery = new SpatialQuery("Title:\"92005711.ctd\"", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "SimpleSearch 4:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("40510_145_19930221211500");
assertEquals(expectedResult, result);
/**
* Test 5 simple search: creator = IFREMER / IDM/SISMER
*/
spatialQuery = new SpatialQuery("creator:\"IFREMER / IDM/SISMER\"", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "SimpleSearch 5:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("40510_145_19930221211500");
assertEquals(expectedResult, result);
/**
* Test 6 simple search: identifier = 40510_145_19930221211500
*/
spatialQuery = new SpatialQuery("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("40510_145_19930221211500");
assertEquals(expectedResult, result);
}
/**
* Test simple lucene search.
*
* @throws java.lang.Exception
*/
@Test
@Order(order = 2)
public void numericComparisonSearchTest() throws Exception {
Filter nullFilter = null;
String resultReport = "";
/**
* Test 1 numeric search: CloudCover < 60
*/
SpatialQuery spatialQuery = new SpatialQuery("CloudCover:{-2147483648 TO 60}", nullFilter, SerialChainFilter.AND);
Set<String> result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "numericComparisonSearch 1:\n{0}", resultReport);
Set<String> expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("42292_5p_19900609195600");
assertEquals(expectedResult, result);
/**
* Test 2 numeric search: CloudCover <= 25
*/
spatialQuery = new SpatialQuery("CloudCover:[-2147483648 TO 25]", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "numericComparisonSearch 2:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_9s_19900610041000");
assertEquals(expectedResult, result);
/**
* Test 3 numeric search: CloudCover => 25
*/
resultReport = "";
spatialQuery = new SpatialQuery("CloudCover:[25 TO 2147483648]", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "numericComparisonSearch 3:\n{0}", resultReport);
assertEquals(2, result.size());
assertTrue(result.contains("42292_5p_19900609195600"));
assertTrue(result.contains("39727_22_19750113062500"));
/**
* Test 4 numeric search: CloudCover => 60
*/
resultReport = "";
spatialQuery = new SpatialQuery("CloudCover:[210 TO 2147483648]", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "numericComparisonSearch 4:\n{0}", resultReport);
assertEquals(0, result.size());
/**
* Test 5 numeric search: CloudCover => 50
*/
spatialQuery = new SpatialQuery("CloudCover:[50 TO 2147483648]", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "numericComparisonSearch 5:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("39727_22_19750113062500");
expectedResult.add("42292_5p_19900609195600");
//issues here it found
assertEquals(expectedResult, result);
/**
* Test 6 numeric search: CloudCover = 50.0
*/
spatialQuery = new SpatialQuery("CloudCover:[50 TO 50]", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "numericComparisonSearch 6:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
//issues here it found
assertEquals(expectedResult, result);
/**
* Test 7 numeric search: CloudCover = 50.0
*/
spatialQuery = new SpatialQuery("CloudCover:50.0", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "numericComparisonSearch 7:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
//expectedResult.add("42292_5p_19900609195600");
//issues here it didn't find
assertEquals(expectedResult, result);
}
/**
* Test wildChar lucene search.
*
* @throws java.lang.Exception
*/
@Test
@Order(order = 3)
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_9s_19900610041000");
expectedResult.add("42292_5p_19900609195600");
assertEquals(expectedResult, result);
/**
* Test 2 wildChar search: originator LIKE *UNIVER....
*/
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");
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, "wilCharSearch 3:\n{0}", resultReport);
assertTrue(result.contains("42292_5p_19900609195600"));
assertTrue(result.contains("42292_9s_19900610041000"));
assertTrue(result.contains("39727_22_19750113062500"));
assertTrue(result.contains("40510_145_19930221211500"));
assertEquals(4, result.size());
/**
* Test 4 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, "wilCharSearch 4:\n{0}", resultReport);
assertTrue(result.contains("42292_5p_19900609195600"));
assertTrue(result.contains("42292_9s_19900610041000"));
assertTrue(result.contains("39727_22_19750113062500"));
assertTrue(result.contains("40510_145_19930221211500"));
assertEquals(4, result.size());
/**
* Test 5 wildCharSearch: abstract 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 5:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
//issues here it found
assertEquals(expectedResult, result);
/**
* Test 6 wildCharSearch: identifier LIKE 40510_145_*
*/
spatialQuery = new SpatialQuery("identifier:40510_145_*", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "wildCharSearch 6:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("40510_145_19930221211500");
assertEquals(expectedResult, result);
/**
* Test 7 wildCharSearch: identifier LIKE *40510_145_*
*/
spatialQuery = new SpatialQuery("identifier:*40510_145_*", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
resultReport = "";
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "wildCharSearch 7:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("40510_145_19930221211500");
assertEquals(expectedResult, result);
}
/**
* Test simple lucene date search.
*
* @throws java.lang.Exception
*/
@Test
@Order(order = 4)
public void dateSearchTest() throws Exception {
Filter nullFilter = null;
String resultReport = "";
/**
* Test 1 date search: date after 25/01/2009
*/
SpatialQuery spatialQuery = new SpatialQuery("date:{\"20090125000000\" 30000101000000}", 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("11325_158_19640418141800");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("CTDF02");
assertEquals(expectedResult, result);
/**
* Test 2 date search: TempExtent_begin before 01/01/1985
*/
spatialQuery = new SpatialQuery("TempExtent_begin:{00000101000000 \"19850101000000\"}", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "DateSearch 2:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("11325_158_19640418141800");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("CTDF02");
assertEquals(expectedResult, result);
/**
* Test 3 date search: TempExtent_end after 01/01/1991
*/
spatialQuery = new SpatialQuery("TempExtent_end:{\"19910101000000\" 30000101000000}", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "DateSearch 3:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("40510_145_19930221211500");
expectedResult.add("CTDF02");
expectedResult.add("gov.noaa.nodc.ncddc. MODXXYYYYJJJ.L3_Mosaic_NOAA_GMX or MODXXYYYYJJJHHMMSS.L3_NOAA_GMX");
assertEquals(expectedResult, result);
/**
* Test 4 date search: date = 26/01/2009
*/
spatialQuery = new SpatialQuery("date:\"20090126122224\"", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "DateSearch 4:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("11325_158_19640418141800");
//expectedResult.add("39727_22_19750113062500"); exclude since date time is handled
//expectedResult.add("42292_9s_19900610041000"); exclude since date time is handled
assertEquals(expectedResult, result);
/**
* Test 5 date search: date LIKE 26/01/200*
*/
spatialQuery = new SpatialQuery("date:(200*0126*)", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "DateSearch 5:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("11325_158_19640418141800");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("40510_145_19930221211500");
assertEquals(expectedResult, result);
/**
* Test 6 date search: CreationDate between 01/01/1800 and 01/01/2000
*/
spatialQuery = new SpatialQuery("CreationDate:[18000101000000 30000101000000]CreationDate:[00000101000000 20000101000000]", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "DateSearch 6:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("42292_5p_19900609195600");
assertEquals(expectedResult, result);
/**
* Test 7 date time search: CreationDate after 1970-02-04T06:00:00
*/
spatialQuery = new SpatialQuery("CreationDate:[19700204060000 30000101000000]", nullFilter, SerialChainFilter.AND);
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "DateSearch 7:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("42292_5p_19900609195600");
assertEquals(expectedResult, result);
}
/**
* Test sorted lucene search.
*
* @throws java.lang.Exception
*/
@Test
@Order(order = 5)
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("28644bf0-5d9d-4ebd-bef0-f2b0b2067b26");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("40510_145_19930221211500");
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7c3");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7k7");
expectedResult.add("666-999-666");
expectedResult.add("937491cd-4bc4-43e4-9509-f6cc606f906e");
expectedResult.add("999-666-999");
expectedResult.add("CTDF02");
expectedResult.add("cat-1");
expectedResult.add("gov.noaa.nodc.ncddc. MODXXYYYYJJJ.L3_Mosaic_NOAA_GMX or MODXXYYYYJJJHHMMSS.L3_NOAA_GMX");
expectedResult.add("meta_NaN_id");
expectedResult.add("urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd");
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("urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd");
expectedResult.add("meta_NaN_id");
expectedResult.add("gov.noaa.nodc.ncddc. MODXXYYYYJJJ.L3_Mosaic_NOAA_GMX or MODXXYYYYJJJHHMMSS.L3_NOAA_GMX");
expectedResult.add("cat-1");
expectedResult.add("CTDF02");
expectedResult.add("999-666-999");
expectedResult.add("937491cd-4bc4-43e4-9509-f6cc606f906e");
expectedResult.add("666-999-666");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7k7");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7c3");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("40510_145_19930221211500");
expectedResult.add("39727_22_19750113062500");
expectedResult.add("28644bf0-5d9d-4ebd-bef0-f2b0b2067b26");
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("cat-1"); // TODO why cat-1 in first he is not indexable
expectedResult.add("urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd");
expectedResult.add("CTDF02");
expectedResult.add("meta_NaN_id");
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("gov.noaa.nodc.ncddc. MODXXYYYYJJJ.L3_Mosaic_NOAA_GMX or MODXXYYYYJJJHHMMSS.L3_NOAA_GMX");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7c3");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7k7");
expectedResult.add("28644bf0-5d9d-4ebd-bef0-f2b0b2067b26");
expectedResult.add("937491cd-4bc4-43e4-9509-f6cc606f906e");
expectedResult.add("666-999-666");
expectedResult.add("999-666-999");
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("484fc4d9-8d11-48a5-a386-65c19398f7c3");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7k7");
expectedResult.add("28644bf0-5d9d-4ebd-bef0-f2b0b2067b26");
expectedResult.add("937491cd-4bc4-43e4-9509-f6cc606f906e");
expectedResult.add("666-999-666");
expectedResult.add("999-666-999");
expectedResult.add("gov.noaa.nodc.ncddc. MODXXYYYYJJJ.L3_Mosaic_NOAA_GMX or MODXXYYYYJJJHHMMSS.L3_NOAA_GMX");
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("meta_NaN_id");
expectedResult.add("CTDF02");
expectedResult.add("cat-1");
expectedResult.add("urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd");
assertEquals(expectedResult, result);
/**
* Test 5 sorted search: orderBy CloudCover ASC with SortField.STRING => bad order
*/
resultReport = "";
spatialQuery = new SpatialQuery("CloudCover:[0 TO 2147483648]", nullFilter, SerialChainFilter.AND);
sf = new SortField("CloudCover_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 5:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
// i don't why we have the good order here
expectedResult.add("39727_22_19750113062500");
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("42292_9s_19900610041000");
assertEquals(expectedResult, result);
/**
* Test 5 sorted search: orderBy CloudCover ASC with SortField.DOUBLE => good order
*/
resultReport = "";
spatialQuery = new SpatialQuery("CloudCover:[0 TO 2147483648]", nullFilter, SerialChainFilter.AND);
sf = new SortField("CloudCover_sort", SortField.Type.DOUBLE, true);
spatialQuery.setSort(new Sort(sf));
result = indexSearcher.doSearch(spatialQuery);
for (String s: result) {
resultReport = resultReport + s + '\n';
}
LOGGER.log(Level.FINER, "SortedSearch 5:\n{0}", resultReport);
expectedResult = new LinkedHashSet<>();
expectedResult.add("39727_22_19750113062500");
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("42292_9s_19900610041000");
assertEquals(expectedResult, result);
}
/**
*
* Test spatial lucene search.
*
* @throws java.lang.Exception
*/
@Test
@Order(order = 5)
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("11325_158_19640418141800");
expectedResult.add("39727_22_19750113062500");
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("meta_NaN_id");
expectedResult.add("42292_9s_19900610041000");
expectedResult.add("42292_5p_19900609195600");
expectedResult.add("40510_145_19930221211500");
expectedResult.add("cat-1");
expectedResult.add("gov.noaa.nodc.ncddc. MODXXYYYYJJJ.L3_Mosaic_NOAA_GMX or MODXXYYYYJJJHHMMSS.L3_NOAA_GMX");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7c3");
expectedResult.add("484fc4d9-8d11-48a5-a386-65c19398f7k7");
expectedResult.add("28644bf0-5d9d-4ebd-bef0-f2b0b2067b26");
expectedResult.add("937491cd-4bc4-43e4-9509-f6cc606f906e");
expectedResult.add("666-999-666");
expectedResult.add("999-666-999");
expectedResult.add("urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd");
assertEquals("CRS URN are not working", expectedResult, result);
}
/**
*
* Test spatial lucene search.
*
* @throws java.lang.Exception
*/
@Test
@Order(order = 6)
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);
/**
* Test 3
*/
identifier = "urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd";
result = indexSearcher.identifierQuery(identifier);
LOGGER.log(Level.FINER, "identifier query 3:\n{0}", result);
expectedResult = "urn:uuid:1ef30a8b-876d-4828-9246-c37ab4510bbd";
assertEquals(expectedResult, result);
}
/**
*
* Test spatial lucene search.
*
* @throws java.lang.Exception
*/
@Test
@Order(order = 7)
public void DeleteDocumentTest() throws Exception {
indexer.removeDocument("CTDF02");
indexSearcher.refresh();
/**
* 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 = null;
assertEquals(expectedResult, result);
}
@Test
@Order(order = 8)
public void extractValuesTest() throws Exception {
MD_IOFactory factory = null;
final Iterator<MD_IOFactory> ite = ServiceRegistry.lookupProviders(MD_IOFactory.class);
while (ite.hasNext()) {
MD_IOFactory currentFactory = ite.next();
if (currentFactory.matchImplementationType(ds, false)) {
factory = currentFactory;
}
}
Reader reader = factory.getReaderInstance(ds, false);
FullRecord record = reader.getRecord("40510_145_19930221211500");
assertNotNull(record);
List<Value> result = MDWebIndexer.getValuesFromPathID("ISO 19115:MD_Metadata:identificationInfo:citation:date#dateType=creation:date", record);
assertEquals(0, result.size());
result = MDWebIndexer.getValuesFromPathID("ISO 19115:MD_Metadata:identificationInfo:citation:date#dateType=revision:date", record);
assertEquals(1, result.size());
result = MDWebIndexer.getValuesFromPathID("ISO 19115:MD_Metadata:identificationInfo:pointOfContact#role=originator:organisationName:value", record);
assertEquals(1, result.size());
assertTrue(result.get(0) instanceof TextValue);
TextValue resultValue = (TextValue)result.get(0);
assertEquals("IFREMER / IDM/SISMER", resultValue.getValue());
result = MDWebIndexer.getValuesFromPathID("ISO 19115:MD_Metadata:identificationInfo:pointOfContact#role=custodian:organisationName:value", record);
assertEquals(0, result.size());
}
}