@Override public RevFeature readFeature(@Nullable ObjectId id, DataInput in) throws IOException { // <HEADER> // - unsigned varint: number of attributes final int attrCount = readUnsignedVarInt(in); // - unsigned varint: size of <DATA> final int dataSize = readUnsignedVarInt(in); // - unsigned varint[number of attributes]: attribute offsets (starting form zero at // <DATA>, not including the header) final int[] dataOffsets = new int[attrCount]; for (int i = 0; i < attrCount; i++) { dataOffsets[i] = readUnsignedVarInt(in); } // <DATA> byte[] data = new byte[dataSize]; in.readFully(data); LazyRevFeature f = new LazyRevFeature(id, dataOffsets, data, valueEncoder); if (id == null) { id = HashObject.hashFeature(f.values()); f.id = id; } return f; }
@Override public RevFeature readFeature(@Nullable ObjectId id, DataInput in) throws IOException { // <HEADER> // - unsigned varint: number of attributes final int attrCount = readUnsignedVarInt(in); // - unsigned varint: size of <DATA> final int dataSize = readUnsignedVarInt(in); // - unsigned varint[number of attributes]: attribute offsets (starting form zero at // <DATA>, not including the header) final int[] dataOffsets = new int[attrCount]; for (int i = 0; i < attrCount; i++) { dataOffsets[i] = readUnsignedVarInt(in); } // <DATA> byte[] data = new byte[dataSize]; in.readFully(data); LazyRevFeature f = new LazyRevFeature(id, dataOffsets, data, valueEncoder); if (id == null) { id = HashObject.hashFeature(f.values()); f.id = id; } return f; }
@VisibleForTesting void fastEncode(LazyRevFeature feature, DataOutput target) throws IOException { final int attrCount = feature.size(); final byte[] data = feature.data; final int[] offsets = feature.offsets; // <HEADER> // - unsigned varint: number of attributes writeUnsignedVarInt(attrCount, target); // - unsigned varint: size of <DATA> final int dataSize = data.length; writeUnsignedVarInt(dataSize, target); // - unsigned varint[number of attributes]: attribute offsets (starting form zero at // <DATA>, not including the header) for (int i = 0; i < attrCount; i++) { writeUnsignedVarInt(offsets[i], target); } // <DATA> target.write(data); }
@VisibleForTesting void fastEncode(LazyRevFeature feature, DataOutput target) throws IOException { final int attrCount = feature.size(); final byte[] data = feature.data; final int[] offsets = feature.offsets; // <HEADER> // - unsigned varint: number of attributes writeUnsignedVarInt(attrCount, target); // - unsigned varint: size of <DATA> final int dataSize = data.length; writeUnsignedVarInt(dataSize, target); // - unsigned varint[number of attributes]: attribute offsets (starting form zero at // <DATA>, not including the header) for (int i = 0; i < attrCount; i++) { writeUnsignedVarInt(offsets[i], target); } // <DATA> target.write(data); }
@Test public void testWriteFeatureFastPath() throws IOException { ByteArrayDataOutput target = ByteStreams.newDataOutput(); encoder.writeFeature(feature, target); byte[] encoded = target.toByteArray(); LazyRevFeature decoded = (LazyRevFeature) encoder.readFeature(null, ByteStreams.newDataInput(encoded)); target = ByteStreams.newDataOutput(); encoder.fastEncode(decoded, target); encoded = target.toByteArray(); LazyRevFeature decoded2 = (LazyRevFeature) encoder.readFeature(null, ByteStreams.newDataInput(encoded)); assertTrue(decoded instanceof LazyRevFeature); assertEquals(feature, decoded); assertTrue(decoded.equals(feature)); assertEquals(feature.getValues(), decoded.getValues()); assertEquals(feature, decoded2); assertEquals(feature.getValues(), decoded2.getValues()); }
@Test public void testWriteFeatureFastPath() throws IOException { ByteArrayDataOutput target = ByteStreams.newDataOutput(); encoder.writeFeature(feature, target); byte[] encoded = target.toByteArray(); LazyRevFeature decoded = (LazyRevFeature) encoder.readFeature(null, ByteStreams.newDataInput(encoded)); target = ByteStreams.newDataOutput(); encoder.fastEncode(decoded, target); encoded = target.toByteArray(); LazyRevFeature decoded2 = (LazyRevFeature) encoder.readFeature(null, ByteStreams.newDataInput(encoded)); assertTrue(decoded instanceof LazyRevFeature); assertEquals(feature, decoded); assertTrue(decoded.equals(feature)); assertEquals(feature.getValues(), decoded.getValues()); assertEquals(feature, decoded2); assertEquals(feature.getValues(), decoded2.getValues()); }
@Test public void testLazyRevFeatureProvidedGeometryFactory() throws IOException { LazyRevFeature decoded; { ByteArrayDataOutput target = ByteStreams.newDataOutput(); encoder.writeFeature(feature, target); byte[] encoded = target.toByteArray(); decoded = (LazyRevFeature) encoder.readFeature(null, ByteStreams.newDataInput(encoded)); } GeometryFactory provided = new GeometryFactory(); Geometry g1 = (Geometry) decoded.get(geomIndex).orNull(); assertNotSame(geom, g1); assertEquals(geom, g1); Geometry g2 = decoded.get(geomIndex, provided).orNull(); assertEquals(geom, g2); assertNotSame(g1, g2); assertSame(provided, g2.getFactory()); }
@Test public void testLazyRevFeatureProvidedGeometryFactory() throws IOException { LazyRevFeature decoded; { ByteArrayDataOutput target = ByteStreams.newDataOutput(); encoder.writeFeature(feature, target); byte[] encoded = target.toByteArray(); decoded = (LazyRevFeature) encoder.readFeature(null, ByteStreams.newDataInput(encoded)); } GeometryFactory provided = new GeometryFactory(); Geometry g1 = (Geometry) decoded.get(geomIndex).orNull(); assertNotSame(geom, g1); assertEquals(geom, g1); Geometry g2 = decoded.get(geomIndex, provided).orNull(); assertEquals(geom, g2); assertNotSame(g1, g2); assertSame(provided, g2.getFactory()); }
@Test public void testLazyRevFeatureForEach() throws IOException { LazyRevFeature decoded; { ByteArrayDataOutput target = ByteStreams.newDataOutput(); encoder.writeFeature(feature, target); byte[] encoded = target.toByteArray(); decoded = (LazyRevFeature) encoder.readFeature(null, ByteStreams.newDataInput(encoded)); } List<Object> values = new ArrayList<>(); decoded.forEach((v) -> values.add(v)); assertEquals(this.values, values); } }
@Test public void testLazyRevFeatureForEach() throws IOException { LazyRevFeature decoded; { ByteArrayDataOutput target = ByteStreams.newDataOutput(); encoder.writeFeature(feature, target); byte[] encoded = target.toByteArray(); decoded = (LazyRevFeature) encoder.readFeature(null, ByteStreams.newDataInput(encoded)); } List<Object> values = new ArrayList<>(); decoded.forEach((v) -> values.add(v)); assertEquals(this.values, values); } }
@Override public Optional<Object> get(final int index) { return Optional.fromNullable(parse(index)); }
@Override public Optional<Object> get(final int index) { return Optional.fromNullable(parse(index)); }
/** * Equality is based on id * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object o) { if (!(o instanceof RevFeature)) { return false; } return getId().equals(((RevObject) o).getId()); }
/** * Equality is based on id * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object o) { if (!(o instanceof RevFeature)) { return false; } return getId().equals(((RevObject) o).getId()); }