Spaces:
Runtime error
Runtime error
| # Copyright DataStax, Inc. | |
| # | |
| # Licensed 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. | |
| from collections import OrderedDict | |
| from gremlin_python.structure.io.graphsonV2d0 import ( | |
| GraphSONReader as GraphSONReaderV2, | |
| GraphSONUtil as GraphSONUtil, # no difference between v2 and v3 | |
| VertexDeserializer as VertexDeserializerV2, | |
| VertexPropertyDeserializer as VertexPropertyDeserializerV2, | |
| PropertyDeserializer as PropertyDeserializerV2, | |
| EdgeDeserializer as EdgeDeserializerV2, | |
| PathDeserializer as PathDeserializerV2 | |
| ) | |
| from gremlin_python.structure.io.graphsonV3d0 import ( | |
| GraphSONReader as GraphSONReaderV3, | |
| VertexDeserializer as VertexDeserializerV3, | |
| VertexPropertyDeserializer as VertexPropertyDeserializerV3, | |
| PropertyDeserializer as PropertyDeserializerV3, | |
| EdgeDeserializer as EdgeDeserializerV3, | |
| PathDeserializer as PathDeserializerV3 | |
| ) | |
| try: | |
| from gremlin_python.structure.io.graphsonV2d0 import ( | |
| TraversalMetricsDeserializer as TraversalMetricsDeserializerV2, | |
| MetricsDeserializer as MetricsDeserializerV2 | |
| ) | |
| from gremlin_python.structure.io.graphsonV3d0 import ( | |
| TraversalMetricsDeserializer as TraversalMetricsDeserializerV3, | |
| MetricsDeserializer as MetricsDeserializerV3 | |
| ) | |
| except ImportError: | |
| TraversalMetricsDeserializerV2 = MetricsDeserializerV2 = None | |
| TraversalMetricsDeserializerV3 = MetricsDeserializerV3 = None | |
| from cassandra.graph import ( | |
| GraphSON2Serializer, | |
| GraphSON2Deserializer, | |
| GraphSON3Serializer, | |
| GraphSON3Deserializer | |
| ) | |
| from cassandra.graph.graphson import UserTypeIO, TypeWrapperTypeIO | |
| from cassandra.datastax.graph.fluent.predicates import GeoP, TextDistanceP | |
| from cassandra.util import Distance | |
| __all__ = ['GremlinGraphSONReader', 'GeoPSerializer', 'TextDistancePSerializer', | |
| 'DistanceIO', 'gremlin_deserializers', 'deserializers', 'serializers', | |
| 'GremlinGraphSONReaderV2', 'GremlinGraphSONReaderV3', 'dse_graphson2_serializers', | |
| 'dse_graphson2_deserializers', 'dse_graphson3_serializers', 'dse_graphson3_deserializers', | |
| 'gremlin_graphson2_deserializers', 'gremlin_graphson3_deserializers', 'GremlinUserTypeIO'] | |
| class _GremlinGraphSONTypeSerializer(object): | |
| TYPE_KEY = "@type" | |
| VALUE_KEY = "@value" | |
| serializer = None | |
| def __init__(self, serializer): | |
| self.serializer = serializer | |
| def dictify(self, v, writer): | |
| value = self.serializer.serialize(v, writer) | |
| if self.serializer is TypeWrapperTypeIO: | |
| graphson_base_type = v.type_io.graphson_base_type | |
| graphson_type = v.type_io.graphson_type | |
| else: | |
| graphson_base_type = self.serializer.graphson_base_type | |
| graphson_type = self.serializer.graphson_type | |
| if graphson_base_type is None: | |
| out = value | |
| else: | |
| out = {self.TYPE_KEY: graphson_type} | |
| if value is not None: | |
| out[self.VALUE_KEY] = value | |
| return out | |
| def definition(self, value, writer=None): | |
| return self.serializer.definition(value, writer) | |
| def get_specialized_serializer(self, value): | |
| ser = self.serializer.get_specialized_serializer(value) | |
| if ser is not self.serializer: | |
| return _GremlinGraphSONTypeSerializer(ser) | |
| return self | |
| class _GremlinGraphSONTypeDeserializer(object): | |
| deserializer = None | |
| def __init__(self, deserializer): | |
| self.deserializer = deserializer | |
| def objectify(self, v, reader): | |
| return self.deserializer.deserialize(v, reader) | |
| def _make_gremlin_graphson2_deserializer(graphson_type): | |
| return _GremlinGraphSONTypeDeserializer( | |
| GraphSON2Deserializer.get_deserializer(graphson_type.graphson_type) | |
| ) | |
| def _make_gremlin_graphson3_deserializer(graphson_type): | |
| return _GremlinGraphSONTypeDeserializer( | |
| GraphSON3Deserializer.get_deserializer(graphson_type.graphson_type) | |
| ) | |
| class _GremlinGraphSONReader(object): | |
| """Gremlin GraphSONReader Adapter, required to use gremlin types""" | |
| context = None | |
| def __init__(self, context, deserializer_map=None): | |
| self.context = context | |
| super(_GremlinGraphSONReader, self).__init__(deserializer_map) | |
| def deserialize(self, obj): | |
| return self.toObject(obj) | |
| class GremlinGraphSONReaderV2(_GremlinGraphSONReader, GraphSONReaderV2): | |
| pass | |
| # TODO remove next major | |
| GremlinGraphSONReader = GremlinGraphSONReaderV2 | |
| class GremlinGraphSONReaderV3(_GremlinGraphSONReader, GraphSONReaderV3): | |
| pass | |
| class GeoPSerializer(object): | |
| def dictify(cls, p, writer): | |
| out = { | |
| "predicateType": "Geo", | |
| "predicate": p.operator, | |
| "value": [writer.toDict(p.value), writer.toDict(p.other)] if p.other is not None else writer.toDict(p.value) | |
| } | |
| return GraphSONUtil.typedValue("P", out, prefix='dse') | |
| class TextDistancePSerializer(object): | |
| def dictify(cls, p, writer): | |
| out = { | |
| "predicate": p.operator, | |
| "value": { | |
| 'query': writer.toDict(p.value), | |
| 'distance': writer.toDict(p.distance) | |
| } | |
| } | |
| return GraphSONUtil.typedValue("P", out) | |
| class DistanceIO(object): | |
| def dictify(cls, v, _): | |
| return GraphSONUtil.typedValue('Distance', str(v), prefix='dse') | |
| GremlinUserTypeIO = _GremlinGraphSONTypeSerializer(UserTypeIO) | |
| # GraphSON2 | |
| dse_graphson2_serializers = OrderedDict([ | |
| (t, _GremlinGraphSONTypeSerializer(s)) | |
| for t, s in GraphSON2Serializer.get_type_definitions().items() | |
| ]) | |
| dse_graphson2_serializers.update(OrderedDict([ | |
| (Distance, DistanceIO), | |
| (GeoP, GeoPSerializer), | |
| (TextDistanceP, TextDistancePSerializer) | |
| ])) | |
| # TODO remove next major, this is just in case someone was using it | |
| serializers = dse_graphson2_serializers | |
| dse_graphson2_deserializers = { | |
| k: _make_gremlin_graphson2_deserializer(v) | |
| for k, v in GraphSON2Deserializer.get_type_definitions().items() | |
| } | |
| dse_graphson2_deserializers.update({ | |
| "dse:Distance": DistanceIO, | |
| }) | |
| # TODO remove next major, this is just in case someone was using it | |
| deserializers = dse_graphson2_deserializers | |
| gremlin_graphson2_deserializers = dse_graphson2_deserializers.copy() | |
| gremlin_graphson2_deserializers.update({ | |
| 'g:Vertex': VertexDeserializerV2, | |
| 'g:VertexProperty': VertexPropertyDeserializerV2, | |
| 'g:Edge': EdgeDeserializerV2, | |
| 'g:Property': PropertyDeserializerV2, | |
| 'g:Path': PathDeserializerV2 | |
| }) | |
| if TraversalMetricsDeserializerV2: | |
| gremlin_graphson2_deserializers.update({ | |
| 'g:TraversalMetrics': TraversalMetricsDeserializerV2, | |
| 'g:lMetrics': MetricsDeserializerV2 | |
| }) | |
| # TODO remove next major, this is just in case someone was using it | |
| gremlin_deserializers = gremlin_graphson2_deserializers | |
| # GraphSON3 | |
| dse_graphson3_serializers = OrderedDict([ | |
| (t, _GremlinGraphSONTypeSerializer(s)) | |
| for t, s in GraphSON3Serializer.get_type_definitions().items() | |
| ]) | |
| dse_graphson3_serializers.update(OrderedDict([ | |
| (Distance, DistanceIO), | |
| (GeoP, GeoPSerializer), | |
| (TextDistanceP, TextDistancePSerializer) | |
| ])) | |
| dse_graphson3_deserializers = { | |
| k: _make_gremlin_graphson3_deserializer(v) | |
| for k, v in GraphSON3Deserializer.get_type_definitions().items() | |
| } | |
| dse_graphson3_deserializers.update({ | |
| "dse:Distance": DistanceIO | |
| }) | |
| gremlin_graphson3_deserializers = dse_graphson3_deserializers.copy() | |
| gremlin_graphson3_deserializers.update({ | |
| 'g:Vertex': VertexDeserializerV3, | |
| 'g:VertexProperty': VertexPropertyDeserializerV3, | |
| 'g:Edge': EdgeDeserializerV3, | |
| 'g:Property': PropertyDeserializerV3, | |
| 'g:Path': PathDeserializerV3 | |
| }) | |
| if TraversalMetricsDeserializerV3: | |
| gremlin_graphson3_deserializers.update({ | |
| 'g:TraversalMetrics': TraversalMetricsDeserializerV3, | |
| 'g:Metrics': MetricsDeserializerV3 | |
| }) | |