Example #1
0
    def test_parse_filter_10(self):
        """Verify parse_filter() recognizes values with apostrophes.
        """
        filter = "gene.Notes = 'Cro (control of repressor's operator)'"
        parsed_filter = parsing.parse_filter(filter)

        self.assertEqual(parsed_filter[3],
                         "Cro (control of repressor's operator)")

        filter = "gene.Notes = '5' nucleotidase'"
        parsed_filter = parsing.parse_filter(filter)

        self.assertEqual(parsed_filter[3], "5' nucleotidase")
Example #2
0
    def test_parse_filter_6(self):
        """Verify parse_filter() recognizes empty quote values.
        """
        filter = "gene.Notes = ''"
        parsed_filter = parsing.parse_filter(filter)

        self.assertEqual(parsed_filter[3], "")
Example #3
0
def build_where_clause(db_graph, filter_expression):
    filter_params = parsing.parse_filter(filter_expression)

    table_object = db_graph.nodes[filter_params[0]]["table"]
    column_object = table_object.columns[filter_params[1]]

    parsing.check_operator(filter_params[2], column_object)

    right = filter_params[3]

    if column_object.type.python_type == bytes:
        right = right.encode("utf-8")

    where_clause = None

    if filter_params[2] == "=":
        where_clause = (column_object == right)
    elif filter_params[2] == "LIKE":
        where_clause = (column_object.like(right))
    elif filter_params[2] == "!=" or filter_params[2] == "IS NOT":
        where_clause = (column_object != right)
    elif filter_params[2] == ">":
        where_clause = (column_object > right)
    elif filter_params[2] == ">=":
        where_clause = (column_object >= right)
    elif filter_params[2] == "<":
        where_clause = (column_object < right)
    elif filter_params[2] == "<=":
        where_clause = (column_object <= right)

    return where_clause
Example #4
0
    def test_parse_filter_4(self):
        """Verify parse_filter() raises ValueError from incomplete expression.
        """
        filter = "phage.PhageID Trixie = "

        with self.assertRaises(ValueError):
            parsed_filter = parsing.parse_filter(filter)
Example #5
0
    def test_parse_filter_3(self):
        """Verify parse_column() raises ValueError from bad column format
        """
        filter = "phage. PhageID = Trixie"

        with self.assertRaises(ValueError):
            parsed_filter = parsing.parse_filter(filter)
Example #6
0
    def test_parse_filter_11(self):
        """Verify parse_filter() handles hyphen characters.
        """
        filter = "gene.Notes LIKE 'MerR-like%'"
        parsed_filter = parsing.parse_filter(filter)

        self.assertTrue("MerR-like%" in parsed_filter[3])
Example #7
0
def build_where_clause(db_graph, filter_expression):
    """Creates a SQLAlchemy BinaryExpression object from a MySQL WHERE
       clause expression.

    :param db_graph: SQLAlchemy structured NetworkX Graph object.
    :type db_graph: Graph
    :param filter_expression: MySQL where clause expression.
    :type filter_expression: str
    :returns: MySQL expression-related SQLAlchemy BinaryExpression object.
    :rtype: BinaryExpression
    """
    filter_params = parsing.parse_filter(filter_expression)

    # Retrieve Table and Column objects from split filter expression strings
    table_object = db_graph.nodes[filter_params[0]]["table"]

    column_name = parsing.translate_column(
                                db_graph.graph["metadata"],
                                f"{table_object.name}.{filter_params[1]}")
    column_object = table_object.columns[column_name]

    # Checks the operator and Column type compatability
    parsing.check_operator(filter_params[2], column_object)

    right = filter_params[3]  # Stores the expressions 'right' value

    if column_object.type.python_type == bytes:
        if isinstance(right, list):
            for i in range(len(right)):
                right[i] = right[i].encode("utf-8")
        else:
            right = right.encode("utf-8")

    if right == "None":
        right = None

    where_clause = None

    if filter_params[2] == "=":
        where_clause = (column_object == right)
    elif filter_params[2] == "LIKE":
        where_clause = (column_object.like(right))
    elif filter_params[2] == "!=" or filter_params[2] == "IS NOT":
        where_clause = (column_object != right)
    elif filter_params[2] == ">":
        where_clause = (column_object > right)
    elif filter_params[2] == ">=":
        where_clause = (column_object >= right)
    elif filter_params[2] == "<":
        where_clause = (column_object < right)
    elif filter_params[2] == "<=":
        where_clause = (column_object <= right)
    elif filter_params[2] == "IN":
        where_clause = (column_object.in_(right))
    elif filter_params[2] == "NOT IN":
        where_clause = (column_object.notin_(right))

    return where_clause
Example #8
0
    def test_parse_filter_8(self):
        """Verify parse_filter() excludes commas in IN value operations.
        """
        filter = "gene.Notes IN ('terminase, small subunit', terminase)"
        parsed_filter = parsing.parse_filter(filter)

        self.assertTrue(len(parsed_filter[3]) == 2)
        self.assertTrue("terminase" in parsed_filter[3])
        self.assertTrue("terminase, small subunit" in parsed_filter[3])
Example #9
0
    def test_parse_filter_5(self):
        """Verify parse_filter() recognizes quoted conditional value.
        """
        filter = "gene.Notes = 'helix-turn-helix DNA binding domain protein'"

        parsed_filter = parsing.parse_filter(filter)

        self.assertEqual(parsed_filter[3],
                         "helix-turn-helix DNA binding domain protein")
