/**
* Copyright (C) 2012 52°North Initiative for Geospatial Open Source Software GmbH
*
* 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.n52.sos.db;
import static org.hamcrest.CoreMatchers.is;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.logging.Logger;
import org.junit.Assert;
import org.junit.Test;
import org.n52.om.observation.MultiValueObservation;
import org.n52.oxf.valueDomains.time.ITimePosition;
import org.n52.oxf.valueDomains.time.TimeConverter;
import org.n52.sos.db.impl.SubField;
import org.n52.sos.encoder.AQDObservationEncoder;
import org.n52.sos.encoder.JSONObservationEncoder;
import org.n52.sos.it.EsriTestBase;
public class AccessGdbForObservationsIT extends EsriTestBase {
static Logger LOGGER = Logger.getLogger(AccessGdbForObservationsIT.class.getName());
@Test
public void testGetObservationsStringArray()
{
String observationID = "GB_Observation_59";
try {
Map<String, MultiValueObservation> result = gdb.getObservationAccess().getObservations(new String[]{observationID});
for (String key : result.keySet()) {
Assert.assertEquals(key, observationID);
}
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testGetObservations()
{
try {
String[] offerings = new String[]{"Network_GBXXXX"};
String spatialFilter = null; //"{\"xmin\":-180.0,\"ymin\":-90.0,\"xmax\":180.0,\"ymax\":90.0,\"spatialReference\":{\"wkid\":4326}}";
String temporalFilter = "before:2013-04-15T01:00:00";
String where = null;//"value_numeric > 9";
String[] observedProperties = new String[]{"http://dd.eionet.europa.eu/vocabulary/aq/pollutant/1"};
String[] procedures = null;
String[] featuresOfInterest = null;
String[] aggregationTypes = new String[]{"http://dd.eionet.europa.eu/vocabulary/aq/averagingperiod/1d"};
Map<String, MultiValueObservation> idObsList = gdb.getObservationAccess().getObservations(offerings, featuresOfInterest, observedProperties, procedures, spatialFilter, temporalFilter, aggregationTypes, where);
AQDObservationEncoder encoder = new AQDObservationEncoder();
String result = encoder.encodeObservations(idObsList);
OutputStream out = new FileOutputStream("c:/temp/observations.xml");
out.write(result.getBytes());
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
@Test
public void testCreateTemporalClauseSDE()
{
// TEST: equals:yyyy-MM-ddTHH:mm:ss+HH:mm
String temporalFilter = "equals:2011-12-04T15:45:30+04:00";
String expectedTemporalClause = SubField.VALUE_DATETIME_END + " = '2011-12-04 11:45:30'";
String temporalClause = gdb.getObservationAccess().createTemporalClauseSDE(temporalFilter);
Assert.assertEquals(expectedTemporalClause, temporalClause);
// TEST: after:yyyy-MM-ddTHH:mm:ss+HH:mm<br>
temporalFilter = "after:2011-12-04T15:45:30+04:00";
expectedTemporalClause = SubField.VALUE_DATETIME_END + " > '2011-12-04 11:45:30'";
temporalClause = gdb.getObservationAccess().createTemporalClauseSDE(temporalFilter);
Assert.assertEquals(expectedTemporalClause, temporalClause);
// TEST: before:yyyy-MM-ddTHH:mm:ss+HH:mm<br>
temporalFilter = "before:2011-12-04T15:45:30+04:00";
expectedTemporalClause = SubField.VALUE_DATETIME_END + " < '2011-12-04 11:45:30'";
temporalClause = gdb.getObservationAccess().createTemporalClauseSDE(temporalFilter);
Assert.assertEquals(expectedTemporalClause, temporalClause);
// TEST: during:yyyy-MM-ddTHH:mm:ss+HH:mm,yyyy-MM-dd HH:mm:ss+HH:mm
temporalFilter = "during:2011-12-04T15:45:30+04:00,2011-12-04T15:45:30+04:00";
expectedTemporalClause = SubField.VALUE_DATETIME_END + " BETWEEN '2011-12-04 11:45:30' AND '2011-12-04 11:45:30'";
temporalClause = gdb.getObservationAccess().createTemporalClauseSDE(temporalFilter);
Assert.assertEquals(expectedTemporalClause, temporalClause);
// TEST: last:milliseconds,+HH:mm
// cannot geoDBQuerier this, since there is a System.currentTimeMillis() call in the method.
}
public void testCreatePhenomenonTimeFromDate(){
try {
// assuming this is the temporal filter submitted by the client:
String temporalFilter = "equals:2011-12-04T15:45:30+04:00";
// assuming this is the corresponding date of an observation coming from our UTC database:
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2011-12-04 11:45:30");
ITimePosition timePos = TimeConverter.createTimeFromDate(date, temporalFilter);
Assert.assertEquals("2011-12-04T15:45:30+04:00", timePos.toISO8601Format());
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
public void testExtractTemporalOperandAfterKeyWord(){
Assert.assertEquals("2011-12-04T15:45:30+04:00", TimeConverter.extractTemporalOperandAfterKeyWord("equals:2011-12-04T15:45:30+04:00"));
Assert.assertEquals("2011-12-04T15:45:30+04:00,2011-12-04T15:50:30+04:00", TimeConverter.extractTemporalOperandAfterKeyWord("during:2011-12-04T15:45:30+04:00,2011-12-04T15:50:30+04:00"));
Assert.assertEquals("100,+02:00", TimeConverter.extractTemporalOperandAfterKeyWord("last:100,+02:00"));
}
/**
* Test method for {@link
* org.n52.sos.db.AccessObservationGDB#getObservation(...)} .
*/
public void testVariousGetObservations()
{
try {
Map<String, MultiValueObservation> observations = null;
long millis;
LOGGER.info("###################################### no parameter geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(null, null, null, null, null, null, null, null);
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("without Entries ", observations);
LOGGER.info("###################################### offering geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(new String[] { "Observations of my thermometer" }, null, null, null, null, null, null, null);
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("with Offerings", observations);
LOGGER.info("###################################### featuresOfInterest geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(null, new String[] { "WXT500" }, null, null, null, null, null, null);
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("with feature of interest '' ", observations);
LOGGER.info("###################################### spatial filter 1 geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(null, null, null, null, "{xmin:0.0,ymin:40.0,xmax:2.0,ymax:43.0,spatialReference:{wkid:4326}}", null, null, null);
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("with feature of interest '' ", observations);
LOGGER.info("###################################### spatial filter 2 geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(null, null, null, null, "{x:1.121389,y:41.152222,spatialReference:{wkid:4326}}", null, null, null);
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("with feature of interest '' ", observations);
LOGGER.info("###################################### temporal filter 'equals' geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(null, null, null, null, null, "equals:2011-07-28T10:00:00+12:00", null, null);
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("equals:<time instant>", observations);
LOGGER.info("###################################### temporal filter 'during' geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(null, null, null, null, null, "during:2011-08-13T10:00:00,2011-08-13T11:00:00", null, null);
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("during:<time start>,<time end>", observations);
LOGGER.info("###################################### temporal filter 'after' geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(null, null, null, null, null, "after:2011-08-13T10:00:00", null, null);
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("after:<time instant>", observations);
LOGGER.info("###################################### temporal filter 'before' geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(null, null, null, null, null, "before:2011-08-13T10:00:00", null, null);
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("before:<time instant>", observations);
LOGGER.info("###################################### temporal filter 'last' geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(null, null, null, null, null, "last:3600000000,+02:00", null, null);
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("last:<time duration>", observations);
LOGGER.info("###################################### where geoDBQuerier");
millis = System.currentTimeMillis();
observations = gdb.getObservationAccess().getObservations(null, null, null, null, null, null, null, "NUMERIC_VALUE > 2500");
LOGGER.info("Duration: " + (System.currentTimeMillis() - millis));
LOGGER.info("Count: " + observations.size());
Assert.assertNotNull("last:<time duration>", observations);
LOGGER.info(JSONObservationEncoder.encodeObservations(observations).toString(2));
// // TODO Problem with ' in the entry, check later
// observations = geoDBQuerier.getObservations(new String[] {
// "Observations of Paul's thermometer" }, null, null, null, null,
// null,
// null);
// assertEquals("mit Offerings '' ", 3, observations.length);
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
}