Beispiel #1
0
        private string FilterToSQL(LiteralFilter filter, string col)
        {
            if (filter is SemWeb.Filters.StringCompareFilter)
            {
                SemWeb.Filters.StringCompareFilter f = (SemWeb.Filters.StringCompareFilter)filter;
                return(col + FilterOpToSQL(f.Type) + Escape(f.Pattern, true));
            }

            /*if (filter is SemWeb.Filters.StringContainsFilter) {
             *      SemWeb.Filters.StringContainsFilter f = (SemWeb.Filters.StringContainsFilter)filter;
             *      return CreateLikeTest(col, f.Pattern, 1); // 1=contains
             * }*/
            if (filter is SemWeb.Filters.StringStartsWithFilter)
            {
                SemWeb.Filters.StringStartsWithFilter f = (SemWeb.Filters.StringStartsWithFilter)filter;
                return(CreatePrefixTest(col, f.Pattern));                // 0=starts-with
            }
            if (filter is SemWeb.Filters.NumericCompareFilter)
            {
                SemWeb.Filters.NumericCompareFilter f = (SemWeb.Filters.NumericCompareFilter)filter;
                return(col + FilterOpToSQL(f.Type) + f.Number);
            }
            return(null);
        }
            protected override void extractLiteralFilters(name.levering.ryan.sparql.model.logic.ExpressionLogic node, java.util.Map literalFilters)
            {
                //Console.Error.WriteLine(node + " " + node.GetType());
                base.extractLiteralFilters(node, literalFilters);

                if (node is BinaryExpressionNode) {
                    BinaryExpressionNode b = (BinaryExpressionNode)node;

                    LiteralFilter.CompType comp;
                    if (node is ASTEqualsNode)
                        comp = LiteralFilter.CompType.EQ;
                    else if (node is ASTNotEqualsNode)
                        comp = LiteralFilter.CompType.NE;
                    else if (node is ASTGreaterThanNode)
                        comp = LiteralFilter.CompType.GT;
                    else if (node is ASTGreaterThanEqualsNode)
                        comp = LiteralFilter.CompType.GE;
                    else if (node is ASTLessThanNode)
                        comp = LiteralFilter.CompType.LT;
                    else if (node is ASTLessThanEqualsNode)
                        comp = LiteralFilter.CompType.LE;
                    else
                        return;

                    SparqlVariable var;
                    name.levering.ryan.sparql.common.Literal val;

                    object left = RemoveCast(b.getLeftExpression());
                    object right = RemoveCast(b.getRightExpression());

                    if (left is ASTVar && right is name.levering.ryan.sparql.common.Literal) {
                        var = (SparqlVariable)left;
                        val = (name.levering.ryan.sparql.common.Literal)right;
                    } else if (right is ASTVar && left is name.levering.ryan.sparql.common.Literal) {
                        var = (SparqlVariable)right;
                        val = (name.levering.ryan.sparql.common.Literal)left;
                        switch (comp) {
                        case LiteralFilter.CompType.LT: comp = LiteralFilter.CompType.GE; break;
                        case LiteralFilter.CompType.LE: comp = LiteralFilter.CompType.GT; break;
                        case LiteralFilter.CompType.GT: comp = LiteralFilter.CompType.LE; break;
                        case LiteralFilter.CompType.GE: comp = LiteralFilter.CompType.LT; break;
                        }
                    } else {
                        return;
                    }

                    object parsedvalue = new Literal(val.getLabel(), null, val.getDatatype() == null ? null : val.getDatatype().getURI()).ParseValue();

                    LiteralFilter filter = LiteralFilter.Create(comp, parsedvalue);
                    addLiteralFilter(var, filter, literalFilters);

                } else if (node is ASTRegexFuncNode) {
                    ASTRegexFuncNode renode = (ASTRegexFuncNode)node;

                    SparqlVariable var = RemoveCast(renode.getArguments().get(0)) as ASTVar;
                    name.levering.ryan.sparql.common.Literal relit = RemoveCast(renode.getArguments().get(1)) as name.levering.ryan.sparql.common.Literal;

                    if (var == null || relit == null) return;

                    string re = relit.getLabel();
                    if (re.Length == 0) return;

                    bool startsW = removeChar(ref re, '^', 0); // chop of ^ from start, return whether it was there
                    bool endsW = removeChar(ref re, '$', 1); // chop of $ from end, return whether it was there

                    // make sure the re that's left has no special re characters
                    foreach (char c in re)
                        if (c == '(' || c == '[' || c == '{' || c == '*' || c == '?' || c == '+' || c == '\\' || c == '|' || c == '.')
                            return;

                    LiteralFilter filter;
                    if (startsW && endsW) {
                        filter = LiteralFilter.Create(LiteralFilter.CompType.EQ, re);
                    } else if (startsW) {
                        filter = new SemWeb.Filters.StringStartsWithFilter(re);
                    } else if (endsW) {
                        filter = new SemWeb.Filters.StringEndsWithFilter(re);
                    } else {
                        filter = new SemWeb.Filters.StringContainsFilter(re);
                    }
                    addLiteralFilter(var, filter, literalFilters);
                }
            }