blob: 838110a1c095b5c9f6bd312cbd1cc7be2ec475be [file] [log] [blame]
# 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.
import json
from io import StringIO
TP_NONE = 0
TP_VERTEX = 1
TP_EDGE = 2
TP_PATH = 3
class Graph():
def __init__(self, stmt=None) -> None:
self.statement = stmt
self.rows = list()
self.vertices = dict()
def __iter__(self):
return self.rows.__iter__()
def __len__(self):
return self.rows.__len__()
def __getitem__(self,index):
return self.rows[index]
def size(self):
return self.rows.__len__()
def append(self, agObj):
self.rows.append(agObj)
def getVertices(self):
return self.vertices
def getVertex(self, id):
if id in self.vertices:
return self.vertices[id]
else:
return None
class AGObj:
@property
def gtype(self):
return TP_NONE
class Path(AGObj):
entities = []
def __init__(self, entities=None) -> None:
self.entities = entities
@property
def gtype(self):
return TP_PATH
def __iter__(self):
return self.entities.__iter__()
def __len__(self):
return self.entities.__len__()
def __getitem__(self,index):
return self.entities[index]
def size(self):
return self.entities.__len__()
def append(self, agObj:AGObj ):
self.entities.append(agObj)
def __str__(self) -> str:
return self.toString()
def __repr__(self) -> str:
return self.toString()
def toString(self) -> str:
buf = StringIO()
buf.write("[")
max = len(self.entities)
idx = 0
while idx < max:
if idx > 0:
buf.write(",")
self.entities[idx]._toString(buf)
idx += 1
buf.write("]::PATH")
return buf.getvalue()
def toJson(self) -> str:
buf = StringIO()
buf.write("{\"gtype\": \"path\", \"elements\": [")
max = len(self.entities)
idx = 0
while idx < max:
if idx > 0:
buf.write(",")
self.entities[idx]._toJson(buf)
idx += 1
buf.write("]}")
return buf.getvalue()
class Vertex(AGObj):
def __init__(self, id=None, label=None, properties=None) -> None:
self.id = id
self.label = label
self.properties = properties
@property
def gtype(self):
return TP_VERTEX
def __setitem__(self,name, value):
self.properties[name]=value
def __getitem__(self,name):
if name in self.properties:
return self.properties[name]
else:
return None
def __str__(self) -> str:
return self.toString()
def __repr__(self) -> str:
return self.toString()
def toString(self) -> str:
return nodeToString(self)
def _toString(self, buf):
_nodeToString(self, buf)
def toJson(self) -> str:
return nodeToJson(self)
def _toJson(self, buf):
_nodeToJson(self, buf)
class Edge(AGObj):
def __init__(self, id=None, label=None, properties=None) -> None:
self.id = id
self.label = label
self.start_id = None
self.end_id = None
self.properties = properties
@property
def gtype(self):
return TP_EDGE
def __setitem__(self,name, value):
self.properties[name]=value
def __getitem__(self,name):
if name in self.properties:
return self.properties[name]
else:
return None
def __str__(self) -> str:
return self.toString()
def __repr__(self) -> str:
return self.toString()
def extraStrFormat(node, buf):
if node.start_id != None:
buf.write(", start_id:")
buf.write(str(node.start_id))
if node.end_id != None:
buf.write(", end_id:")
buf.write(str(node.end_id))
def toString(self) -> str:
return nodeToString(self, Edge.extraStrFormat)
def _toString(self, buf):
_nodeToString(self, buf, Edge.extraStrFormat)
def extraJsonFormat(node, buf):
if node.start_id != None:
buf.write(", \"start_id\": \"")
buf.write(str(node.start_id))
buf.write("\"")
if node.end_id != None:
buf.write(", \"end_id\": \"")
buf.write(str(node.end_id))
buf.write("\"")
def toJson(self) -> str:
return nodeToJson(self, Edge.extraJsonFormat)
def _toJson(self, buf):
_nodeToJson(self, buf, Edge.extraJsonFormat)
def nodeToString(node, extraFormatter=None):
buf = StringIO()
_nodeToString(node,buf,extraFormatter=extraFormatter)
return buf.getvalue()
def _nodeToString(node, buf, extraFormatter=None):
buf.write("{")
if node.label != None:
buf.write("label:")
buf.write(node.label)
if node.id != None:
buf.write(", id:")
buf.write(str(node.id))
if node.properties != None:
buf.write(", properties:{")
for k,v in node.properties.items():
buf.write(k)
buf.write(": ")
buf.write(str(v))
buf.write(", ")
buf.write("}")
if extraFormatter != None:
extraFormatter(node, buf)
if node.gtype == TP_VERTEX:
buf.write("}::VERTEX")
if node.gtype == TP_EDGE:
buf.write("}::EDGE")
def nodeToJson(node, extraFormatter=None):
buf = StringIO()
_nodeToJson(node, buf, extraFormatter=extraFormatter)
return buf.getvalue()
def _nodeToJson(node, buf, extraFormatter=None):
buf.write("{\"gtype\": ")
if node.gtype == TP_VERTEX:
buf.write("\"vertex\", ")
if node.gtype == TP_EDGE:
buf.write("\"edge\", ")
if node.label != None:
buf.write("\"label\":\"")
buf.write(node.label)
buf.write("\"")
if node.id != None:
buf.write(", \"id\":")
buf.write(str(node.id))
if extraFormatter != None:
extraFormatter(node, buf)
if node.properties != None:
buf.write(", \"properties\":{")
for k,v in node.properties.items():
buf.write("\"")
buf.write(k)
buf.write("\": \"")
buf.write(str(v))
buf.write("\", ")
buf.write("}")
buf.write("}")