void fs_values_order(fs_query *q) { int conditions; for (conditions = 0; rasqal_query_get_order_condition(q->rq, conditions); conditions++); int length = q->agg_values->len; fs_value *ordervals = malloc(length * conditions * sizeof(fs_value)); struct order_row *orows = malloc(sizeof(struct order_row) * length); for (int i=0; i<length; i++) { for (int j=0; j<conditions; j++) { ordervals[i * conditions + j] = fs_expression_eval(q, i, 0, rasqal_query_get_order_condition(q->rq, j)); #ifdef DEBUG_ORDER printf("@@_ ORDER VAL (%d, %d) = ", i, j); fs_value_print(ordervals[i * conditions + j]); printf("\n"); #endif } orows[i].row = i; orows[i].width = conditions; orows[i].vals = ordervals + (i * conditions); } qsort(orows, length, sizeof(struct order_row), orow_compare); int *ordering = malloc(sizeof(int) * length); for (int i=0; i<length; i++) { ordering[i] = orows[i].row; } #ifdef DEBUG_ORDER printf("Output order:\n"); for (int i=0; i<length; i++) { printf("output row %d row %d\n", i, ordering[i]); } #endif q->ordering = ordering; free(ordervals); free(orows); }
/* * rasqal_query_results_write_json1: * @iostr: #raptor_iostream to write the query to * @results: #rasqal_query_results query results format * @base_uri: #raptor_uri base URI of the output format * * Write a JSON version of the query results format to an * iostream in a format - INTERNAL. * * If the writing succeeds, the query results will be exhausted. * * Return value: non-0 on failure **/ static int rasqal_query_results_write_json1(rasqal_query_results_formatter* formatter, raptor_iostream *iostr, rasqal_query_results* results, raptor_uri *base_uri) { rasqal_world* world = rasqal_query_results_get_world(results); rasqal_query* query = rasqal_query_results_get_query(results); int i; int row_comma; int column_comma = 0; rasqal_query_results_type type; type = rasqal_query_results_get_type(results); if(type != RASQAL_QUERY_RESULTS_BINDINGS && type != RASQAL_QUERY_RESULTS_BOOLEAN) { rasqal_log_error_simple(query->world, RAPTOR_LOG_LEVEL_ERROR, &query->locator, "Cannot write JSON for %s query result format", rasqal_query_results_type_label(type)); return 1; } raptor_iostream_counted_string_write("{\n", 2, iostr); /* Header */ raptor_iostream_counted_string_write(" \"head\": {\n", 12, iostr); if(rasqal_query_results_is_bindings(results)) { raptor_iostream_counted_string_write(" \"vars\": [ ", 14, iostr); for(i = 0; 1; i++) { const unsigned char *name; name = rasqal_query_results_get_binding_name(results, i); if(!name) break; /* 'x', */ if(i > 0) raptor_iostream_counted_string_write(", ", 2, iostr); raptor_iostream_write_byte('\"', iostr); raptor_iostream_string_write(name, iostr); raptor_iostream_write_byte('\"', iostr); } raptor_iostream_counted_string_write(" ]\n", 3, iostr); } /* FIXME - could add link inside 'head': */ /* End Header */ raptor_iostream_counted_string_write(" },\n", 5, iostr); /* Boolean Results */ if(rasqal_query_results_is_boolean(results)) { raptor_iostream_counted_string_write(" ", 2, iostr); rasqal_iostream_write_json_boolean(iostr, "boolean", rasqal_query_results_get_boolean(results)); goto results3done; } /* Variable Binding Results */ raptor_iostream_counted_string_write(" \"results\": {\n", 15, iostr); if(query) { raptor_iostream_counted_string_write(" ", 4, iostr); rasqal_iostream_write_json_boolean(iostr, "ordered", (rasqal_query_get_order_condition(query, 0) != NULL)); raptor_iostream_counted_string_write(",\n", 2, iostr); raptor_iostream_counted_string_write(" ", 4, iostr); rasqal_iostream_write_json_boolean(iostr, "distinct", rasqal_query_get_distinct(query)); raptor_iostream_counted_string_write(",\n", 2, iostr); } raptor_iostream_counted_string_write(" \"bindings\" : [\n", 19, iostr); row_comma = 0; while(!rasqal_query_results_finished(results)) { if(row_comma) raptor_iostream_counted_string_write(",\n", 2, iostr); /* Result row */ raptor_iostream_counted_string_write(" {\n", 8, iostr); column_comma = 0; for(i = 0; i<rasqal_query_results_get_bindings_count(results); i++) { const unsigned char *name = rasqal_query_results_get_binding_name(results, i); rasqal_literal *l = rasqal_query_results_get_binding_value(results, i); if(column_comma) raptor_iostream_counted_string_write(",\n", 2, iostr); /* <binding> */ raptor_iostream_counted_string_write(" \"", 9, iostr); raptor_iostream_string_write(name, iostr); raptor_iostream_counted_string_write("\" : { ", 6, iostr); if(!l) { raptor_iostream_string_write("\"type\": \"unbound\", \"value\": null", iostr); } else { const unsigned char* str; size_t len; switch(l->type) { case RASQAL_LITERAL_URI: raptor_iostream_string_write("\"type\": \"uri\", \"value\": \"", iostr); str = RASQAL_GOOD_CAST(const unsigned char*, raptor_uri_as_counted_string(l->value.uri, &len)); raptor_string_ntriples_write(str, len, '"', iostr); raptor_iostream_write_byte('"', iostr); break; case RASQAL_LITERAL_BLANK: raptor_iostream_string_write("\"type\": \"bnode\", \"value\": \"", iostr); raptor_string_ntriples_write(l->string, l->string_len, '"', iostr); raptor_iostream_write_byte('"', iostr); break; case RASQAL_LITERAL_STRING: raptor_iostream_string_write("\"type\": \"literal\", \"value\": \"", iostr); raptor_string_ntriples_write(l->string, l->string_len, '"', iostr); raptor_iostream_write_byte('"', iostr); if(l->language) { raptor_iostream_string_write(",\n \"xml:lang\" : \"", iostr); raptor_iostream_string_write(RASQAL_GOOD_CAST(const unsigned char*, l->language), iostr); raptor_iostream_write_byte('"', iostr); } if(l->datatype) { raptor_iostream_string_write(",\n \"datatype\" : \"", iostr); str = RASQAL_GOOD_CAST(const unsigned char*, raptor_uri_as_counted_string(l->datatype, &len)); raptor_string_ntriples_write(str, len, '"', iostr); raptor_iostream_write_byte('"', iostr); } break; case RASQAL_LITERAL_PATTERN: case RASQAL_LITERAL_QNAME: case RASQAL_LITERAL_INTEGER: case RASQAL_LITERAL_XSD_STRING: case RASQAL_LITERAL_BOOLEAN: case RASQAL_LITERAL_DOUBLE: case RASQAL_LITERAL_FLOAT: case RASQAL_LITERAL_VARIABLE: case RASQAL_LITERAL_DECIMAL: case RASQAL_LITERAL_DATE: case RASQAL_LITERAL_DATETIME: case RASQAL_LITERAL_UDT: case RASQAL_LITERAL_INTEGER_SUBTYPE: case RASQAL_LITERAL_UNKNOWN: default: rasqal_log_error_simple(world, RAPTOR_LOG_LEVEL_ERROR, NULL, "Cannot turn literal type %u into XML", l->type); } } /* End Binding */ raptor_iostream_counted_string_write(" }", 2, iostr); column_comma = 1; }
void fs_query_order(fs_query *q) { int conditions; for (conditions = 0; rasqal_query_get_order_condition(q->rq, conditions); conditions++); const int length = q->length; #ifdef DEBUG_ORDER printf("@@ ORDER (%d x %d)\n", conditions, length); #endif /* trap trivial cases */ if (conditions == 0 || length == 0) { return; } /* spot the case where we have ORDER BY ?x, saves evaluating expressions */ if (conditions == 1) { rasqal_expression *oe = rasqal_query_get_order_condition(q->rq, 0); if ((oe->op == RASQAL_EXPR_ORDER_COND_ASC || oe->op == RASQAL_EXPR_ORDER_COND_DESC) && oe->arg1->op == RASQAL_EXPR_LITERAL && oe->arg1->literal->type == RASQAL_LITERAL_VARIABLE) { long int col = (long int)oe->arg1->literal->value.variable->user_data; if (col == 0) { fs_error(LOG_CRIT, "missing column"); return; } int *ordering; if (!fs_sort_column(q, q->bt, col, &ordering)) { if (oe->op == RASQAL_EXPR_ORDER_COND_DESC) { reverse_array(ordering, q->bt[col].vals->length); } q->ordering = ordering; return; } } } struct order_row *orows = malloc(sizeof(struct order_row) * length); fs_value *ordervals = malloc(length * conditions * sizeof(fs_value)); for (int i=0; i<length; i++) { for (int j=0; j<conditions; j++) { ordervals[i * conditions + j] = fs_expression_eval(q, i, 0, rasqal_query_get_order_condition(q->rq, j)); #ifdef DEBUG_ORDER printf("@@ ORDER VAL (%d, %d) = ", i, j); fs_value_print(ordervals[i * conditions + j]); printf("\n"); #endif } orows[i].row = i; orows[i].width = conditions; orows[i].vals = ordervals + (i * conditions); } qsort(orows, length, sizeof(struct order_row), orow_compare); int *ordering = malloc(sizeof(int) * length); for (int i=0; i<length; i++) { ordering[i] = orows[i].row; } #ifdef DEBUG_ORDER printf("Output order:\n"); for (int i=0; i<length; i++) { printf("output row %d row %d\n", i, ordering[i]); } #endif q->ordering = ordering; free(ordervals); free(orows); }
int rasqal_query_write_sparql_20060406(raptor_iostream *iostr, rasqal_query* query, raptor_uri *base_uri) { int i; sparql_writer_context wc; int limit, offset; rasqal_query_verb verb; wc.world = query->world; wc.base_uri = NULL; wc.type_uri = raptor_new_uri_for_rdf_concept(query->world->raptor_world_ptr, (const unsigned char*)"type"); wc.nstack = raptor_new_namespaces(query->world->raptor_world_ptr, 1); if(base_uri) { raptor_iostream_counted_string_write("BASE ", 5, iostr); rasqal_query_write_sparql_uri(&wc, iostr, base_uri); raptor_iostream_write_byte('\n', iostr); /* from now on all URIs are relative to this */ wc.base_uri = raptor_uri_copy(base_uri); } for(i = 0; 1 ; i++) { raptor_namespace *nspace; rasqal_prefix* p = rasqal_query_get_prefix(query, i); if(!p) break; raptor_iostream_counted_string_write("PREFIX ", 7, iostr); if(p->prefix) raptor_iostream_string_write(p->prefix, iostr); raptor_iostream_counted_string_write(": ", 2, iostr); rasqal_query_write_sparql_uri(&wc, iostr, p->uri); raptor_iostream_write_byte('\n', iostr); /* Use this constructor so we copy a URI directly */ nspace = raptor_new_namespace_from_uri(wc.nstack, p->prefix, p->uri, i); raptor_namespaces_start_namespace(wc.nstack, nspace); } if(query->explain) raptor_iostream_counted_string_write("EXPLAIN ", 8, iostr); verb = query->verb; /* These terms are deprecated */ if(query->verb == RASQAL_QUERY_VERB_INSERT || query->verb == RASQAL_QUERY_VERB_DELETE) { verb = RASQAL_QUERY_VERB_UPDATE; } /* Write SPARQL 1.1 (Draft) Update forms */ if(verb == RASQAL_QUERY_VERB_UPDATE) { rasqal_update_operation* update; /* Write SPARQL Update */ for(i = 0; (update = rasqal_query_get_update_operation(query, i)); i++) { int is_always_2_args = (update->type >= RASQAL_UPDATE_TYPE_ADD && update->type <= RASQAL_UPDATE_TYPE_COPY); if(update->type == RASQAL_UPDATE_TYPE_UPDATE) { /* update operations: * WITH ... INSERT { template } DELETE { template } WHERE { template } * INSERT/DELETE { template } WHERE { template } * INSERT/DELETE DATA { triples } */ if(update->graph_uri) { raptor_iostream_counted_string_write("WITH ", 5, iostr); rasqal_query_write_sparql_uri(&wc, iostr, update->graph_uri); raptor_iostream_write_byte('\n', iostr); } if(update->delete_templates) { raptor_iostream_counted_string_write("DELETE ", 7, iostr); if(update->flags & RASQAL_UPDATE_FLAGS_DATA) raptor_iostream_counted_string_write("DATA ", 5, iostr); rasqal_query_write_sparql_triple_data(&wc, iostr, update->delete_templates, 0); raptor_iostream_write_byte('\n', iostr); } if(update->insert_templates) { raptor_iostream_counted_string_write("INSERT ", 7, iostr); if(update->flags & RASQAL_UPDATE_FLAGS_DATA) raptor_iostream_counted_string_write("DATA ", 5, iostr); rasqal_query_write_sparql_triple_data(&wc, iostr, update->insert_templates, 0); raptor_iostream_write_byte('\n', iostr); } if(update->where) { raptor_iostream_counted_string_write("WHERE ", 6, iostr); rasqal_query_write_sparql_graph_pattern(&wc, iostr, update->where, -1, 0); raptor_iostream_write_byte('\n', iostr); } } else { /* admin operations: * CLEAR GRAPH graph-uri | DEFAULT | NAMED | ALL * CREATE (SILENT) GRAPH graph-uri | DEFAULT | NAMED | ALL * DROP (SILENT) GRAPH graph-uri * LOAD (SILENT) doc-uri / LOAD (SILENT) doc-uri INTO GRAPH graph-uri * ADD (SILENT) GraphOrDefault TO GraphOrDefault * MOVE (SILENT) GraphOrDefault TO GraphOrDefault * COPY (SILENT) GraphOrDefault TO GraphOrDefault */ raptor_iostream_string_write(rasqal_update_type_label(update->type), iostr); if(update->flags & RASQAL_UPDATE_FLAGS_SILENT) raptor_iostream_counted_string_write(" SILENT", 7, iostr); if(is_always_2_args) { /* ADD, MOVE, COPY are always 2-arg admin operations */ rasqal_query_write_graphref(&wc, iostr, update->graph_uri, RASQAL_UPDATE_GRAPH_ONE); raptor_iostream_counted_string_write(" TO", 3, iostr); rasqal_query_write_graphref(&wc, iostr, update->document_uri, RASQAL_UPDATE_GRAPH_ONE); } else if(update->type == RASQAL_UPDATE_TYPE_LOAD) { /* LOAD is 1 or 2 URIs and first one never has a GRAPH prefix */ raptor_iostream_write_byte(' ', iostr); rasqal_query_write_sparql_uri(&wc, iostr, update->document_uri); if(update->graph_uri) { raptor_iostream_counted_string_write(" INTO", 5, iostr); rasqal_query_write_graphref(&wc, iostr, update->graph_uri, RASQAL_UPDATE_GRAPH_ONE); } } else { /* everything else is defined by update->applies; only * CLEAR and DROP may apply to >1 graph */ rasqal_query_write_graphref(&wc, iostr, update->graph_uri, update->applies); } raptor_iostream_write_byte('\n', iostr); } } goto tidy; } if(verb != RASQAL_QUERY_VERB_CONSTRUCT) raptor_iostream_string_write(rasqal_query_verb_as_string(query->verb), iostr); if(query->distinct) { if(query->distinct == 1) raptor_iostream_counted_string_write(" DISTINCT", 9, iostr); else raptor_iostream_counted_string_write(" REDUCED", 8, iostr); } if(query->wildcard) raptor_iostream_counted_string_write(" *", 2, iostr); else if(verb == RASQAL_QUERY_VERB_DESCRIBE) { raptor_sequence *lit_seq = query->describes; int count = raptor_sequence_size(lit_seq); for(i = 0; i < count; i++) { rasqal_literal* l = (rasqal_literal*)raptor_sequence_get_at(lit_seq, i); raptor_iostream_write_byte(' ', iostr); rasqal_query_write_sparql_literal(&wc, iostr, l); } } else if(verb == RASQAL_QUERY_VERB_SELECT) { rasqal_query_write_sparql_select(&wc, iostr, query->selects); } raptor_iostream_write_byte('\n', iostr); if(query->data_graphs) { for(i = 0; 1; i++) { rasqal_data_graph* dg = rasqal_query_get_data_graph(query, i); if(!dg) break; if(dg->flags & RASQAL_DATA_GRAPH_NAMED) continue; rasqal_query_write_data_format_comment(&wc, iostr, dg); raptor_iostream_counted_string_write("FROM ", 5, iostr); rasqal_query_write_sparql_uri(&wc, iostr, dg->uri); raptor_iostream_counted_string_write("\n", 1, iostr); } for(i = 0; 1; i++) { rasqal_data_graph* dg = rasqal_query_get_data_graph(query, i); if(!dg) break; if(!(dg->flags & RASQAL_DATA_GRAPH_NAMED)) continue; rasqal_query_write_data_format_comment(&wc, iostr, dg); raptor_iostream_counted_string_write("FROM NAMED ", 11, iostr); rasqal_query_write_sparql_uri(&wc, iostr, dg->name_uri); raptor_iostream_write_byte('\n', iostr); } } if(query->constructs) { raptor_iostream_string_write("CONSTRUCT {\n", iostr); for(i = 0; 1; i++) { rasqal_triple* t = rasqal_query_get_construct_triple(query, i); if(!t) break; raptor_iostream_counted_string_write(" ", 2, iostr); rasqal_query_write_sparql_triple(&wc, iostr, t); raptor_iostream_write_byte('\n', iostr); } raptor_iostream_counted_string_write("}\n", 2, iostr); } if(query->query_graph_pattern) { raptor_iostream_counted_string_write("WHERE ", 6, iostr); rasqal_query_write_sparql_graph_pattern(&wc, iostr, query->query_graph_pattern, -1, 0); raptor_iostream_write_byte('\n', iostr); } if(rasqal_query_get_group_conditions_sequence(query)) { raptor_iostream_counted_string_write("GROUP BY ", 9, iostr); for(i = 0; 1; i++) { rasqal_expression* expr = rasqal_query_get_group_condition(query, i); if(!expr) break; if(i > 0) raptor_iostream_write_byte(' ', iostr); rasqal_query_write_sparql_expression(&wc, iostr, expr); } raptor_iostream_write_byte('\n', iostr); } if(rasqal_query_get_having_conditions_sequence(query)) { raptor_iostream_counted_string_write("HAVING ", 7, iostr); for(i = 0; 1; i++) { rasqal_expression* expr = rasqal_query_get_having_condition(query, i); if(!expr) break; if(i > 0) raptor_iostream_write_byte(' ', iostr); rasqal_query_write_sparql_expression(&wc, iostr, expr); } raptor_iostream_write_byte('\n', iostr); } if(rasqal_query_get_order_conditions_sequence(query)) { raptor_iostream_counted_string_write("ORDER BY ", 9, iostr); for(i = 0; 1; i++) { rasqal_expression* expr = rasqal_query_get_order_condition(query, i); if(!expr) break; if(i > 0) raptor_iostream_write_byte(' ', iostr); rasqal_query_write_sparql_expression(&wc, iostr, expr); } raptor_iostream_write_byte('\n', iostr); } limit = rasqal_query_get_limit(query); offset = rasqal_query_get_offset(query); if(limit >= 0 || offset >= 0) { if(limit >= 0) { raptor_iostream_counted_string_write("LIMIT ", 7, iostr); raptor_iostream_decimal_write(limit, iostr); } if(offset >= 0) { if(limit) raptor_iostream_write_byte(' ', iostr); raptor_iostream_counted_string_write("OFFSET ", 8, iostr); raptor_iostream_decimal_write(offset, iostr); } raptor_iostream_write_byte('\n', iostr); } if(query->bindings) rasqal_write_sparql_bindings(&wc, iostr, query->bindings); tidy: raptor_free_uri(wc.type_uri); if(wc.base_uri) raptor_free_uri(wc.base_uri); raptor_free_namespaces(wc.nstack); return 0; }