blob: 2aaa58fd78e3746d1936288dd95390917f5d4366 [file] [log] [blame]
/*
* 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;
}
}
}