pieter, i updated that branch and issued this PR (and i'm running the full test suite now):
https://github.com/apache/tinkerpop/pull/706 please review/VOTE if i got it right - let's finish off any final discussion/tweaks on the PR itself. thanks for noting this problem. > This v3 looks like a <3 heart where the top broke off. hehe On Wed, Sep 6, 2017 at 1:56 PM, Paul A. Jackson <paul.jack...@pb.com> wrote: > This v3 looks like a <3 heart where the top broke off. > > Sad. > > > -----Original Message----- > From: Stephen Mallette [mailto:spmalle...@gmail.com] > Sent: Wednesday, September 06, 2017 1:45 PM > To: dev@tinkerpop.apache.org > Subject: Re: io and graphson-v3 > > never mind - i see what's messed up > > On Wed, Sep 6, 2017 at 1:43 PM, Stephen Mallette <spmalle...@gmail.com> > wrote: > > > Which tests in particular are failing for SerializationTest? all of them? > > > > On Wed, Sep 6, 2017 at 1:35 PM, pieter gmail <pieter.mar...@gmail.com> > > wrote: > > > >> Hi, > >> > >> Pulled TINKERPOP-1767 branch, changed SqlgGraph's io method and ran > >> the tests. > >> > >> All the io tests are passing. > >> Only SerializationTest fails for the same reason. It too needs the > >> version specified. I did that locally and then all tests passes. > >> > >> Thanks > >> Pieter > >> > >> On 06/09/2017 18:09, Stephen Mallette wrote: > >> > >>> Pieter, I created this issue: > >>> > >>> https://issues.apache.org/jira/browse/TINKERPOP-1767 > >>> > >>> and made an effort to try to figure a way to fix it: > >>> > >>> https://github.com/apache/tinkerpop/tree/TINKERPOP-1767 > >>> > >>> Note the change to TinkerGraph and its io() method. I suppose you > >>> could do something similar to get the right registry in play? could > >>> you have a look and see if what i did helps? if that works then i'll > >>> issue a PR and we can get it reviewed/merged. > >>> > >>> > >>> On Tue, Sep 5, 2017 at 12:10 PM, pieter gmail > >>> <pieter.mar...@gmail.com> > >>> wrote: > >>> > >>> Ok, at present there is only one SimpleModule, the default. I can > >>> make it > >>>> v2 or v3 but not both. > >>>> > >>>> Lets say I make the SimpleModule support V2. > >>>> Then when calling IoEdgeTest for > >>>> > >>>> {"graphson-v3", true, true, > >>>> (Function<Graph, GraphReader>) g -> g.io > >>>> (IoCore.graphson()).reader > >>>> ().mapper(g.io(GraphSONIo.build(GraphSONVersion.V3_0)). > >>>> mapper().create()).create(), > >>>> (Function<Graph, GraphWriter>) g -> g.io > >>>> (IoCore.graphson()).writer > >>>> ().mapper(g.io(GraphSONIo.build(GraphSONVersion.V3_0)). > >>>> mapper().create()).create()}, > >>>> > >>>> then the deserializers that run are for V2, > >>>> > >>>> static class SchemaTableIdJacksonDeserializerV2d0 extends > >>>> AbstractObjectDeserializer<SchemaTable> { > >>>> SchemaTableIdJacksonDeserializerV2d0() { > >>>> super(SchemaTable.class); > >>>> } > >>>> > >>>> @Override > >>>> public SchemaTable createObject(final Map data) { > >>>> return SchemaTable.of((String)data.get("schema"), > >>>> (String) data.get("table")); > >>>> } > >>>> } > >>>> > >>>> when createObject fires the map data has V3 elements in it like > >>>> @type and @value whilst its expecting "schema" and "table" > >>>> > >>>> If we make the SimpleModule support V3 then graphson-v2 will fail. > >>>> > >>>> {"graphson-v2", false, false, > >>>> (Function<Graph, GraphReader>) g -> g.io > >>>> (IoCore.graphson()).reader > >>>> ().mapper(g.io(GraphSONIo.build(GraphSONVersion.V2_0)). > >>>> mapper().typeInfo(TypeInfo.NO_TYPES).create()).create(), > >>>> (Function<Graph, GraphWriter>) g -> g.io > >>>> (IoCore.graphson()).writer > >>>> ().mapper(g.io(GraphSONIo.build(GraphSONVersion.V2_0)). > >>>> > >>>> mapper().typeInfo(TypeInfo.NO_TYPES).create()).create()}, > >>>> > >>>> Now the deserializers are for V3. > >>>> > >>>> static class SchemaTableJacksonDeserializerV3d0 extends > >>>> StdDeserializer<SchemaTable> { > >>>> public SchemaTableJacksonDeserializerV3d0() { > >>>> super(RecordId.class); > >>>> } > >>>> > >>>> @Override > >>>> public SchemaTable deserialize(final JsonParser > >>>> jsonParser, final DeserializationContext deserializationContext) > >>>> throws IOException, JsonProcessingException { > >>>> final Map<String, Object> data = > >>>> deserializationContext.readValue(jsonParser, > >>>> Map.class); > >>>> return SchemaTable.of((String)data.get("schema"), > >>>> (String) data.get("table")); > >>>> } > >>>> > >>>> @Override > >>>> public boolean isCachable() { > >>>> return true; > >>>> } > >>>> } > >>>> > >>>> This does not fire at all. Eventually I get a detached edge with an > >>>> id that is a map. It never deserialized. > >>>> > >>>> So basically it only works if the SimpleModule version, i.e. > >>>> serialize/deserialize code matches up with the version. > >>>> > >>>> Sqlg serializes RecordId to, > >>>> > >>>> static class RecordIdJacksonSerializerV3d0 extends > >>>> StdScalarSerializer<RecordId> { > >>>> public RecordIdJacksonSerializerV3d0() { > >>>> super(RecordId.class); > >>>> } > >>>> @Override > >>>> public void serialize(final RecordId recordId, final > >>>> JsonGenerator jsonGenerator, final SerializerProvider > >>>> serializerProvider) > >>>> throws IOException, JsonGenerationException { > >>>> final Map<String, Object> m = new HashMap<>(); > >>>> m.put("schemaTable", recordId.getSchemaTable()); > >>>> m.put("id", recordId.getId()); > >>>> jsonGenerator.writeObject(m); > >>>> } > >>>> } > >>>> > >>>> and > >>>> > >>>> static class SchemaTableJacksonSerializerV3d0 extends > >>>> StdScalarSerializer<SchemaTable> { > >>>> SchemaTableJacksonSerializerV3d0() { > >>>> super(SchemaTable.class); > >>>> } > >>>> > >>>> @Override > >>>> public void serialize(final SchemaTable schemaTable, final > >>>> JsonGenerator jsonGenerator, final SerializerProvider > >>>> serializerProvider) > >>>> throws IOException, JsonGenerationException { > >>>> // when types are not embedded, stringify or resort to > >>>> JSON primitive representations of the > >>>> // type so that non-jvm languages can better > >>>> interoperate with the TinkerPop stack. > >>>> final Map<String, Object> m = new LinkedHashMap<>(); > >>>> m.put("schema", schemaTable.getSchema()); > >>>> m.put("table", schemaTable.getTable()); > >>>> jsonGenerator.writeObject(m); > >>>> } > >>>> > >>>> } > >>>> > >>>> Hope it all makes some sense, > >>>> Pieter > >>>> > >>>> > >>>> On 05/09/2017 17:31, Stephen Mallette wrote: > >>>> > >>>> I guess I'm trying to understand why it matters for purpose of the > test. > >>>>> If > >>>>> you mix/match versions I can't think of why the test would care > >>>>> one way or the other. does sqlg serialize its id to a JSON Map? > >>>>> > >>>>> On Tue, Sep 5, 2017 at 11:19 AM, pieter gmail > >>>>> <pieter.mar...@gmail.com > >>>>> > > >>>>> wrote: > >>>>> > >>>>> I looked at TinkerGraph's implementation. In fact I copied it. > >>>>> TinkerGraph > >>>>> > >>>>>> does not have any special id serialization. In fact both its > >>>>>> TinkerIoRegistryV3d0 andTinkerIoRegistryV2d0 registry uses > >>>>>> TinkerModuleV2d0. > >>>>>> > >>>>>> > >>>>>> In IoCustomTest tests you call g.io(GraphSONIo.build(GraphSON > >>>>>> Version.V2_0)).mapper().addCustomModule(moduleV2d0). > >>>>>> I.e. the test manually registers the appropriate SimpleModule for > >>>>>> each version. > >>>>>> > >>>>>> For IoEdgeTest the same needs to happen somehow. Currently I have > >>>>>> only one default V3 SimpleModule same as TinkerGraph. I have > >>>>>> written a V2 SimpleModule but how in IoEdgeTest will the correct > >>>>>> IoRegistry or SimpleModule be selected? The test itself does not > >>>>>> call > >>>>>> addCustomModule() > >>>>>> and between the builders, mappers, registries and modules I don't > >>>>>> see how to add it. > >>>>>> > >>>>>> Thanks, > >>>>>> Pieter > >>>>>> > >>>>>> On 05/09/2017 16:30, Stephen Mallette wrote: > >>>>>> > >>>>>> You have registries for each version as well and default to v3. > >>>>>> Please > >>>>>> > >>>>>>> see > >>>>>>> TinkerGraph: > >>>>>>> > >>>>>>> https://github.com/apache/tinkerpop/blob/master/tinkergraph- > >>>>>>> gremlin/src/main/java/org/apache/tinkerpop/gremlin/ > >>>>>>> tinkergraph/structure/TinkerGraph.java#L198 > >>>>>>> > >>>>>>> If the user wants to override that then that's their choice, but > >>>>>>> they have to rig it all up. We probably need a better system > >>>>>>> than this. IO is way too complicated and confusing. > >>>>>>> > >>>>>>> On Tue, Sep 5, 2017 at 9:52 AM, pieter gmail < > >>>>>>> pieter.mar...@gmail.com> > >>>>>>> wrote: > >>>>>>> > >>>>>>> Afraid I still don't quite get it. How do I register the > >>>>>>> different > >>>>>>> > >>>>>>> SimpleModules depending on the version. > >>>>>>>> > >>>>>>>> Currently it starts in SqlgGraph, > >>>>>>>> > >>>>>>>> @Override > >>>>>>>> public <I extends Io> I io(final Io.Builder<I> builder) { > >>>>>>>> return (I) builder.graph(this).onMapper(mapper -> > >>>>>>>> mapper.addRegistry(SqlgIoRegistry.getInstance())).create(); > >>>>>>>> } > >>>>>>>> > >>>>>>>> and the SqlgIoRegistry registers the SimpleModule > >>>>>>>> > >>>>>>>> private SqlgIoRegistry() { > >>>>>>>> final SqlgSimpleModule sqlgSimpleModule = new > >>>>>>>> SqlgSimpleModule(); > >>>>>>>> register(GraphSONIo.class, null, sqlgSimpleModule); > >>>>>>>> register(GryoIo.class, RecordId.class, null); } > >>>>>>>> > >>>>>>>> > >>>>>>>> Is the SqlgGraph.io(...) method suppose to interrogate the > >>>>>>>> builder to check the version and add a corresponding IoRegistry > >>>>>>>> and SimpleModule? > >>>>>>>> > >>>>>>>> Thanks > >>>>>>>> Pieter > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> On 05/09/2017 13:30, Stephen Mallette wrote: > >>>>>>>> > >>>>>>>> I think you should just create a new SimpleModule for each > >>>>>>>> version - > >>>>>>>> > >>>>>>>> don't > >>>>>>>>> try to put them in the same SqlgSimpleModule. It's a naming > >>>>>>>>> convention that users will have to follow rather than > >>>>>>>>> something explicitly enforced through code. > >>>>>>>>> > >>>>>>>>> On Sun, Sep 3, 2017 at 3:20 PM, pieter gmail < > >>>>>>>>> pieter.mar...@gmail.com > >>>>>>>>> wrote: > >>>>>>>>> > >>>>>>>>> Hi, > >>>>>>>>> > >>>>>>>>> I am getting IO tests failures on 3.3.0. > >>>>>>>>> > >>>>>>>>>> Sqlg has a SimpleModule which add serializers for its custom id. > >>>>>>>>>> > >>>>>>>>>> SqlgSimpleModule() { > >>>>>>>>>> super("custom"); > >>>>>>>>>> // addSerializer(RecordId.class, new > >>>>>>>>>> RecordId.RecordIdJacksonSerial izerV2d0()); > >>>>>>>>>> // addDeserializer(RecordId.class, new > >>>>>>>>>> RecordId.RecordIdJacksonDeserializerV2d0()); > >>>>>>>>>> // addSerializer(SchemaTable.class, new > >>>>>>>>>> SchemaTable.SchemaTableIdJacksonSerializerV2d0()); > >>>>>>>>>> // addDeserializer(SchemaTable.class, new > >>>>>>>>>> SchemaTable.SchemaTableIdJacksonDeserializerV2d0()); > >>>>>>>>>> > >>>>>>>>>> addSerializer(RecordId.class, new > >>>>>>>>>> RecordId.RecordIdJacksonSerial izerV3d0()); > >>>>>>>>>> addDeserializer(RecordId.class, new > >>>>>>>>>> RecordId.RecordIdJacksonDeseri alizerV3d0()); > >>>>>>>>>> addSerializer(SchemaTable.class, new > >>>>>>>>>> SchemaTable.SchemaTableJacksonSerializerV3d0()); > >>>>>>>>>> addDeserializer(SchemaTable.class, new > >>>>>>>>>> SchemaTable.SchemaTableJacksonDeserializerV3d0()); > >>>>>>>>>> } > >>>>>>>>>> > >>>>>>>>>> How is it suppose to distinguish between v2 and v3? > >>>>>>>>>> > >>>>>>>>>> An example of a failure is 'IoEdgeTest.shouldReadWriteEdge' > >>>>>>>>>> > >>>>>>>>>> If ...V2d0.. is added to the serializers then 'graphson-v3' > fails. > >>>>>>>>>> If ...V3d0.. is added to the serializers then 'graphson-v2' > fails. > >>>>>>>>>> > >>>>>>>>>> TinkerPop's own CustomId tests do not rely on default > >>>>>>>>>> behavior and manually creates SimpleModules for each scenario. > >>>>>>>>>> > >>>>>>>>>> Are they both suppose to work somehow? > >>>>>>>>>> > >>>>>>>>>> Thanks > >>>>>>>>>> Pieter > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >> > > >