예제 #1
0
    def get_pattern_for(self, node):
        """
        Get the SQL pattern of the query, as tuple (pattern, values)
        """
        if isinstance(node, config.orm.node_class):
            if node.negated:
                node.negated = False
                pattern, values = self.get_pattern_for(node)
                node.negated = True
                pattern = "NOT (%s)" % pattern
                return pattern, values

            patterns = []
            values = []
            for child in node.children:
                pattern, vals = self.get_pattern_for(child)
                values.extend(list(vals))
                patterns.append(pattern)

            connector = ') %s (' % node.connector

            pattern = '(' + connector.join(patterns) + ')'
            return pattern, values

        query, value = node
        if "__" in query:
            field, method = query.split("__", 1)
        else:
            field = query
            method = "default"

        field = fieldmap.get_field(field)
        method = getattr(field, "get_" + method)
        return method(value)
예제 #2
0
파일: query.py 프로젝트: LBdN/sesql
    def _get_smart_query(self):
        """
        Get the template for performing smart queries
        """
        table = self.get_table_name()
        pattern, values = self.get_pattern()
        o_pattern, o_values = self.get_order()

        classes = self.get_classes()
        l_pattern, l_values = fieldmap.get_field("classname").get_in(classes)
        l_order, _ = self.get_order(limit = 1)

        cursor = config.orm.cursor()

        #
        # We need to do some query optimization, since postgresql will not
        # handle well the cases of many matches
        #

        smartquery = """SELECT %s
FROM  (SELECT * FROM %s WHERE %s ORDER BY %s LIMIT {SESQL_SMART_LIMIT}) subquery
WHERE %s ORDER BY %s LIMIT {SESQL_THE_LIMIT}""" % (', '.join(self.fields),
                                                   table, l_pattern, l_order,
                                                   pattern, o_pattern)
        return smartquery, l_values + values + o_values
예제 #3
0
파일: query.py 프로젝트: LBdN/sesql
    def get_pattern_for(self, node):
        """
        Get the SQL pattern of the query, as tuple (pattern, values)
        """
        if isinstance(node, config.orm.node_class):
            if node.negated:
                node.negated = False
                pattern, values = self.get_pattern_for(node)
                node.negated = True
                pattern = "NOT (%s)" % pattern
                return pattern, values

            patterns = []
            values = []
            for child in node.children:
                pattern, vals = self.get_pattern_for(child)
                values.extend(list(vals))
                patterns.append(pattern)

            connector = ') %s (' % node.connector

            pattern = '(' + connector.join(patterns) + ')'
            return pattern, values

        query, value = node
        if "__" in query:
            field, method = query.split("__", 1)
        else:
            field = query
            method = "default"

        field = fieldmap.get_field(field)
        method = getattr(field, "get_" + method)
        return method(value)
예제 #4
0
def lemmatize(words, index=None):
    """
    Give a lemmatized version of those words

    Use the configuration for the given index, or the default one if
    index is None
    """
    if index is None:
        index = fieldmap.primary

    if index is None:
        raise ValueError, "Not index given and no primary one"

    words = [index.marshall(word) for word in words]

    index = fieldmap.get_field(index)
    return lemmatize_for(words, index.dictionnary)
예제 #5
0
파일: lemmatize.py 프로젝트: LBdN/sesql
def lemmatize(words, index = None):
    """
    Give a lemmatized version of those words

    Use the configuration for the given index, or the default one if
    index is None
    """
    if index is None:
        index = fieldmap.primary

    if index is None:
        raise ValueError, "Not index given and no primary one"

    words = [ index.marshall(word) for word in words ]

    index = fieldmap.get_field(index)
    return lemmatize_for(words, index.dictionnary)
예제 #6
0
    def _get_smart_query(self):
        """
        Get the template for performing smart queries
        """
        table = self.get_table_name()
        pattern, values = self.get_pattern()
        o_pattern, o_values = self.get_order()

        classes = self.get_classes()
        l_pattern, l_values = fieldmap.get_field("classname").get_in(classes)
        l_order, _ = self.get_order(limit=1)

        cursor = config.orm.cursor()

        #
        # We need to do some query optimization, since postgresql will not
        # handle well the cases of many matches
        #

        smartquery = """SELECT %s
FROM  (SELECT * FROM %s WHERE %s ORDER BY %s LIMIT {SESQL_SMART_LIMIT}) subquery
WHERE %s ORDER BY %s LIMIT {SESQL_THE_LIMIT}""" % (', '.join(
            self.fields), table, l_pattern, l_order, pattern, o_pattern)
        return smartquery, l_values + values + o_values