Exemplo n.º 1
0
static int assign_gp(rasqal_graph_pattern *gp, rasqal_literal *graph, struct pattern_data *pd)
{
//printf("OP=%d\n", rasqal_graph_pattern_get_operator(gp));
    if (rasqal_graph_pattern_get_origin(gp)) {
        graph = rasqal_graph_pattern_get_origin(gp);
//printf("ORIGIN=");
//rasqal_literal_print(graph, stdout);
//printf("\n");
    }
    for (int i=0; rasqal_graph_pattern_get_triple(gp, i); i++) {
        rasqal_triple *otr = rasqal_graph_pattern_get_triple(gp, i);
        if (any_vars(otr)) {
            rasqal_triple *tr = rasqal_new_triple_from_triple(otr);
            if (graph) {
                tr->origin = graph;
            }
            if (tr->origin) {
                fs_check_cons_slot(pd->q, pd->vars, tr->origin);
            }
            fs_check_cons_slot(pd->q, pd->vars, tr->subject);
            fs_check_cons_slot(pd->q, pd->vars, tr->predicate);
            fs_check_cons_slot(pd->q, pd->vars, tr->object);
            raptor_sequence_push(pd->patterns, tr);
        } else {
            raptor_sequence_push(pd->fixed, otr);
        }
    }

    for (int s=0; rasqal_graph_pattern_get_sub_graph_pattern(gp, s); s++) {
        assign_gp(rasqal_graph_pattern_get_sub_graph_pattern(gp, s), graph, pd);
    }

    return 0;
}
Exemplo n.º 2
0
static void
roqet_graph_pattern_walk(rasqal_graph_pattern *gp, int gp_index,
                         FILE *fh, int indent) {
    int triple_index = 0;
    rasqal_graph_pattern_operator op;
    int seen;
    raptor_sequence *seq;
    int idx;
    rasqal_expression* expr;
    rasqal_variable* var;
    rasqal_literal* literal;

    op = rasqal_graph_pattern_get_operator(gp);

    roqet_write_indent(fh, indent);
    fprintf(fh, "%s graph pattern",
            rasqal_graph_pattern_operator_as_string(op));
    idx = rasqal_graph_pattern_get_index(gp);

    if(idx >= 0)
        fprintf(fh, "[%d]", idx);

    if(gp_index >= 0)
        fprintf(fh, " #%d", gp_index);
    fputs(" {\n", fh);

    indent += 2;

    /* look for LET variable and value */
    var = rasqal_graph_pattern_get_variable(gp);
    if(var) {
        roqet_write_indent(fh, indent);
        fprintf(fh, "%s := ", var->name);
        rasqal_expression_print(var->expression, fh);
    }

    /* look for GRAPH literal */
    literal = rasqal_graph_pattern_get_origin(gp);
    if(literal) {
        roqet_write_indent(fh, indent);
        fputs("origin ", fh);
        rasqal_literal_print(literal, fh);
        fputc('\n', fh);
    }

    /* look for SERVICE literal */
    literal = rasqal_graph_pattern_get_service(gp);
    if(literal) {
        roqet_write_indent(fh, indent);
        rasqal_literal_print(literal, fh);
        fputc('\n', fh);
    }


    /* look for triples */
    seen = 0;
    while(1) {
        rasqal_triple* t;

        t = rasqal_graph_pattern_get_triple(gp, triple_index);
        if(!t)
            break;

        if(!seen) {
            roqet_write_indent(fh, indent);
            fputs("triples {\n", fh);
            seen = 1;
        }

        roqet_write_indent(fh, indent + 2);
        fprintf(fh, "triple #%d { ", triple_index);
        rasqal_triple_print(t, fh);
        fputs(" }\n", fh);

        triple_index++;
    }
    if(seen) {
        roqet_write_indent(fh, indent);
        fputs("}\n", fh);
    }


    /* look for sub-graph patterns */
    seq = rasqal_graph_pattern_get_sub_graph_pattern_sequence(gp);
    if(seq && raptor_sequence_size(seq) > 0) {
        roqet_write_indent(fh, indent);
        fprintf(fh, "sub-graph patterns (%d) {\n", raptor_sequence_size(seq));

        gp_index = 0;
        while(1) {
            rasqal_graph_pattern* sgp;
            sgp = rasqal_graph_pattern_get_sub_graph_pattern(gp, gp_index);
            if(!sgp)
                break;

            roqet_graph_pattern_walk(sgp, gp_index, fh, indent + 2);
            gp_index++;
        }

        roqet_write_indent(fh, indent);
        fputs("}\n", fh);
    }


    /* look for filter */
    expr = rasqal_graph_pattern_get_filter_expression(gp);
    if(expr) {
        roqet_write_indent(fh, indent);
        fputs("filter { ", fh);
        rasqal_expression_print(expr, fh);
        fputs("}\n", fh);
    }


    indent -= 2;

    roqet_write_indent(fh, indent);
    fputs("}\n", fh);
}