blob: 2306ae096fb15b4a800a9552b89725e4c80d8290 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 com.datatorrent.lib.appdata.schemas;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.codehaus.jettison.json.JSONArray;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.apex.malhar.lib.dimensions.DimensionsDescriptor;
import org.apache.apex.malhar.lib.dimensions.aggregator.AggregatorIncrementalType;
import org.apache.apex.malhar.lib.dimensions.aggregator.AggregatorRegistry;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.datatorrent.lib.appdata.schemas.DimensionalConfigurationSchema.DimensionsCombination;
import com.datatorrent.lib.appdata.schemas.DimensionalConfigurationSchema.Key;
import com.datatorrent.lib.appdata.schemas.DimensionalConfigurationSchema.Value;
public class DimensionalConfigurationSchemaTest
{
private static final Logger logger = LoggerFactory.getLogger(DimensionalConfigurationSchemaTest.class);
@Before
public void initialize()
{
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY.setup();
}
@Test
public void noEnumTest()
{
//Test if loading of no enums works
DimensionalConfigurationSchema des = new DimensionalConfigurationSchema(
SchemaUtils.jarResourceFileToString("adsGenericEventSchemaNoEnums.json"),
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
DimensionalSchema dimensionalSchema = new DimensionalSchema(des);
dimensionalSchema.getSchemaJSON();
}
@Test
public void simpleTest()
{
final String keyName1 = "keyName1";
final String keyName2 = "keyName2";
final String keyName1Type = "string";
final String keyName2Type = "string";
final String valueName1 = "valueName1";
final String valueName2 = "valueName2";
final String valueName1Type = "double";
final String valueName2Type = "integer";
final String jsonSchema = "{\"keys\":\n" +
"[{\"name\":\"" + keyName1 + "\",\"type\":\"" + keyName1Type + "\"},\n" +
"{\"name\":\"" + keyName2 + "\",\"type\":\"" + keyName2Type + "\"}],\n" +
"\"values\":\n" +
"[{\"name\":\"" + valueName1 + "\",\"type\":\"" + valueName1Type + "\"},\n" +
"{\"name\":\"" + valueName2 + "\",\"type\":\"" + valueName2Type + "\"}],\n" +
"\"timeBuckets\":[all]," +
"\"dimensions\":\n" +
"[{\"combination\":[\"" + keyName1 + "\",\"" + keyName2 + "\"],\"additionalValues\":[\"" + valueName1 +
":MIN\"," + "\"" + valueName1 + ":MAX\"]},\n" +
"{\"combination\":[\"" + keyName1 + "\"],\"additionalValues\":[\"" + valueName2 + ":SUM\"," + "\"" +
valueName2 + ":COUNT\"]}]\n" +
"}";
DimensionalConfigurationSchema des = new DimensionalConfigurationSchema(jsonSchema,
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
FieldsDescriptor allKeysDescriptor = des.getKeyDescriptor();
Assert.assertEquals("Incorrect number of keys.", 2, allKeysDescriptor.getFields().getFields().size());
Assert.assertTrue("Doesn't contain required key.", allKeysDescriptor.getFields().getFields().contains(keyName1));
Assert.assertTrue("Doesn't contain required key.", allKeysDescriptor.getFields().getFields().contains(keyName2));
Assert.assertEquals("Key doesn't have correct type.", Type.STRING, allKeysDescriptor.getType(keyName1));
Assert.assertEquals("Key doesn't have correct type.", Type.STRING, allKeysDescriptor.getType(keyName2));
Assert.assertTrue("First descriptor must contain this key", des.getDimensionsDescriptorIDToKeyDescriptor().get(0).getFields().getFields().contains(keyName1));
Assert.assertTrue("First descriptor must contain this key", des.getDimensionsDescriptorIDToKeyDescriptor().get(0).getFields().getFields().contains(keyName2));
Assert.assertEquals("First descriptor must contain this key", Type.STRING, des.getDimensionsDescriptorIDToKeyDescriptor().get(0).getType(keyName1));
Assert.assertEquals("First descriptor must contain this key", Type.STRING, des.getDimensionsDescriptorIDToKeyDescriptor().get(0).getType(keyName2));
Assert.assertTrue("First descriptor must contain this key", des.getDimensionsDescriptorIDToKeyDescriptor().get(1).getFields().getFields().contains(keyName1));
Assert.assertFalse("First descriptor must contain this key", des.getDimensionsDescriptorIDToKeyDescriptor().get(1).getFields().getFields().contains(keyName2));
Assert.assertEquals("First descriptor must contain this key", Type.STRING, des.getDimensionsDescriptorIDToKeyDescriptor().get(1).getType(keyName1));
//Aggregate to dimensions descriptor
Set<String> ddKeys1 = Sets.newHashSet(keyName1, keyName2);
Set<String> ddKeys2 = Sets.newHashSet(keyName1);
Set<String> minAggFields = Sets.newHashSet(valueName1);
Set<String> maxAggFields = Sets.newHashSet(valueName1);
Set<String> sumAggFields = Sets.newHashSet(valueName2);
Set<String> countAggFields = Sets.newHashSet(valueName2);
logger.debug("map: {}", des.getDimensionsDescriptorIDToAggregatorToAggregateDescriptor().get(0));
Assert.assertTrue("Incorrect aggregate fields.",
des.getDimensionsDescriptorIDToAggregatorToAggregateDescriptor().get(0).get("MIN").getFields().getFields().equals(minAggFields));
Assert.assertTrue("Incorrect aggregate fields.",
des.getDimensionsDescriptorIDToAggregatorToAggregateDescriptor().get(0).get("MAX").getFields().getFields().equals(maxAggFields));
Assert.assertTrue("Incorrect aggregate fields.",
des.getDimensionsDescriptorIDToAggregatorToAggregateDescriptor().get(1).get("SUM").getFields().getFields().equals(sumAggFields));
Assert.assertTrue("Incorrect aggregate fields.",
des.getDimensionsDescriptorIDToAggregatorToAggregateDescriptor().get(1).get("COUNT").getFields().getFields().equals(countAggFields));
final Map<String, Integer> aggToId = Maps.newHashMap();
aggToId.put("min", 0);
aggToId.put("max", 1);
aggToId.put("sum", 2);
aggToId.put("count", 3);
}
@Test
public void countDescriptorTest()
{
final String keyName1 = "keyName1";
final String keyName2 = "keyName2";
final String keyName1Type = "string";
final String keyName2Type = "string";
final String valueName1 = "valueName1";
final String valueName2 = "valueName2";
final String valueName1Type = "double";
final String valueName2Type = "integer";
final String jsonSchema = "{\"keys\":\n" +
"[{\"name\":\"" + keyName1 + "\",\"type\":\"" + keyName1Type + "\"},\n" +
"{\"name\":\"" + keyName2 + "\",\"type\":\"" + keyName2Type + "\"}],\n" +
"\"values\":\n" +
"[{\"name\":\"" + valueName1 + "\",\"type\":\"" + valueName1Type + "\"},\n" +
"{\"name\":\"" + valueName2 + "\",\"type\":\"" + valueName2Type + "\"}],\n" +
"\"timeBuckets\":[\"1m\"]," +
"\"dimensions\":\n" +
"[{\"combination\":[\"" + keyName1 + "\",\"" + keyName2 + "\"],\"additionalValues\":[\"" + valueName1 +
":COUNT\"" + "]},\n" + "]\n" +
"}";
DimensionalConfigurationSchema des = new DimensionalConfigurationSchema(jsonSchema,
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
FieldsDescriptor fd = des.getDimensionsDescriptorIDToAggregatorIDToOutputAggregatorDescriptor().get(0).get(
AggregatorIncrementalType.NAME_TO_ORDINAL.get("COUNT"));
Assert.assertEquals("Indexes for type compress fields should be 0", 0,
(int)fd.getTypeToFieldToIndex().get(Type.LONG).get("valueName1"));
}
@Test
public void otfAggregatorDefinitionTest()
{
final String keyName1 = "keyName1";
final String keyName1Type = "string";
final String valueName1 = "valueName1";
final String valueName1Type = "double";
final String jsonSchema = "{\"keys\":\n" +
"[{\"name\":\"" + keyName1 + "\",\"type\":\"" + keyName1Type + "\"}],\n" +
"\"values\":\n" +
"[{\"name\":\"" + valueName1 + "\",\"type\":\"" + valueName1Type + "\",\"aggregators\":[\"AVG\"]}],\n" +
"\"timeBuckets\":[\"1m\"]," +
"\"dimensions\":\n" +
"[{\"combination\":[\"" + keyName1 + "\"]}]}";
logger.debug("test schema:\n{}", jsonSchema);
DimensionalConfigurationSchema des = new DimensionalConfigurationSchema(jsonSchema,
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
Assert.assertEquals(1, des.getDimensionsDescriptorIDToDimensionsDescriptor().size());
Map<String, Type> keyFieldToType = Maps.newHashMap();
keyFieldToType.put(keyName1, Type.STRING);
FieldsDescriptor keyFD = new FieldsDescriptor(keyFieldToType);
Map<String, Type> valueFieldToTypeSum = Maps.newHashMap();
valueFieldToTypeSum.put(valueName1, Type.DOUBLE);
FieldsDescriptor valueFDSum = new FieldsDescriptor(valueFieldToTypeSum);
Map<String, Type> valueFieldToTypeCount = Maps.newHashMap();
valueFieldToTypeCount.put(valueName1, Type.DOUBLE);
FieldsDescriptor valueFDCount = new FieldsDescriptor(valueFieldToTypeCount);
Assert.assertEquals(keyFD, des.getKeyDescriptor());
Assert.assertEquals(valueFDSum, des.getDimensionsDescriptorIDToAggregatorToAggregateDescriptor().get(0).get("SUM"));
Assert.assertEquals(valueFDCount, des.getDimensionsDescriptorIDToAggregatorToAggregateDescriptor().get(0).get("COUNT"));
}
@Test
public void getAllKeysDescriptorTest()
{
DimensionalConfigurationSchema des = new DimensionalConfigurationSchema(
SchemaUtils.jarResourceFileToString("adsGenericEventSchema.json"),
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
Set<String> keys = Sets.newHashSet("publisher", "advertiser", "location");
Assert.assertEquals(keys, des.getKeyDescriptor().getFields().getFields());
}
@Test
public void aggregationSchemaTest()
{
DimensionalConfigurationSchema des = new DimensionalConfigurationSchema(
SchemaUtils.jarResourceFileToString("adsGenericEventSchemaAggregations.json"),
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
Set<String> keys = Sets.newHashSet();
Assert.assertEquals(keys, des.getKeyDescriptor().getFields().getFields());
Assert.assertEquals(3, des.getDimensionsDescriptorIDToAggregatorIDToInputAggregatorDescriptor().size());
Assert.assertEquals(3, des.getDimensionsDescriptorIDToAggregatorIDToOutputAggregatorDescriptor().size());
Assert.assertEquals(3, des.getDimensionsDescriptorIDToAggregatorIDs().size());
Assert.assertEquals(3, des.getDimensionsDescriptorIDToAggregatorIDToInputAggregatorDescriptor().size());
Assert.assertEquals(3, des.getDimensionsDescriptorIDToDimensionsDescriptor().size());
Assert.assertEquals(3, des.getDimensionsDescriptorIDToKeyDescriptor().size());
Assert.assertEquals(3, des.getDimensionsDescriptorIDToAggregatorIDToInputAggregatorDescriptor().size());
Assert.assertEquals(3, des.getDimensionsDescriptorIDToValueToAggregator().size());
Assert.assertEquals(3, des.getDimensionsDescriptorIDToValueToOTFAggregator().size());
Assert.assertEquals(1, des.getDimensionsDescriptorIDToFieldToAggregatorAdditionalValues().size());
Assert.assertEquals(1, des.getDimensionsDescriptorIDToKeys().size());
}
@Test
public void simpleOTFTest()
{
DimensionalConfigurationSchema des = new DimensionalConfigurationSchema(
SchemaUtils.jarResourceFileToString("adsGenericEventSchemaOTF.json"),
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
Assert.assertEquals(4, des.getDimensionsDescriptorIDToAggregatorIDs().get(0).size());
}
@Test
public void testConstructorAgreement()
{
DimensionalConfigurationSchema expectedEventSchema = new DimensionalConfigurationSchema(
SchemaUtils.jarResourceFileToString("adsGenericEventSchemaAdditional.json"),
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
@SuppressWarnings("unchecked")
List<Object> publisherEnumVals = (List<Object>)((List)Lists.newArrayList("twitter", "facebook", "yahoo", "google",
"bing", "amazon"));
@SuppressWarnings("unchecked")
List<Object> advertiserEnumVals = (List<Object>)((List)Lists.newArrayList("starbucks", "safeway", "mcdonalds",
"macys", "taco bell", "walmart", "khol's", "san diego zoo", "pandas", "jack in the box", "tomatina",
"ron swanson"));
@SuppressWarnings("unchecked")
List<Object> locationEnumVals = (List<Object>)((List)Lists.newArrayList("N", "LREC", "SKY", "AL", "AK", "AZ", "AR",
"CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID"));
List<Key> keys = Lists.newArrayList(new Key("publisher", Type.STRING, publisherEnumVals),
new Key("advertiser", Type.STRING, advertiserEnumVals), new Key("location", Type.STRING, locationEnumVals));
List<TimeBucket> timeBuckets = Lists.newArrayList(TimeBucket.MINUTE, TimeBucket.HOUR, TimeBucket.DAY);
List<Value> values = Lists.newArrayList(new Value("impressions", Type.LONG, Sets.newHashSet("SUM", "COUNT")),
new Value("clicks", Type.LONG, Sets.newHashSet("SUM", "COUNT")),
new Value("cost", Type.DOUBLE, Sets.newHashSet("SUM", "COUNT")),
new Value("revenue", Type.DOUBLE, Sets.newHashSet("SUM", "COUNT")));
Map<String, Set<String>> valueToAggregators = Maps.newHashMap();
valueToAggregators.put("impressions", Sets.newHashSet("MIN", "MAX"));
valueToAggregators.put("clicks", Sets.newHashSet("MIN", "MAX"));
valueToAggregators.put("cost", Sets.newHashSet("MIN", "MAX"));
valueToAggregators.put("revenue", Sets.newHashSet("MIN", "MAX"));
Set<String> emptySet = Sets.newHashSet();
Map<String, Set<String>> emptyMap = Maps.newHashMap();
List<DimensionsCombination> dimensionsCombinations = Lists.newArrayList(
new DimensionsCombination(new Fields(emptySet), emptyMap),
new DimensionsCombination(new Fields(Sets.newHashSet("location")), emptyMap),
new DimensionsCombination(new Fields(Sets.newHashSet("advertiser")), valueToAggregators),
new DimensionsCombination(new Fields(Sets.newHashSet("publisher")), valueToAggregators),
new DimensionsCombination(new Fields(Sets.newHashSet("advertiser", "location")), emptyMap),
new DimensionsCombination(new Fields(Sets.newHashSet("publisher", "location")), emptyMap),
new DimensionsCombination(new Fields(Sets.newHashSet("publisher", "advertiser")), emptyMap),
new DimensionsCombination(new Fields(Sets.newHashSet("publisher", "advertiser", "location")), emptyMap));
DimensionalConfigurationSchema eventSchema = new DimensionalConfigurationSchema(keys,
values, timeBuckets, dimensionsCombinations, AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
logger.debug("expected {}", expectedEventSchema.getDimensionsDescriptorIDToValueToOTFAggregator());
logger.debug("actual {}", eventSchema.getDimensionsDescriptorIDToValueToOTFAggregator());
Assert.assertEquals(expectedEventSchema, eventSchema);
}
@Test
public void testOTFAggregatorMap()
{
DimensionalConfigurationSchema schema = new DimensionalConfigurationSchema(
SchemaUtils.jarResourceFileToString("adsGenericEventSchemaOTF.json"),
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
Set<String> otfAggregator = Sets.newHashSet("AVG");
Set<String> valueSet = Sets.newHashSet("impressions", "clicks", "cost", "revenue");
List<Map<String, FieldsDescriptor>> aggregatorToDescriptor = schema.getDimensionsDescriptorIDToOTFAggregatorToAggregateDescriptor();
List<Map<String, Set<String>>> valueToAggregator = schema.getDimensionsDescriptorIDToValueToOTFAggregator();
for (int ddId = 0; ddId < aggregatorToDescriptor.size(); ddId++) {
Assert.assertEquals(otfAggregator, aggregatorToDescriptor.get(ddId).keySet());
Assert.assertNotNull(aggregatorToDescriptor.get(ddId).get("AVG"));
Assert.assertEquals(valueSet, valueToAggregator.get(ddId).keySet());
Map<String, Set<String>> tempValueToAgg = valueToAggregator.get(ddId);
for (Map.Entry<String, Set<String>> entry : tempValueToAgg.entrySet()) {
Assert.assertEquals(otfAggregator, entry.getValue());
}
}
}
@Test
public void testCustomTimeBuckets()
{
DimensionalConfigurationSchema schema = new DimensionalConfigurationSchema(SchemaUtils.jarResourceFileToString("adsGenericEventSchemaCustomTimeBuckets.json"), AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
Assert.assertEquals(3, schema.getTimeBuckets().size());
Assert.assertEquals(5, schema.getCustomTimeBuckets().size());
List<CustomTimeBucket> customTimeBuckets = Lists.newArrayList(new CustomTimeBucket(TimeBucket.MINUTE),
new CustomTimeBucket(TimeBucket.HOUR),
new CustomTimeBucket(TimeBucket.DAY),
new CustomTimeBucket(TimeBucket.MINUTE, 5),
new CustomTimeBucket(TimeBucket.HOUR, 3));
Assert.assertEquals(customTimeBuckets, schema.getCustomTimeBuckets());
Assert.assertEquals(40, schema.getDimensionsDescriptorIDToKeyDescriptor().size());
JSONArray timeBucketsArray = new JSONArray();
timeBucketsArray.put("1m").put("1h").put("1d").put("5m").put("3h");
Assert.assertEquals(timeBucketsArray.toString(), schema.getBucketsString());
CustomTimeBucket customTimeBucket = schema.getCustomTimeBucketRegistry().getTimeBucket(TimeBucket.MINUTE.ordinal());
Assert.assertTrue(customTimeBucket.isUnit());
Assert.assertEquals(TimeBucket.MINUTE, customTimeBucket.getTimeBucket());
customTimeBucket = schema.getCustomTimeBucketRegistry().getTimeBucket(TimeBucket.HOUR.ordinal());
Assert.assertTrue(customTimeBucket.isUnit());
Assert.assertEquals(TimeBucket.HOUR, customTimeBucket.getTimeBucket());
customTimeBucket = schema.getCustomTimeBucketRegistry().getTimeBucket(TimeBucket.DAY.ordinal());
Assert.assertTrue(customTimeBucket.isUnit());
Assert.assertEquals(TimeBucket.DAY, customTimeBucket.getTimeBucket());
int id5m = schema.getCustomTimeBucketRegistry().getTimeBucketId(new CustomTimeBucket(TimeBucket.MINUTE, 5));
int id3h = schema.getCustomTimeBucketRegistry().getTimeBucketId(new CustomTimeBucket(TimeBucket.HOUR, 3));
Assert.assertEquals(256, id5m);
Assert.assertEquals(257, id3h);
for (int ddID = 0; ddID < schema.getDimensionsDescriptorIDToDimensionsDescriptor().size(); ddID++) {
DimensionsDescriptor dd = schema.getDimensionsDescriptorIDToDimensionsDescriptor().get(ddID);
Assert.assertEquals(customTimeBuckets.get(ddID % 5), dd.getCustomTimeBucket());
}
}
@Test
public void testAllCombinationsGeneration()
{
DimensionalConfigurationSchema schema = new DimensionalConfigurationSchema(SchemaUtils.jarResourceFileToString("adsGenericEventSimpleAllCombinations.json"), AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
Set<DimensionsDescriptor> dimensionsDescriptors = Sets.newHashSet();
dimensionsDescriptors.add(new DimensionsDescriptor(TimeBucket.MINUTE, new Fields(new HashSet<String>())));
dimensionsDescriptors.add(new DimensionsDescriptor(TimeBucket.MINUTE, new Fields(Sets.newHashSet("publisher"))));
dimensionsDescriptors.add(new DimensionsDescriptor(TimeBucket.MINUTE, new Fields(Sets.newHashSet("advertiser"))));
dimensionsDescriptors.add(new DimensionsDescriptor(TimeBucket.MINUTE, new Fields(Sets.newHashSet("location"))));
dimensionsDescriptors.add(new DimensionsDescriptor(TimeBucket.MINUTE, new Fields(Sets.newHashSet("publisher", "advertiser"))));
dimensionsDescriptors.add(new DimensionsDescriptor(TimeBucket.MINUTE, new Fields(Sets.newHashSet("publisher", "location"))));
dimensionsDescriptors.add(new DimensionsDescriptor(TimeBucket.MINUTE, new Fields(Sets.newHashSet("advertiser", "location"))));
dimensionsDescriptors.add(new DimensionsDescriptor(TimeBucket.MINUTE, new Fields(Sets.newHashSet("publisher", "advertiser", "location"))));
Set<DimensionsDescriptor> actualDimensionsDescriptors = Sets.newHashSet();
for (DimensionsDescriptor dimensionsDescriptor : schema.getDimensionsDescriptorToID().keySet()) {
actualDimensionsDescriptors.add(dimensionsDescriptor);
}
List<DimensionsDescriptor> ddList = Lists.newArrayList(dimensionsDescriptors);
List<DimensionsDescriptor> ddActualList = Lists.newArrayList(actualDimensionsDescriptors);
Collections.sort(ddList);
Collections.sort(ddActualList);
Assert.assertEquals(dimensionsDescriptors, actualDimensionsDescriptors);
}
public void testLoadingSchemaWithNoTimeBucket()
{
DimensionalConfigurationSchema schema = new DimensionalConfigurationSchema(
SchemaUtils.jarResourceFileToString("adsGenericEventSchemaNoTime.json"),
AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
Assert.assertEquals(1, schema.getTimeBuckets().size());
Assert.assertEquals(TimeBucket.ALL, schema.getTimeBuckets().get(0));
}
/**
* A schema illustrating this corner case is as follows:
* <br/>
* <pre>
* {@code
* {"keys":[{"name":"publisher","type":"string"},
* {"name":"advertiser","type":"string"},
* {"name":"location","type":"string"}],
* "timeBuckets":["1m"],
* "values":
* [{"name":"impressions","type":"long","aggregators":["SUM"]},
* {"name":"clicks","type":"long","aggregators":["SUM"]},
* {"name":"cost","type":"double","aggregators":["SUM"]},
* {"name":"revenue","type":"double"}],
* "dimensions":
* [{"combination":[]},
* {"combination":["location"],"additionalValues":["revenue:SUM"]}]
* }
* }
* </pre>
*/
@Test
public void testAdditionalValuesOneCornerCase()
{
DimensionalConfigurationSchema schema = new DimensionalConfigurationSchema(SchemaUtils.jarResourceFileToString("adsGenericEventSchemaAdditionalOne.json"), AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
int sumID = AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY.getIncrementalAggregatorNameToID().get("SUM");
Assert.assertEquals(3, schema.getDimensionsDescriptorIDToAggregatorIDToOutputAggregatorDescriptor().get(0).get(sumID).getFieldList().size());
Assert.assertEquals(4, schema.getDimensionsDescriptorIDToAggregatorIDToOutputAggregatorDescriptor().get(1).get(sumID).getFieldList().size());
}
/**
* Tests to make sure that the correct number of dimension descriptors are produced when different time buckets are
* specified for each dimension combination.
*/
@Test
public void testTimeBucketsDimensionCombination()
{
final int numDDIds = 11;
final int numCombinations = 3;
DimensionalConfigurationSchema schema = new DimensionalConfigurationSchema(SchemaUtils.jarResourceFileToString("adsGenericEventSchemaDimensionTimeBuckets.json"), AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
List<DimensionsDescriptor> dimensionsDescriptors = schema.getDimensionsDescriptorIDToDimensionsDescriptor();
Assert.assertEquals(numDDIds, dimensionsDescriptors.size());
Assert.assertEquals(numDDIds, schema.getDimensionsDescriptorIDToAggregatorIDToInputAggregatorDescriptor().size());
Assert.assertEquals(numDDIds, schema.getDimensionsDescriptorIDToAggregatorIDToOutputAggregatorDescriptor().size());
Assert.assertEquals(numDDIds, schema.getDimensionsDescriptorIDToAggregatorIDs().size());
Assert.assertEquals(numDDIds, schema.getDimensionsDescriptorIDToAggregatorToAggregateDescriptor().size());
Assert.assertEquals(numDDIds, schema.getDimensionsDescriptorIDToDimensionsDescriptor().size());
Assert.assertEquals(numDDIds, schema.getDimensionsDescriptorIDToKeyDescriptor().size());
Assert.assertEquals(numDDIds, schema.getDimensionsDescriptorIDToOTFAggregatorToAggregateDescriptor().size());
Assert.assertEquals(numDDIds, schema.getDimensionsDescriptorIDToValueToAggregator().size());
Assert.assertEquals(numDDIds, schema.getDimensionsDescriptorIDToValueToOTFAggregator().size());
Assert.assertEquals(numCombinations, schema.getDimensionsDescriptorIDToFieldToAggregatorAdditionalValues().size());
Assert.assertEquals(numCombinations, schema.getDimensionsDescriptorIDToKeys().size());
String[] buckets = new String[]{"1m", "3d", "1h", "5s", "1m", "3d", "1m", "3d", "30s", "2h", "1d"};
for (int ddId = 0; ddId < numDDIds; ddId++) {
CustomTimeBucket customTimeBucket = dimensionsDescriptors.get(ddId).getCustomTimeBucket();
Assert.assertEquals(new CustomTimeBucket(buckets[ddId]), customTimeBucket);
}
}
@Test
public void testTimeBucketsBackwardCompatibility()
{
DimensionalConfigurationSchema schema = new DimensionalConfigurationSchema(SchemaUtils.jarResourceFileToString("adsGenericEventSchemaDimensionTimeBuckets.json"), AggregatorRegistry.DEFAULT_AGGREGATOR_REGISTRY);
Assert.assertEquals(2, schema.getCustomTimeBuckets().size());
}
private static final Logger LOG = LoggerFactory.getLogger(DimensionalConfigurationSchemaTest.class);
}