server/schemaserial.py
changeset 9956 19a683a0047c
parent 9891 3386fd89c914
child 9959 6047bf8df9e5
equal deleted inserted replaced
9955:60a9cd1b3a4b 9956:19a683a0047c
    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})