| /* |
| * Copyright 2017 HugeGraph Authors |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with this |
| * work for additional information regarding copyright ownership. The ASF |
| * licenses this file to You under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package com.baidu.hugegraph.structure; |
| |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.concurrent.ConcurrentHashMap; |
| |
| import org.eclipse.jetty.util.ConcurrentHashSet; |
| |
| import com.baidu.hugegraph.structure.graph.Edge; |
| import com.baidu.hugegraph.structure.graph.Vertex; |
| import com.baidu.hugegraph.util.JsonUtil; |
| import com.fasterxml.jackson.annotation.JsonRawValue; |
| |
| public class JsonGraph { |
| |
| private static final int INIT_VERTEX_CAPACITY = 1_000_000; |
| |
| private Map<String, Map<Object, JsonVertex>> tables; |
| |
| public JsonGraph() { |
| this.tables = new ConcurrentHashMap<>(); |
| } |
| |
| public Set<String> tables() { |
| return this.tables.keySet(); |
| } |
| |
| public void put(Vertex vertex) { |
| // Add vertex to table of `label` |
| Map<Object, JsonVertex> vertices = this.table(vertex.label()); |
| vertices.put(vertex.id(), JsonVertex.from(vertex)); |
| } |
| |
| public void put(Edge edge) { |
| // Find source vertex |
| Map<Object, JsonVertex> vertices = this.table(edge.sourceLabel()); |
| assert vertices != null; |
| JsonVertex source = vertices.get(edge.sourceId()); |
| if (source == null) { |
| // Printer.print("Invalid edge without source vertex: %s", edge); |
| return; |
| } |
| |
| // Find target vertex |
| vertices = this.table(edge.targetLabel()); |
| assert vertices != null; |
| JsonVertex target = vertices.get(edge.targetId()); |
| if (target == null) { |
| // Printer.print("Invalid edge without target vertex: %s", edge); |
| return; |
| } |
| |
| // Add edge to source&target vertex |
| JsonEdge jsonEdge = JsonEdge.from(edge); |
| source.addEdge(jsonEdge); |
| target.addEdge(jsonEdge); |
| } |
| |
| public Map<Object, JsonVertex> table(String table) { |
| Map<Object, JsonVertex> vertices = this.tables.get(table); |
| if (vertices == null) { |
| vertices = new ConcurrentHashMap<>(INIT_VERTEX_CAPACITY); |
| this.tables.putIfAbsent(table, vertices); |
| } |
| return this.tables.get(table); |
| } |
| |
| public static class JsonVertex { |
| |
| private Object id; |
| private String label; |
| private String properties; |
| private Set<JsonEdge> edges; |
| |
| public JsonVertex() { |
| this.edges = new ConcurrentHashSet<>(); |
| } |
| |
| public void addEdge(JsonEdge edge) { |
| this.edges.add(edge); |
| } |
| |
| public Object getId() { |
| return this.id; |
| } |
| |
| public String getLabel() { |
| return this.label; |
| } |
| |
| @JsonRawValue |
| public String getProperties() { |
| return this.properties; |
| } |
| |
| public Set<JsonEdge> getEdges() { |
| return this.edges; |
| } |
| |
| @SuppressWarnings("unchecked") |
| public Map<String, Object> properties() { |
| return JsonUtil.fromJson(this.properties, Map.class); |
| } |
| |
| public static JsonVertex from(Vertex v) { |
| JsonVertex vertex = new JsonVertex(); |
| vertex.id = v.id(); |
| vertex.label = v.label(); |
| vertex.properties = JsonUtil.toJson(v.properties()); |
| return vertex; |
| } |
| } |
| |
| public static class JsonEdge { |
| |
| private String id; |
| private String label; |
| private Object source; |
| private Object target; |
| private String properties; |
| |
| public String getId() { |
| return this.id; |
| } |
| |
| public String getLabel() { |
| return this.label; |
| } |
| |
| public Object getSource() { |
| return this.source; |
| } |
| |
| public Object getTarget() { |
| return this.target; |
| } |
| |
| @JsonRawValue |
| public String getProperties() { |
| return this.properties; |
| } |
| |
| @SuppressWarnings("unchecked") |
| public Map<String, Object> properties() { |
| return JsonUtil.fromJson(this.properties, Map.class); |
| } |
| |
| public static JsonEdge from(Edge e) { |
| JsonEdge edge = new JsonEdge(); |
| edge.id = e.id(); |
| edge.label = e.label(); |
| edge.source = e.sourceId(); |
| edge.target = e.targetId(); |
| edge.properties = JsonUtil.toJson(e.properties()); |
| return edge; |
| } |
| } |
| } |