@Override public void writeMetaData (String pyramidId, String metaData) throws IOException { String key = getMetaDataKey(pyramidId); _data.put(key, metaData.getBytes()); }
@Override public <T> InputStream getTileStream (String pyramidId, TileSerializer<T> serializer, TileIndex tile) throws IOException { String key = getTileKey(pyramidId, tile); if (_data.containsKey(key)) { byte[] data = _data.get(key); return new ByteArrayInputStream(data); } else { return null; } }
@Override public <T> List<TileData<T>> readTiles (String pyramidId, TileSerializer<T> serializer, Iterable<TileIndex> tiles, JSONObject properties ) throws IOException { return readTiles( pyramidId, serializer, tiles ); }
public void testBackwardCompatbilitySerialize() throws IOException{ TestPyramidIO io = new TestPyramidIO(); TileSerializer<Double> serializer = new com.oculusinfo.binning.io.serialization.impl.BackwardCompatibilitySerializer(); TileIndex index = new TileIndex(0, 0, 0, 1, 1); TileData<Double> tile = new DenseTileData<Double>(index); tile.setBin(0, 0, 5.0); io.initializeForWrite("backwardsCompatibilityTest"); io.writeTiles("backwardsCompatibilityTest", serializer, Collections.singleton(tile)); List<TileData<Double>> tiles = io.readTiles("backwardsCompatibilityTest", serializer, Collections.singleton(index)); TileData<Double> tileOut = tiles.get(0); double dataOut = tileOut.getBin(0, 0); Assert.assertEquals(5.0, dataOut); }
@Test public void testStringArrayTileSerialization() throws IOException { TileIndex index = new TileIndex(2, 0, 1, 10, 20); TileData<List<String>> tile = new DenseTileData<List<String>>(index); for (int x=0; x<10; ++x) { for (int y=0; y<20; ++y) { tile.setBin(x, y, Arrays.asList(String.format("bin [%d, %d]", x, y), "second", "third")); } } PyramidIO io = new TestPyramidIO(); TileSerializer<List<String>> serializer = new PrimitiveArrayAvroSerializer<>(String.class, CodecFactory.nullCodec()); io.writeTiles(".", serializer, Collections.singleton(tile)); List<TileData<List<String>>> tilesOut = io.readTiles(".", serializer, Collections.singleton(index)); Assert.assertEquals(1, tilesOut.size()); TileData<List<String>> firstOut = tilesOut.get(0); Assert.assertEquals(tile.getDefinition(), firstOut.getDefinition()); for (int x = 0; x < tile.getDefinition().getXBins(); ++x) { for (int y = 0; y < tile.getDefinition().getYBins(); ++y) { List<String> inData = tile.getBin(x, y); List<String> outData = firstOut.getBin(x, y); Assert.assertEquals(inData.size(), outData.size()); for (int j=0; j<inData.size(); ++j) { Assert.assertEquals(inData.get(j), outData.get(j)); } } } }
@Test public void testDoubleArrayTileSerialization() throws IOException { TileIndex index = new TileIndex(2, 0, 1, 10, 20); TileData<List<Double>> tile = new DenseTileData<List<Double>>(index); for (int x=0; x<10; ++x) { for (int y=0; y<20; ++y) { tile.setBin(x, y, Arrays.asList(1.0*x, 2.0*y)); } } PyramidIO io = new TestPyramidIO(); TileSerializer<List<Double>> serializer = new PrimitiveArrayAvroSerializer<>(Double.class, CodecFactory.nullCodec()); io.writeTiles(".", serializer, Collections.singleton(tile)); List<TileData<List<Double>>> tilesOut = io.readTiles(".", serializer, Collections.singleton(index)); Assert.assertEquals(1, tilesOut.size()); TileData<List<Double>> firstOut = tilesOut.get(0); Assert.assertEquals(tile.getDefinition(), firstOut.getDefinition()); for (int x = 0; x < tile.getDefinition().getXBins(); ++x) { for (int y = 0; y < tile.getDefinition().getYBins(); ++y) { List<Double> inData = tile.getBin(x, y); List<Double> outData = firstOut.getBin(x, y); Assert.assertEquals(inData.size(), outData.size()); for (int j=0; j<inData.size(); ++j) { Assert.assertEquals(inData.get(j), outData.get(j), 1E-12); } } } }
@Test public void writeReadAvroRoundTripTest () { PyramidIO io = new TestPyramidIO(); TileSerializer<Integer> serializer = new PrimitiveAvroSerializer<>(Integer.class, CodecFactory.nullCodec());
@Override public <T> List<TileData<T>> readTiles (String pyramidId, TileSerializer<T> serializer, Iterable<TileIndex> tiles) throws IOException { List<TileData<T>> results = new ArrayList<TileData<T>>(); for (TileIndex index: tiles) { String key = getTileKey(pyramidId, index); if (_data.containsKey(key)) { byte[] data = _data.get(key); ByteArrayInputStream stream = new ByteArrayInputStream(data); results.add(serializer.deserialize(index, stream)); } else { results.add(null); } } return results; }
@Override public String readMetaData (String pyramidId) throws IOException { String key = getMetaDataKey(pyramidId); if (_data.containsKey(key)) { byte[] data = _data.get(key); return new String(data); } else { return null; } }
@Test public void testDoubleTileSerialization() throws IOException { TileIndex index = new TileIndex(2, 0, 1, 10, 20); TileData<Double> tile = new DenseTileData<Double>(index); for (int x=0; x<10; ++x) { for (int y=0; y<20; ++y) { tile.setBin(x, y, ((x+10*y)%7)/2.0); } } PyramidIO io = new TestPyramidIO(); TileSerializer<Double> serializer = new PrimitiveAvroSerializer<>(Double.class, CodecFactory.nullCodec()); io.writeTiles(".", serializer, Collections.singleton(tile)); List<TileData<Double>> tilesOut = io.readTiles(".", serializer, Collections.singleton(index)); Assert.assertEquals(1, tilesOut.size()); TileData<Double> firstOut = tilesOut.get(0); Assert.assertEquals(tile.getDefinition(), firstOut.getDefinition()); for (int x = 0; x < tile.getDefinition().getXBins(); ++x) { for (int y = 0; y < tile.getDefinition().getYBins(); ++y) { Assert.assertEquals(tile.getBin(x, y), firstOut.getBin(x, y), 1E-12); } } }
@Override public <T> void writeTiles (String pyramidId, TileSerializer<T> serializer, Iterable<TileData<T>> data) throws IOException { for (TileData<T> tile: data) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); serializer.serialize(tile, stream); stream.flush(); stream.close(); String key = getTileKey(pyramidId, tile.getDefinition()); _data.put(key, stream.toByteArray()); } }