Issues (15)

1
import collections
2
import datetime
3
import logging
4
5
from goblin import properties
6
7
logger = logging.getLogger(__name__)
8
9
10
CARD_MAPPING = {'Cardinality.single': 'Cardinality.SINGLE',
11
                'Cardinality.list_':'Cardinality.LIST',
12
                'Cardinality.set_': 'Cardinality.SET'}
13
14
15
DATA_TYPE_MAPPING = {properties.Integer: 'Integer.class',
16
                     properties.Float: 'Float.class',
17
                     properties.String: 'String.class',
18
                     properties.Boolean: 'Boolean.class'}
19
20
21
prop_keys = {}
22
23
24
PropertyKey = collections.namedtuple('PropertyKey', ['name', 'data_type', 'card'])
25
26
27
async def create_schema(app, indices, cluster):
28
    client = await cluster.connect()
29
    schema_definition = get_schema(app, indices)
30
    start_time = datetime.datetime.now()
31
    logger.info("Processing schema....")
32
    resp = await client.submit(schema_definition)
33
    await resp.all()
34
    logger.info("Processed schema in {}".format(datetime.datetime.now() - start_time))
35
36
37
def get_schema(app, indices=None):
38
    if not indices:
39
        indices = []
40
    schema_definition = """graph.tx().rollback()
41
                           mgmt = graph.openManagement()\n"""
42
    for label, vertex in app.vertices.items():
43
        schema_definition += get_vertex_schema(label, vertex)
44
    schema_definition += "// Edge schema\n"
45
    for label, edge in app.edges.items():
46
        schema_definition += get_edge_schema(label, edge)
47
    # Need to register vertex props with app TODO Fix in Goblin
48
49
    schema_definition += get_indices_schema(indices)
50
    schema_definition += "mgmt.commit()"
51
    return schema_definition
52
53
54
def get_vertex_schema(label, vertex):
55
    vertex_schema = "// Schema for vertex label: {}\n".format(label)
56
    vertex_schema += "{} = mgmt.makeVertexLabel('{}').make()\n".format(label, label)
57
    mapping = vertex.__mapping__
58
    properties = vertex.__properties__
59
    for db_name, (ogm_name, _) in mapping.db_properties.items():
60
        prop = properties[ogm_name]
61
62
        # Get cardinality
63
        if hasattr(prop, 'cardinality'):
64
            card = str(prop.cardinality)
65
        else:
66
            card = 'Cardinality.single'
67
        mapped_card = CARD_MAPPING[card]
68
69
        # Get data type
70
        data_type = prop.data_type
71
        mapped_data_type = DATA_TYPE_MAPPING[data_type.__class__]
72
        prop_key = PropertyKey(db_name, mapped_data_type, mapped_card)
73
        if db_name in prop_keys:
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable prop_keys does not seem to be defined.
Loading history...
74
            assert prop_key == prop_keys[db_name]
75
        else:
76
            prop_keys[db_name] = prop_key
77
        prop_key_string = "{} = mgmt.makePropertyKey('{}').dataType({}).cardinality({}).make()\n".format(
78
            prop_key.name, prop_key.name, prop_key.data_type, prop_key.card)
79
        vertex_schema += prop_key_string
80
    vertex_schema += "\n"
81
    return vertex_schema
82
83
84
def get_indices_schema(indices):
85
    indices_schema = "// Indices ...\n"
86
    for index in indices:
87
        indices_schema += "mgmt.buildIndex('by_{}', Vertex.class).addKey({}).buildCompositeIndex()\n".format(index, index)
88
    return indices_schema
89
90
91
def get_edge_schema(label, edge):
92
    edge_schema = "{} = mgmt.makeEdgeLabel('{}').multiplicity(SIMPLE).make()\n".format(label, label)
93
    #TODO edge prop keys
94
    return edge_schema
95