@Override public <T> List<TileData<T>> readTiles(String pyramidId, TileSerializer<T> serializer, Iterable<TileIndex> tiles, JSONObject properties) throws IOException{ List<TileData<T>> results = new LinkedList<TileData<T>>(); // iterate over the tile indices for (TileIndex tileIndex: tiles) { Rectangle2D rect = tilePyramid.getTileBounds(tileIndex); // get minimum/start time, max/end time double startX = rect.getX(); double endX = rect.getMaxX(); double startY = rect.getMaxY(); double endY = rect.getY(); SearchResponse sr = timeFilteredRequest(startX, endX, startY, endY, properties); if (responseHasData(sr)) { Histogram date_agg = sr.getAggregations().get("xField"); Map<Integer, Map> tileMap = parseAggregations(date_agg, tileIndex); SparseTileData tileData = new SparseTileData(tileIndex,tileMap, 0); results.add(tileData); } } return results; }
@Override public String toString () { return "<sparse-tile index=\""+getDefinition()+"\", default=\""+_defaultValue+"\"/>"; } }
@Test public void testSparseDefaults () throws Exception { TileSerializer<List<Integer>> serializer = new PrimitiveArrayAvroSerializer<>(Integer.class, CodecFactory.nullCodec()); SparseTileData<List<Integer>> sparseBase = new SparseTileData<List<Integer>>(new TileIndex(0, 0, 0, 2, 2), Arrays.asList(4, 5, 6)); { ByteArrayOutputStream baos = new ByteArrayOutputStream(); serializer.serialize(sparseBase, baos); baos.flush(); baos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); TileData<List<Integer>> out = serializer.deserialize(sparseBase.getDefinition(), bais); Assert.assertTrue(out instanceof SparseTileData<?>); List<Integer> baseDefault = sparseBase.getDefaultValue(); List<Integer> readDefault = ((SparseTileData<List<Integer>>) out).getDefaultValue(); Assert.assertEquals(baseDefault.size(), readDefault.size()); for (int i=0; i<baseDefault.size(); ++i) { Assert.assertEquals(baseDefault.get(i), readDefault.get(i)); } } } }
Iterator<Pair<BinIndex, T>> i = tile.getData(); while (i.hasNext()) { Pair<BinIndex, T> next = i.next(); TileIndex idx = tile.getDefinition(); tileRecord.put("level", idx.getLevel()); tileRecord.put("xIndex", idx.getX()); setValue(defaultValueRecord, tile.getDefaultValue()); tileRecord.put("default", defaultValueRecord);
@Test public void testSparseTileIterator () { SparseTileData<Integer> tile = new SparseTileData<>(new TileIndex(0, 0, 0)); tile.setBin(20, 2, 12); tile.setBin(10, 1, 3); tile.setBin(10, 5, 2); tile.setBin(120, 25, -2); tile.setBin(10, 4, 1); tile.setBin(120, 10, 10); tile.setBin(120, 9, 11); Iterator<Pair<BinIndex, Integer>> i = tile.getData(); Assert.assertEquals(new Pair<BinIndex, Integer>(new BinIndex(10, 1), 3), i.next()); Assert.assertEquals(new Pair<BinIndex, Integer>(new BinIndex(10, 4), 1), i.next()); Assert.assertEquals(new Pair<BinIndex, Integer>(new BinIndex(10, 5), 2), i.next()); Assert.assertEquals(new Pair<BinIndex, Integer>(new BinIndex(20, 2), 12), i.next()); Assert.assertEquals(new Pair<BinIndex, Integer>(new BinIndex(120, 9), 11), i.next()); Assert.assertEquals(new Pair<BinIndex, Integer>(new BinIndex(120, 10), 10), i.next()); Assert.assertEquals(new Pair<BinIndex, Integer>(new BinIndex(120, 25), -2), i.next()); Assert.assertFalse(i.hasNext()); }
@Test public void testPresetDefaultValue () { SparseTileData<Integer> tile = new SparseTileData<>(new TileIndex(0, 0, 0, 4, 4), 27); for (int x = 0; x < 4; ++x) { for (int y = 0; y < 4; ++y) { Assert.assertEquals(27, tile.getBin(x, y).intValue()); } } } }
public TileData<List<T>> harden () { TileIndex index = getDefinition(); if (isDense()) { DenseTileData<List<T>> hardened = new DenseTileData<>(index); hardened.setDefaultValue(_base.getDefaultValue()); for (int x=0; x<index.getXBins(); ++x) { for (int y=0; y<index.getYBins(); ++y) { hardened.setBin(x, y, getBin(x, y)); } } return hardened; } else { SparseTileData<List<T>> hardened = new SparseTileData<>(index, _base.getDefaultValue()); for (int x=0; x<index.getXBins(); ++x) { for (int y=0; y<index.getYBins(); ++y) { List<T> value = getBin(x, y); if (null != value) { hardened.setBin(x, y, getBin(x, y)); } } } return hardened; } }
@Test public void testDefaultDefaultValue () { SparseTileData<Integer> tile = new SparseTileData<>(new TileIndex(0, 0, 0, 4, 4)); for (int x = 0; x < 4; ++x) { for (int y = 0; y < 4; ++y) { Assert.assertNull(tile.getBin(x, y)); } } }
newTile = new SparseTileData<T>(newTileIndex, data, defaultValue); break;
TileIndex index = new TileIndex(0, 0, 0); TileData<Double> dense = new DenseTileData<>(index, 0.0); TileData<Double> sparse = new SparseTileData<>(index, 0.0);
@SafeVarargs final <T> void testRoundTripSparse(TypeDescriptor type, Class<?>[] classesToRegister, T defaultValue, T... data) throws Exception { TileSerializer<T> serializer = new KryoSerializer<T>(type, classesToRegister); // Create our tile int size = (int) Math.ceil(Math.sqrt(data.length*2)); TileData<T> input = new SparseTileData<T>(new TileIndex(0, 0, 0, size, size), defaultValue); int i = 0; for (int y=0; y<size; ++y) { for (int x=0; x<size; ++x) { if (0 == ((x+y)%2) && i < data.length) { input.setBin(x, y, data[i]); ++i; } } } // Send it round-trip through serialization ByteArrayOutputStream baos = new ByteArrayOutputStream(); serializer.serialize(input, baos); baos.flush(); baos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); TileData<T> output = serializer.deserialize(new TileIndex(1, 1, 1, size, size), bais); // Test to make sure output matches input. Assert.assertEquals(input.getDefinition(), output.getDefinition()); for (int y=0; y<size; ++y) { for (int x=0; x<size; ++x) { Assert.assertEquals(input.getBin(x, y), output.getBin(x, y)); } } }
@SafeVarargs final <T> void testRoundTrip(Class<? extends T> type, T defaultBin, T... data) throws Exception { TileSerializer<T> serializer = new PrimitiveAvroSerializer<T>(type, CodecFactory.nullCodec()); // Create our tile int size = data.length; TileData<T> input = new SparseTileData<>(new TileIndex(0, 0, 0, size, size), defaultBin); for (int i=0; i<size; ++i) { input.setBin(i, i, data[i]); } // Send it round-trip through serialization ByteArrayOutputStream baos = new ByteArrayOutputStream(); serializer.serialize(input, baos); baos.flush(); baos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); TileData<T> output = serializer.deserialize(new TileIndex(1, 1, 1, size, size), bais); // Test to make sure output matches input. Assert.assertEquals(input.getDefinition(), output.getDefinition()); for (int y=0; y<size; ++y) { for (int x=0; x<size; ++x) { Assert.assertEquals(input.getBin(x, y), output.getBin(x, y)); if (x == y) Assert.assertEquals(output.getBin(x, y), data[x]); else Assert.assertEquals(output.getBin(x, y), defaultBin); } } }