From 6738b9648378cb6f6df022c5455e81f96adb4802 Mon Sep 17 00:00:00 2001 From: Stefan de Konink Date: Fri, 10 Oct 2008 22:18:40 +0200 Subject: [PATCH] /full stuff --- handler_osm_get.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 9 deletions(-) diff --git a/handler_osm_get.c b/handler_osm_get.c index 9338663..318461e 100644 --- a/handler_osm_get.c +++ b/handler_osm_get.c @@ -42,8 +42,17 @@ #define SQL_GET_OBJECT_BY_ID "SELECT id, x, y, username, timestamp FROM " SQL_NODES " WHERE id = %lu", id #define SQL_GET_OBJECT_BY_IDS "SELECT id, x, y, username, timestamp FROM " SQL_NODES " WHERE id IN (%s) ORDER BY id" +#define SQL_GET_OBJECT_BY_WAY "SELECT id, x, y, username, timestamp FROM " SQL_NODES " WHERE id IN (SELECT DISTINCT to_node FROM way_nds WHERE way = %lu) ORDER BY id", id +#define SQL_GET_OBJECT_BY_RELATION "SELECT id, x, y, username, timestamp FROM " SQL_NODES " WHERE id IN (SELECT DISTINCT to_node FROM relation_members_node WHERE relation = %lu) ORDER BY id", id + +#define SQL_GET_NODES_BY_RELATION "SELECT DISTINCT id, x, y, username, timestamp FROM " SQL_NODES " WHERE id IN (SELECT to_node FROM relation_members_node WHERE relation = %lu) OR id IN (SELECT to_node FROM way_nds WHERE way IN (SELECT to_way FROM relation_members_way WHERE relation = %lu)) ORDER BY id;", id, id + #define SQL_GET_OBJTAG_BY_ID "SELECT node, k, v FROM node_tags WHERE node = %lu", id #define SQL_GET_OBJTAG_BY_IDS "SELECT node, k, v FROM node_tags WHERE node IN (%s) ORDER BY node" +#define SQL_GET_OBJTAG_BY_WAY "SELECT node, k, v FROM node_tags WHERE node IN (SELECT DISTINCT to_node FROM way_nds WHERE way = %lu) ORDER BY node", id +#define SQL_GET_OBJTAG_BY_RELATION "SELECT node, k, v FROM node_tags WHERE node IN (SELECT DISTINCT to_node FROM relation_members_node WHERE relation = %lu) ORDER BY node", id + +#define SQL_GET_NODES_TAGS_BY_RELATION "SELECT DISTINCT node, k, v FROM node_tags WHERE node IN (SELECT to_node FROM relation_members_node WHERE relation = %lu) OR id IN (SELECT to_node FROM way_nds WHERE way IN (SELECT to_way FROM relation_members_way WHERE relation = %lu)) ORDER BY node;", id, id static ret_t result_way_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *ways, MapiHdl *way_tags, MapiHdl *way_nds, cherokee_buffer_t *buf); @@ -91,13 +100,18 @@ static ret_t result_nodenew_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *nodes, return ret_ok; } -#define SQL_GET_WAY_BY_ND "SELECT id, username, timestamp FROM ways WHERE id IN (SELECT DISTINCT way FROM way_nds WHERE to_node = %lu)", id -#define SQL_GET_WAY_TAGS_BY_ND "SELECT way, k, v FROM way_tags WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node = %lu)", id -#define SQL_GET_WAY_NDS_BY_ND "SELECT way, to_node FROM way_nds WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node = %lu)", id +#define SQL_GET_WAY_BY_ND "SELECT id, username, timestamp FROM ways WHERE id IN (SELECT DISTINCT way FROM way_nds WHERE to_node = %lu) ORDER BY id", id +#define SQL_GET_WAY_BY_RELATION "SELECT id, username, timestamp FROM ways WHERE id IN (SELECT DISTINCT to_way FROM relation_members_way WHERE relation = %lu) ORDER BY id", id + +#define SQL_GET_WAY_TAGS_BY_ND "SELECT way, k, v FROM way_tags WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node = %lu) ORDER BY way", id +#define SQL_GET_WAY_TAGS_BY_RELATION "SELECT way, k, v FROM way_tags WHERE way IN (SELECT DISTINCT to_way FROM relation_members_way WHERE relation = %lu) ORDER BY way", id + +#define SQL_GET_WAY_NDS_BY_ND "SELECT way, to_node FROM way_nds WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node = %lu) ORDER BY way, to_node", id +#define SQL_GET_WAY_NDS_BY_RELATION "SELECT way, to_node FROM way_nds WHERE way IN (SELECT DISTINCT to_way FROM relation_members_way WHERE relation = %lu) ORDER BY way, to_node, idx", id -#define SQL_GET_WAY_BY_NDS "SELECT id, username, timestamp FROM ways WHERE id IN (SELECT DISTINCT way FROM way_nds WHERE to_node IN (%s))" -#define SQL_GET_WAY_TAGS_BY_NDS "SELECT way, k, v FROM way_tags WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node IN (%s))" -#define SQL_GET_WAY_NDS_BY_NDS "SELECT way, to_node FROM way_nds WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node IN (%s))" +#define SQL_GET_WAY_BY_NDS "SELECT id, username, timestamp FROM ways WHERE id IN (SELECT DISTINCT way FROM way_nds WHERE to_node IN (%s)) ORDER BY id" +#define SQL_GET_WAY_TAGS_BY_NDS "SELECT way, k, v FROM way_tags WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node IN (%s)) ORDER BY way" +#define SQL_GET_WAY_NDS_BY_NDS "SELECT way, to_node FROM way_nds WHERE way IN (SELECT DISTINCT way FROM way_nds WHERE to_node IN (%s)) ORDER BY way, to_node, idx" /* static ret_t result_nodenew_ways_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *nodes, MapiHdl *node_tags, cherokee_buffer_t *buf) { @@ -234,6 +248,7 @@ static ret_t result_way_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *ways, MapiH return ret_ok; } +#if MATERIALIZE static ret_t result_way_full_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *ways, MapiHdl *way_tags, MapiHdl *way_nds, cherokee_buffer_t *buf) { @@ -310,6 +325,7 @@ static ret_t result_way_full_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *ways, return ret_ok; } +#endif /* RELATION */ @@ -318,6 +334,7 @@ static ret_t result_way_full_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *ways, #define SQL_GET_RELATION_BY_WAY "SELECT DISTINCT relation FROM relation_members_way WHERE to_way = %lu", id #define SQL_GET_RELATION_BY_REL "SELECT DISTINCT relation FROM relation_members_relation WHERE to_relation = %lu", id +#if MATERIALIZE static ret_t result_id_to_list(cherokee_handler_osm_t *hdl, MapiHdl *thingie, cherokee_buffer_t *buf) { unsigned long int len = buf->len; if (mapi_get_row_count(*thingie) != 0) { @@ -333,21 +350,28 @@ static ret_t result_id_to_list(cherokee_handler_osm_t *hdl, MapiHdl *thingie, ch return ret_ok; } +#endif #define SQL_GET_RELATION_BY_ID "SELECT id, username, timestamp FROM relations WHERE id = %lu", id #define SQL_GET_RELATION_BY_IDS "SELECT id, username, timestamp FROM relations WHERE id IN (%s) ORDER BY id" +#define SQL_GET_RELATION_BY_RELATION "SELECT id, username, timestamp FROM relations WHERE id IN (SELECT DISTINCT relation FROM relation_members_node WHERE to_node = %lu) ORDER BY id", id #define SQL_GET_RELATION_TAGS_BY_ID "SELECT relation, k, v FROM relation_tags WHERE relation = %lu", id #define SQL_GET_RELATION_TAGS_BY_IDS "SELECT relation, k, v FROM relation_tags WHERE relation IN (%s) ORDER BY relation" +#define SQL_GET_RELATION_TAGS_BY_RELATION "SELECT relation, k, v FROM relation_tags WHERE relation IN (SELECT DISTINCT relation FROM relation_members_node WHERE to_node = %lu) ORDER BY relation", id #define SQL_GET_RELATION_MEMBER_NODE_BY_ID "SELECT relation, to_node, role FROM relation_members_node WHERE relation = %lu ORDER BY idx", id #define SQL_GET_RELATION_MEMBER_NODE_BY_IDS "SELECT relation, to_node, role FROM relation_members_node WHERE relation IN (%s) ORDER BY relation, idx" +#define SQL_GET_RELATION_MEMBER_NODE_BY_RELATION "SELECT relation, to_node, role FROM relation_members_node WHERE relation IN (SELECT DISTINCT relation FROM relation_members_node WHERE to_node = %lu) ORDER BY relation", id #define SQL_GET_RELATION_MEMBER_RELATION_BY_ID "SELECT relation, to_relation, role FROM relation_members_relation WHERE relation = %lu ORDER BY idx", id #define SQL_GET_RELATION_MEMBER_RELATION_BY_IDS "SELECT relation, to_relation, role FROM relation_members_relation WHERE relation IN (%s) ORDER BY relation, idx" +#define SQL_GET_RELATION_MEMBER_RELATION_BY_RELATION "SELECT relation, to_relation, role FROM relation_members_relation WHERE relation IN (SELECT DISTINCT relation FROM relation_members_relation WHERE to_relation = %lu) ORDER BY relation", id #define SQL_GET_RELATION_MEMBER_WAY_BY_ID "SELECT relation, to_way, role FROM relation_members_way WHERE relation = %lu ORDER BY idx", id #define SQL_GET_RELATION_MEMBER_WAY_BY_IDS "SELECT relation, to_way, role FROM relation_members_way WHERE relation IN (%s) ORDER BY relation, idx" +#define SQL_GET_RELATION_MEMBER_WAY_BY_RELATION "SELECT relation, to_way, role FROM relation_members_way WHERE relation IN (SELECT DISTINCT relation FROM relation_members_way WHERE to_way = %lu) ORDER BY relation", id + static ret_t result_relation_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *relations, MapiHdl *relation_tags, - MapiHdl *relation_mn, MapiHdl *relation_mw, MapiHdl *relation_mr, cherokee_buffer_t *buf) { + MapiHdl *relation_mn, MapiHdl *relation_mr, MapiHdl *relation_mw, cherokee_buffer_t *buf) { if (mapi_get_row_count(*relations) != 0) { unsigned long int current_tag = 0, current_member_node = 0, current_member_relation = 0, current_member_way = 0; @@ -444,7 +468,7 @@ static ret_t result_relation_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *relati return ret_ok; } - +#if MATERIALIZE static ret_t result_relation_full_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *relations, MapiHdl *relation_tags, MapiHdl *relation_mn, MapiHdl *relation_mr, MapiHdl *relation_mw, cherokee_buffer_t *buf) { @@ -604,6 +628,7 @@ static ret_t result_relation_full_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *r return ret_ok; } +#endif static ret_t result_relationway_to_xml(cherokee_handler_osm_t *hdl, MapiHdl *relations, MapiHdl *relation_tags, MapiHdl *members_relation, MapiHdl *members_node, @@ -753,7 +778,6 @@ get_object_by_id(cherokee_handler_osm_t *hdl, unsigned long int id, cherokee_buf ret = run_sql3(hdl, &sql1, &sql2, &sql3, buf, result_way_to_xml); break; case OSM_NODE_COMMAND_RELATIONS: { - fprintf(stderr, "DEBUG2\n"); cherokee_buffer_t relations = CHEROKEE_BUF_INIT; #ifdef MATERIALIZE cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_ND); @@ -787,7 +811,15 @@ get_object_by_id(cherokee_handler_osm_t *hdl, unsigned long int id, cherokee_buf cherokee_buffer_add_va (&sql1, SQL_GET_WAY_BY_ID); cherokee_buffer_add_va (&sql2, SQL_GET_WAY_TAGS_BY_ID); cherokee_buffer_add_va (&sql3, SQL_GET_WAY_NDS_BY_ID); +#ifdef MATERIALIZE ret = run_sql3(hdl, &sql1, &sql2, &sql3, buf, result_way_full_to_xml); +#else + ret = run_sql3(hdl, &sql1, &sql2, &sql3, buf, result_way_to_xml); + + cherokee_buffer_add_va (&sql4, SQL_GET_OBJECT_BY_WAY); + cherokee_buffer_add_va (&sql5, SQL_GET_OBJTAG_BY_WAY); + ret = run_sql2(hdl, &sql4, &sql5, buf, result_nodenew_to_xml); +#endif break; case OSM_WAY_COMMAND_RELATIONS: { cherokee_buffer_t relations = CHEROKEE_BUF_INIT; @@ -827,7 +859,39 @@ get_object_by_id(cherokee_handler_osm_t *hdl, unsigned long int id, cherokee_buf cherokee_buffer_add_va (&sql3, SQL_GET_RELATION_MEMBER_NODE_BY_ID); cherokee_buffer_add_va (&sql4, SQL_GET_RELATION_MEMBER_RELATION_BY_ID); cherokee_buffer_add_va (&sql5, SQL_GET_RELATION_MEMBER_WAY_BY_ID); +#ifdef MATERIALIZE ret = run_sql5(hdl, &sql1, &sql2, &sql3, &sql4, &sql5, buf, result_relation_full_to_xml); +#else + ret = run_sql5(hdl, &sql1, &sql2, &sql3, &sql4, &sql5, buf, result_relation_to_xml); + + cherokee_buffer_mrproper(&sql1); + cherokee_buffer_mrproper(&sql2); + cherokee_buffer_mrproper(&sql3); + cherokee_buffer_mrproper(&sql4); + cherokee_buffer_mrproper(&sql5); + + cherokee_buffer_add_va (&sql1, SQL_GET_NODES_BY_RELATION); + cherokee_buffer_add_va (&sql2, SQL_GET_NODES_TAGS_BY_RELATION); + ret = run_sql2(hdl, &sql1, &sql1, buf, result_nodenew_to_xml); + + cherokee_buffer_add_va (&sql3, SQL_GET_WAY_BY_RELATION); + cherokee_buffer_add_va (&sql4, SQL_GET_WAY_TAGS_BY_RELATION); + cherokee_buffer_add_va (&sql5, SQL_GET_WAY_NDS_BY_RELATION); + ret = run_sql3(hdl, &sql3, &sql4, &sql5, buf, result_way_to_xml); + + cherokee_buffer_mrproper(&sql1); + cherokee_buffer_mrproper(&sql2); + cherokee_buffer_mrproper(&sql3); + cherokee_buffer_mrproper(&sql4); + cherokee_buffer_mrproper(&sql5); + + cherokee_buffer_add_va (&sql1, SQL_GET_RELATION_BY_RELATION); + cherokee_buffer_add_va (&sql2, SQL_GET_RELATION_TAGS_BY_RELATION); + cherokee_buffer_add_va (&sql3, SQL_GET_RELATION_MEMBER_NODE_BY_RELATION); + cherokee_buffer_add_va (&sql4, SQL_GET_RELATION_MEMBER_RELATION_BY_RELATION); + cherokee_buffer_add_va (&sql5, SQL_GET_RELATION_MEMBER_WAY_BY_RELATION); + ret = run_sql5(hdl, &sql1, &sql2, &sql3, &sql4, &sql5, buf, result_relation_to_xml); +#endif break; case OSM_RELATION_COMMAND_RELATIONS: { cherokee_buffer_t relations = CHEROKEE_BUF_INIT; -- 2.11.4.GIT