X-Git-Url: http://nitlanguage.org diff --git a/lib/neo4j/graph/json_graph_store.nit b/lib/neo4j/graph/json_graph_store.nit index 20736ad..618a1d3 100644 --- a/lib/neo4j/graph/json_graph_store.nit +++ b/lib/neo4j/graph/json_graph_store.nit @@ -20,14 +20,14 @@ import graph # # * `"nodes"`: An array with all nodes. Each node is an object with the # following properties: -# * `"labels"`: An array of all applied labels. -# * `"properties"`: An object mapping each defined property to its value. +# * `"labels"`: An array of all applied labels. +# * `"properties"`: An object mapping each defined property to its value. # * `"edges"`: An array with all relationships. Each relationship is an object # with the following properties: -# * `"type"`: The type (`String`) of the relationship. -# * `"properties"`: An object mapping each defined property to its value. -# * `"from"`: The local ID of the source node. -# * `"to"`: The local ID of the destination node. +# * `"type"`: The type (`String`) of the relationship. +# * `"properties"`: An object mapping each defined property to its value. +# * `"from"`: The local ID of the source node. +# * `"to"`: The local ID of the destination node. # # ~~~nit # import neo4j::graph::sequential_id @@ -37,14 +37,14 @@ import graph # a.labels.add "Foo" # a["answer"] = 42 # a["Ultimate question of"] = new JsonArray.from(["life", -# "the Universe", "and Everything."]) +# "the Universe", "and Everything."]) # graph.nodes.register a # var b = graph.create_node # b.labels.add "Foo" # b.labels.add "Bar" # graph.edges.add new NeoEdge(a, "BAZ", b) # -# var ostream = new StringOStream +# var ostream = new StringWriter # var store = new JsonGraphStore(graph) # store.ostream = ostream # store.save @@ -57,15 +57,15 @@ import graph # # graph.nodes.clear # graph.edges.clear -# store.istream = new StringIStream(ostream.to_s) +# store.istream = new StringReader(ostream.to_s) # store.load # assert 1 == graph.edges.length # for edge in graph.edges do -# assert "BAZ" == edge.rel_type -# assert a.labels == edge.from.labels -# for k, v in a.properties do assert v == edge.from.properties[k] -# assert b.labels == edge.to.labels -# for k, v in b.properties do assert v == edge.to.properties[k] +# assert "BAZ" == edge.rel_type +# assert a.labels == edge.from.labels +# for k, v in a.properties do assert v == edge.from.properties[k] +# assert b.labels == edge.to.labels +# for k, v in b.properties do assert v == edge.to.properties[k] # end # assert 2 == graph.nodes.length # ~~~ @@ -73,13 +73,13 @@ class JsonGraphStore super GraphStore # The stream to use for `load`. - var istream: nullable IStream = null is writable + var istream: nullable Reader = null is writable # The stream to use for `save` and `save_part`. - var ostream: nullable OStream = null is writable + var ostream: nullable Writer = null is writable - # Use the specified `IOStream`. - init from_io(graph: NeoGraph, iostream: IOStream) do + # Use the specified `Duplex`. + init from_io(graph: NeoGraph, iostream: Duplex) do init(graph) istream = iostream ostream = iostream @@ -88,14 +88,14 @@ class JsonGraphStore # Use the specified string to load the graph. init from_string(graph: NeoGraph, string: String) do init(graph) - istream = new StringIStream(string) + istream = new StringReader(string) end redef fun isolated_save do return true redef fun load do var istream = self.istream - assert istream isa IStream + assert istream isa Reader fire_started graph.load_json(istream.read_all) fire_done @@ -103,7 +103,7 @@ class JsonGraphStore redef fun save_part(nodes, edges) do var ostream = self.ostream - assert ostream isa OStream + assert ostream isa Writer fire_started ostream.write(graph.to_json) fire_done @@ -125,7 +125,7 @@ redef class NeoGraph # a.labels.add "Foo" # a["answer"] = 42 # a["Ultimate question of"] = new JsonArray.from(["life", - # "the Universe", "and Everything."]) + # "the Universe", "and Everything."]) # graph.nodes.register a # var b = graph.create_node # b.labels.add "Foo" @@ -133,14 +133,14 @@ redef class NeoGraph # graph.edges.add new NeoEdge(a, "BAZ", b) # # graph = new NeoGraph.from_json( - # new SequentialNodeCollection("node_id"), graph.to_json) + # new SequentialNodeCollection("node_id"), graph.to_json) # assert 1 == graph.edges.length # for edge in graph.edges do - # assert "BAZ" == edge.rel_type - # assert a.labels == edge.from.labels - # for k, v in a.properties do assert v == edge.from.properties[k] - # assert b.labels == edge.to.labels - # for k, v in b.properties do assert v == edge.to.properties[k] + # assert "BAZ" == edge.rel_type + # assert a.labels == edge.from.labels + # for k, v in a.properties do assert v == edge.from.properties[k] + # assert b.labels == edge.to.labels + # for k, v in b.properties do assert v == edge.to.properties[k] # end # assert 2 == graph.nodes.length # ~~~ @@ -168,6 +168,8 @@ redef class NeoGraph # For the expected format, see `JsonGraphStore`. fun load_json_object(o: JsonObject) do var json_nodes = o["nodes"].as(JsonArray) + var nodes = self.nodes + nodes.enlarge(nodes.length) for json_node in json_nodes do assert json_node isa JsonObject var node = new NeoNode.from_json_object(json_node) @@ -175,6 +177,8 @@ redef class NeoGraph end var json_edges = o["edges"].as(JsonArray) + var edges = self.edges + if edges isa AbstractArray[NeoEdge] then edges.enlarge(edges.length) for json_edge in json_edges do assert json_edge isa JsonObject var from = nodes[nodes.id_from_jsonable(json_edge["from"])] @@ -182,7 +186,7 @@ redef class NeoGraph var rel_type = json_edge["type"].as(String) var json_properties = json_edge["properties"].as(JsonObject) var edge = new NeoEdge(from, rel_type, to) - edge.properties.recover_with(json_properties) + edge.properties.add_all(json_properties) edges.add edge end end @@ -244,10 +248,10 @@ redef class NeoNode # # var node = new NeoNode.from_json(""" # { - # "labels": ["foo", "Bar"], - # "properties": { - # "baz": 42 - # } + # "labels": ["foo", "Bar"], + # "properties": { + # "baz": 42 + # } # } # """) # assert ["foo", "Bar"] == node.labels @@ -266,7 +270,7 @@ redef class NeoNode var labels = o["labels"].as(JsonArray) for lab in labels do self.labels.add(lab.as(String)) var json_properties = o["properties"].as(JsonObject) - properties.recover_with(json_properties) + properties.add_all(json_properties) end redef fun to_json do return to_json_by_append @@ -293,7 +297,7 @@ redef class NeoNode redef fun to_s do return to_json # Append the JSON representation of the node to the specified buffer. - redef fun append_json_for(graph: NeoGraph, buffer: Buffer) do + redef fun append_json_for(graph, buffer) do append_json(buffer) end end @@ -303,9 +307,9 @@ redef class NeoEdge # Append the JSON representation of the relationship to the specified buffer. # # Use the IDs specfied by `graph.nodes`. - redef fun append_json_for(graph: NeoGraph, buffer: Buffer) do + redef fun append_json_for(graph, buffer) do buffer.append "\{\"type\":" - rel_type.append_json(buffer) + rel_type.as(not null).append_json(buffer) buffer.append ",\"properties\":" properties.append_json(buffer) buffer.append ",\"from\":"