package mil.nga.giat.geowave.adapter.vector.stats;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.text.ParseException;
import java.util.Arrays;
import mil.nga.giat.geowave.adapter.vector.FeatureDataAdapter;
import mil.nga.giat.geowave.adapter.vector.stats.FeatureCountMinSketchStatistics.FeatureCountMinSketchConfig;
import mil.nga.giat.geowave.adapter.vector.stats.FeatureFixedBinNumericStatistics.FeatureFixedBinConfig;
import mil.nga.giat.geowave.adapter.vector.stats.FeatureHyperLogLogStatistics.FeatureHyperLogLogConfig;
import mil.nga.giat.geowave.adapter.vector.stats.FeatureNumericHistogramStatistics.FeatureNumericHistogramConfig;
import mil.nga.giat.geowave.adapter.vector.stats.StatsConfigurationCollection.SimpleFeatureStatsConfigurationCollection;
import mil.nga.giat.geowave.adapter.vector.utils.SimpleFeatureUserDataConfigurationSet;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.store.adapter.statistics.DataStatistics;
import mil.nga.giat.geowave.core.store.data.visibility.GlobalVisibilityHandler;
import org.apache.commons.lang.ArrayUtils;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.geotools.data.DataUtilities;
import org.geotools.feature.SchemaException;
import org.geotools.filter.text.cql2.CQLException;
import org.junit.Before;
import org.junit.Test;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
public class StatsManagerTest
{
private SimpleFeatureType schema;
FeatureDataAdapter dataAdapter;
@Before
public void setup()
throws SchemaException,
CQLException,
ParseException {
schema = DataUtilities.createType(
"sp.geostuff",
"geometry:Geometry:srid=4326,pop:java.lang.Long,when:Date,whennot:Date,somewhere:Polygon,pid:String");
dataAdapter = new FeatureDataAdapter(
schema,
new GlobalVisibilityHandler<SimpleFeature, Object>(
"default"));
}
@Test
public void test() {
final StatsManager statsManager = new StatsManager(
dataAdapter,
schema);
final ByteArrayId[] ids = statsManager.getSupportedStatisticsIds();
assertTrue(ids.length > 6);
assertTrue(ArrayUtils.contains(
ids,
FeatureNumericRangeStatistics.composeId("pop")));
assertTrue(ArrayUtils.contains(
ids,
FeatureBoundingBoxStatistics.composeId("somewhere")));
assertTrue(ArrayUtils.contains(
ids,
FeatureBoundingBoxStatistics.composeId("geometry")));
assertTrue(ArrayUtils.contains(
ids,
FeatureTimeRangeStatistics.composeId("when")));
assertTrue(ArrayUtils.contains(
ids,
FeatureTimeRangeStatistics.composeId("whennot")));
// can each type be created uniquely
DataStatistics<SimpleFeature> stat = statsManager.createDataStatistics(
dataAdapter,
FeatureBoundingBoxStatistics.composeId("somewhere"));
assertNotNull(stat);
assertFalse(stat == statsManager.createDataStatistics(
dataAdapter,
FeatureBoundingBoxStatistics.composeId("somewhere")));
final FeatureBoundingBoxStatistics newStat = new FeatureBoundingBoxStatistics();
newStat.fromBinary(stat.toBinary());
assertEquals(
newStat.getMaxY(),
((FeatureBoundingBoxStatistics) stat).getMaxY(),
0.001);
assertEquals(
newStat.getFieldName(),
((FeatureBoundingBoxStatistics) stat).getFieldName());
stat = statsManager.createDataStatistics(
dataAdapter,
FeatureTimeRangeStatistics.composeId("when"));
assertNotNull(stat);
assertFalse(stat == statsManager.createDataStatistics(
dataAdapter,
FeatureTimeRangeStatistics.composeId("when")));
stat = statsManager.createDataStatistics(
dataAdapter,
FeatureNumericRangeStatistics.composeId("pop"));
assertNotNull(stat);
assertFalse(stat == statsManager.createDataStatistics(
dataAdapter,
FeatureNumericRangeStatistics.composeId("pop")));
}
@Test
public void forcedConfiguration()
throws SchemaException,
JsonGenerationException,
JsonMappingException,
IndexOutOfBoundsException,
IOException {
final SimpleFeatureType schema = DataUtilities.createType(
"sp.geostuff",
"geometry:Geometry:srid=4326,pop:java.lang.Long,when:Date,whennot:Date,somewhere:Polygon,pid:String");
schema.getDescriptor(
1).getUserData().put(
"stats",
new StatsConfigurationCollection(
Arrays.asList(
new FeatureFixedBinConfig(
0.0,
1.0,
24),
new FeatureNumericHistogramConfig())));
schema.getDescriptor(
5).getUserData().put(
"stats",
new StatsConfigurationCollection(
Arrays.asList(
new FeatureCountMinSketchConfig(
0.01,
0.97),
new FeatureHyperLogLogConfig(
24))));
final FeatureDataAdapter dataAdapter = new FeatureDataAdapter(
schema,
new GlobalVisibilityHandler<SimpleFeature, Object>(
"default"));
final StatsManager statsManager = new StatsManager(
dataAdapter,
schema);
final ByteArrayId[] ids = statsManager.getSupportedStatisticsIds();
assertEquals(
9,
ids.length);
DataStatistics<SimpleFeature> stat = statsManager.createDataStatistics(
dataAdapter,
FeatureFixedBinNumericStatistics.composeId("pop"));
assertNotNull(stat);
stat = statsManager.createDataStatistics(
dataAdapter,
FeatureNumericHistogramStatistics.composeId("pop"));
assertNotNull(stat);
stat = statsManager.createDataStatistics(
dataAdapter,
FeatureHyperLogLogStatistics.composeId("pid"));
assertNotNull(stat);
stat = statsManager.createDataStatistics(
dataAdapter,
FeatureCountMinSketchStatistics.composeId("pid"));
assertNotNull(stat);
final SimpleFeatureUserDataConfigurationSet config = new SimpleFeatureUserDataConfigurationSet();
config.addConfigurations(
schema.getTypeName(),
new SimpleFeatureStatsConfigurationCollection());
config.configureFromType(schema);
config.fromJsonString(
config.asJsonString(),
schema);
}
private String dump(
final String value ) {
System.out.println(value);
return value;
}
}