85 """return a schema according to information stored in an rql database |
85 """return a schema according to information stored in an rql database |
86 as CWRType and CWEType entities |
86 as CWRType and CWEType entities |
87 """ |
87 """ |
88 repo = cnx.repo |
88 repo = cnx.repo |
89 dbhelper = repo.system_source.dbhelper |
89 dbhelper = repo.system_source.dbhelper |
|
90 |
|
91 # Computed Rtype |
|
92 with cnx.ensure_cnx_set: |
|
93 tables = set(dbhelper.list_tables(cnx.cnxset.cu)) |
|
94 has_computed_relations = 'cw_CWComputedRType' in tables |
|
95 if has_computed_relations: |
|
96 rset = cnx.execute( |
|
97 'Any X, N, R, D WHERE X is CWComputedRType, X name N, ' |
|
98 'X rule R, X description D') |
|
99 for eid, rule_name, rule, description in rset.rows: |
|
100 rtype = ybo.ComputedRelation(name=rule_name, rule=rule, eid=eid, |
|
101 description=description) |
|
102 schema.add_relation_type(rtype) |
|
103 |
90 # XXX bw compat (3.6 migration) |
104 # XXX bw compat (3.6 migration) |
91 with cnx.ensure_cnx_set: |
105 with cnx.ensure_cnx_set: |
92 sqlcu = cnx.system_sql("SELECT * FROM cw_CWRType WHERE cw_name='symetric'") |
106 sqlcu = cnx.system_sql("SELECT * FROM cw_CWRType WHERE cw_name='symetric'") |
93 if sqlcu.fetchall(): |
107 if sqlcu.fetchall(): |
94 sql = dbhelper.sql_rename_col('cw_CWRType', 'cw_symetric', 'cw_symmetric', |
108 sql = dbhelper.sql_rename_col('cw_CWRType', 'cw_symetric', 'cw_symmetric', |
250 relations[1].append(rtype) |
264 relations[1].append(rtype) |
251 for eschema, unique_together in unique_togethers.itervalues(): |
265 for eschema, unique_together in unique_togethers.itervalues(): |
252 eschema._unique_together.append(tuple(sorted(unique_together))) |
266 eschema._unique_together.append(tuple(sorted(unique_together))) |
253 schema.infer_specialization_rules() |
267 schema.infer_specialization_rules() |
254 cnx.commit() |
268 cnx.commit() |
|
269 schema.finalize() |
255 schema.reading_from_database = False |
270 schema.reading_from_database = False |
256 |
271 |
257 |
272 |
258 def deserialize_ertype_permissions(cnx): |
273 def deserialize_ertype_permissions(cnx): |
259 """return sect action:groups associations for the given |
274 """return sect action:groups associations for the given |
339 # skip virtual relations such as eid, has_text and identity |
354 # skip virtual relations such as eid, has_text and identity |
340 if rschema in VIRTUAL_RTYPES: |
355 if rschema in VIRTUAL_RTYPES: |
341 if pb is not None: |
356 if pb is not None: |
342 pb.update() |
357 pb.update() |
343 continue |
358 continue |
|
359 if rschema.rule: |
|
360 execschemarql(execute, rschema, crschema2rql(rschema)) |
|
361 continue |
344 execschemarql(execute, rschema, rschema2rql(rschema, addrdef=False)) |
362 execschemarql(execute, rschema, rschema2rql(rschema, addrdef=False)) |
345 if rschema.symmetric: |
363 if rschema.symmetric: |
346 rdefs = [rdef for k, rdef in rschema.rdefs.iteritems() |
364 rdefs = [rdef for k, rdef in rschema.rdefs.iteritems() |
347 if (rdef.subject, rdef.object) == k] |
365 if (rdef.subject, rdef.object) == k] |
348 else: |
366 else: |
454 } |
472 } |
455 |
473 |
456 # rtype serialization |
474 # rtype serialization |
457 |
475 |
458 def rschema2rql(rschema, cstrtypemap=None, addrdef=True, groupmap=None): |
476 def rschema2rql(rschema, cstrtypemap=None, addrdef=True, groupmap=None): |
459 """return a list of rql insert statements to enter a relation schema |
477 """generate rql insert statements to enter a relation schema |
460 in the database as an CWRType entity |
478 in the database as an CWRType entity |
461 """ |
479 """ |
462 if rschema.type == 'has_text': |
480 if rschema.type == 'has_text': |
463 return |
481 return |
464 relations, values = rschema_relations_values(rschema) |
482 relations, values = rschema_relations_values(rschema) |
481 else: |
499 else: |
482 values['fulltext_container'] = rschema.fulltext_container |
500 values['fulltext_container'] = rschema.fulltext_container |
483 relations = ['X %s %%(%s)s' % (attr, attr) for attr in sorted(values)] |
501 relations = ['X %s %%(%s)s' % (attr, attr) for attr in sorted(values)] |
484 return relations, values |
502 return relations, values |
485 |
503 |
|
504 def crschema2rql(crschema): |
|
505 relations, values = crschema_relations_values(crschema) |
|
506 yield 'INSERT CWComputedRType X: %s' % ','.join(relations), values |
|
507 |
|
508 def crschema_relations_values(crschema): |
|
509 values = _ervalues(crschema) |
|
510 values['rule'] = crschema.rule |
|
511 # XXX why oh why? |
|
512 del values['final'] |
|
513 relations = ['X %s %%(%s)s' % (attr, attr) for attr in sorted(values)] |
|
514 return relations, values |
|
515 |
486 # rdef serialization |
516 # rdef serialization |
487 |
517 |
488 def rdef2rql(rdef, cstrtypemap, groupmap=None): |
518 def rdef2rql(rdef, cstrtypemap, groupmap=None): |
489 # don't serialize infered relations |
519 # don't serialize inferred relations |
490 if rdef.infered: |
520 if rdef.infered: |
491 return |
521 return |
492 relations, values = _rdef_values(rdef) |
522 relations, values = _rdef_values(rdef) |
493 relations.append('X relation_type ER,X from_entity SE,X to_entity OE') |
523 relations.append('X relation_type ER,X from_entity SE,X to_entity OE') |
494 values.update({'se': rdef.subject.eid, 'rt': rdef.rtype.eid, 'oe': rdef.object.eid}) |
524 values.update({'se': rdef.subject.eid, 'rt': rdef.rtype.eid, 'oe': rdef.object.eid}) |