server/sources/rql2sql.py
changeset 10669 155c29e0ed1c
parent 10663 54b8a1f249fb
child 10677 59ec0aaae08b
equal deleted inserted replaced
10668:4fb62d791073 10669:155c29e0ed1c
  1475 
  1475 
  1476     def visit_function(self, func):
  1476     def visit_function(self, func):
  1477         """generate SQL name for a function"""
  1477         """generate SQL name for a function"""
  1478         if func.name == 'FTIRANK':
  1478         if func.name == 'FTIRANK':
  1479             try:
  1479             try:
  1480                 rel = iter(func.children[0].variable.stinfo['ftirels']).next()
  1480                 rel = next(iter(func.children[0].variable.stinfo['ftirels']))
  1481             except KeyError:
  1481             except KeyError:
  1482                 raise BadRQLQuery("can't use FTIRANK on variable not used in an"
  1482                 raise BadRQLQuery("can't use FTIRANK on variable not used in an"
  1483                                   " 'has_text' relation (eg full-text search)")
  1483                                   " 'has_text' relation (eg full-text search)")
  1484             const = rel.get_parts()[1].children[0]
  1484             const = rel.get_parts()[1].children[0]
  1485             return self.dbhelper.fti_rank_order(
  1485             return self.dbhelper.fti_rank_order(
  1561                 sql = '%s.eid' % vtablename
  1561                 sql = '%s.eid' % vtablename
  1562                 if variable.stinfo['typerel'] is not None:
  1562                 if variable.stinfo['typerel'] is not None:
  1563                     # add additional restriction on entities.type column
  1563                     # add additional restriction on entities.type column
  1564                     pts = variable.stinfo['possibletypes']
  1564                     pts = variable.stinfo['possibletypes']
  1565                     if len(pts) == 1:
  1565                     if len(pts) == 1:
  1566                         etype = iter(variable.stinfo['possibletypes']).next()
  1566                         etype = next(iter(variable.stinfo['possibletypes']))
  1567                         restr = "%s.type='%s'" % (vtablename, etype)
  1567                         restr = "%s.type='%s'" % (vtablename, etype)
  1568                     else:
  1568                     else:
  1569                         etypes = ','.join("'%s'" % et for et in pts)
  1569                         etypes = ','.join("'%s'" % et for et in pts)
  1570                         restr = '%s.type IN (%s)' % (vtablename, etypes)
  1570                         restr = '%s.type IN (%s)' % (vtablename, etypes)
  1571                     self._state.add_restriction(restr)
  1571                     self._state.add_restriction(restr)
  1668             try:
  1668             try:
  1669                 return self._varmap[variable.name]
  1669                 return self._varmap[variable.name]
  1670             except KeyError:
  1670             except KeyError:
  1671                 pass
  1671                 pass
  1672         rel = (variable.stinfo.get('principal') or
  1672         rel = (variable.stinfo.get('principal') or
  1673                iter(variable.stinfo['rhsrelations']).next())
  1673                next(iter(variable.stinfo['rhsrelations'])))
  1674         linkedvar = rel.children[0].variable
  1674         linkedvar = rel.children[0].variable
  1675         if rel.r_type == 'eid':
  1675         if rel.r_type == 'eid':
  1676             return linkedvar.accept(self)
  1676             return linkedvar.accept(self)
  1677         if isinstance(linkedvar, ColumnAlias):
  1677         if isinstance(linkedvar, ColumnAlias):
  1678             raise BadRQLQuery('variable %s should be selected by the subquery'
  1678             raise BadRQLQuery('variable %s should be selected by the subquery'