Example #10
0
    def test_parse_filter_2(self):
        filter = "phage.PhageID = Trixie"

        parsed_filter = parsing.parse_filter(filter)

        self.assertTrue(len(parsed_filter) == 4)
        self.assertEqual(parsed_filter[0], "phage")
        self.assertEqual(parsed_filter[1], "PhageID")
        self.assertEqual(parsed_filter[2], "=")
        self.assertEqual(parsed_filter[3], "Trixie")
Example #11
0
    def test_parse_filter_12(self):
        """Verify parse_filter() IN clauses handle apostrophes
        """
        filter = "gene.Notes IN ('5' nucleotidase', 'G-I-Y Y-I-G endonuclease')"
        parsed_filter = parsing.parse_filter(filter)

        self.assertTrue(len(parsed_filter[3]) == 2)

        self.assertTrue("5' nucleotidase" in parsed_filter[3])
        self.assertTrue("G-I-Y Y-I-G endonuclease" in parsed_filter[3])
Example #12
0
    def test_parse_filter_9(self):
        """Verify parse_filter() excludes quotations in quoted values.
        """
        filter = "phage.PhageID IN ('D29', 'Trixie')"
        parsed_filter = parsing.parse_filter(filter)
        print(parsed_filter)

        self.assertTrue(len(parsed_filter[3]) == 2)
        self.assertTrue("D29" in parsed_filter[3])
        self.assertTrue("Trixie" in parsed_filter[3])
Example #13
0
    def test_parse_filter_1(self):
        """Verify parse_filter() recognizes filter operands and operator.
        """
        filter = "phage.PhageID=Trixie"

        parsed_filter = parsing.parse_filter(filter)

        self.assertTrue(len(parsed_filter) == 4)
        self.assertEqual(parsed_filter[0], "phage")
        self.assertEqual(parsed_filter[1], "PhageID")
        self.assertEqual(parsed_filter[2], "=")
        self.assertEqual(parsed_filter[3], "Trixie")
Example #14
0
    def test_parse_filter_2(self):
        """Verify parse_filter() recognizes acceptable internal whitespaces.
        """
        filter = "phage.PhageID = Trixie"

        parsed_filter = parsing.parse_filter(filter)

        self.assertTrue(len(parsed_filter) == 4)
        self.assertEqual(parsed_filter[0], "phage")
        self.assertEqual(parsed_filter[1], "PhageID")
        self.assertEqual(parsed_filter[2], "=")
        self.assertEqual(parsed_filter[3], "Trixie")
Example #15
0
    def add(self, filter):
        where_clause = q.build_where_clause(self.graph, filter)
        parsed_filter = parsing.parse_filter(filter)
        filter_left = parsed_filter[0] + "." + parsed_filter[1]\
                    + parsed_filter[2]

        if filter_left not in self._filters.keys():
            self._filters.update({filter_left: [where_clause]})

        else:
            self._filters[filter_left].append(where_clause)

        self._updated = False
Example #16
0
    def test_parse_filter_7(self):
        """Verify parse_filter() recognizes IN value operations.
        """
        filter = "phage.PhageID IN (Trixie, D29, Myrna)"
        parsed_filter = parsing.parse_filter(filter)

        self.assertTrue(isinstance(parsed_filter[3], list))
        self.assertTrue(isinstance(parsed_filter[3][0], str))
        self.assertTrue(len(parsed_filter[3]) == 3)

        self.assertTrue("Trixie" in parsed_filter[3])
        self.assertTrue("D29" in parsed_filter[3])
        self.assertTrue("Myrna" in parsed_filter[3])
Example #17
0
    def remove(self, filter):
        parsed_filter = parsing.parse_filter(filter)
        filter_left = parsed_filter[0] + "." + parsed_filter[1]\
                    + parsed_filter[2]

        if filter_left in self._filters.keys():
            filters = self._filters[filter_left]
            if len(filters) == 1:
                self._filters.pop(filter_left)

            else:
                for clause in filters:
                    if clause.right.value == parsed_filter[3]:
                        filters.remove(clause)

        self._updated = False
Example #18
0
    def test_parse_filter_13(self):
        """Verify IN clauses is robust in handling edge-cases.
        """
        pass
        filter = ("gene.Notes NOT IN ("
                  "'Cro (control of repressor's operator)', "
                  "'terminase, small subunit', "
                  "'G-I-Y Y-I-G endonuclease', "
                  "'5' nucleotidase', "
                  "'DnaE-like DNA polymerase III (alpha)')")
        parsed_filter = parsing.parse_filter(filter)

        self.assertTrue(len(parsed_filter[3]) == 5)
        self.assertTrue("Cro (control of repressor's operator)" \
                         in parsed_filter[3])
        self.assertTrue("terminase, small subunit" in parsed_filter[3])
        self.assertTrue("G-I-Y Y-I-G endonuclease" in parsed_filter[3])
        self.assertTrue("5' nucleotidase" in parsed_filter[3])
        self.assertTrue("DnaE-like DNA polymerase III (alpha)" \
                        in parsed_filter[3])
Example #19
0
    def test_parse_filter3(self):
        filter = "phage.PhageID Trixie = "

        with self.assertRaises(ValueError):
            parsed_filter = parsing.parse_filter(filter)