Changeset: 4a0e6337ad6d for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4a0e6337ad6d Modified Files: sql/backends/monet5/vaults/lidar/lidar.c Branch: data-vaults Log Message:
[LiDAR]: Attach with parameters creates the columns lidarattach now accepts a parameter string, parses it and creates the relevant columns in the table. diffs (266 lines): diff --git a/sql/backends/monet5/vaults/lidar/lidar.c b/sql/backends/monet5/vaults/lidar/lidar.c --- a/sql/backends/monet5/vaults/lidar/lidar.c +++ b/sql/backends/monet5/vaults/lidar/lidar.c @@ -720,21 +720,25 @@ LIDARopenFile(str fname) } typedef enum { - PARAMS_ALL_OFF = 0, - PARAM_GPS_TIME = 1, /* t */ - PARAM_SCAN_ANGLE = 2, /* a */ - PARAM_INTENSITY = 4, /* i */ - PARAM_N_RETURNS = 8, /* n */ - PARAM_N_THIS_RETURN = 16, /* r */ - PARAM_CLASSIFICATION_NUMBER = 32, /* c */ - PARAM_USER_DATA = 64, /* u */ - PARAM_POINT_SOURCE_ID = 128, /* p */ - PARAM_EDGE_OF_FLIGHT_LINE = 256, /* e */ - PARAM_DIRECTION_OF_SCAN_FLAG = 512, /* d */ - PARAM_RED_CHANNEL = 1024, /* R */ - PARAM_GREEN_CHANNEL = 2048, /* G */ - PARAM_BLUE_CHANNEL = 4096, /* B */ - PARAM_VERTEX_INDEX = 8192 /* M */ + PARAMS_ALL_OFF = 0, + PARAM_X_COORD = 0x1, /* x or X */ + PARAM_Y_COORD = 0x2, /* y or Y */ + PARAM_Z_COORD = 0x4, /* z or Z */ + PARAM_N_RETURNS = 0x8, /* n */ + PARAM_N_THIS_RETURN = 0x10, /* r */ + PARAM_CLASSIFICATION_NUMBER = 0x20, /* c */ + PARAM_USER_DATA = 0x40, /* u */ + PARAM_POINT_SOURCE_ID = 0x80, /* p */ + PARAM_EDGE_OF_FLIGHT_LINE = 0x100, /* e */ + PARAM_DIRECTION_OF_SCAN_FLAG = 0x200, /* d */ + PARAM_RED_CHANNEL = 0x400, /* R */ + PARAM_GREEN_CHANNEL = 0x800, /* G */ + PARAM_BLUE_CHANNEL = 0x1000, /* B */ + PARAM_VERTEX_INDEX = 0x2000, /* M */ + PARAM_GPS_TIME = 0x4000, /* t */ + PARAM_SCAN_ANGLE = 0x8000, /* a */ + PARAM_INTENSITY = 0x10000, /* i */ + PARAMS_END_SENTINEL } ParameterValues; typedef struct input_parameters { @@ -747,10 +751,37 @@ typedef struct input_parameters { */ static void parse_parameters(str params, InputParameters *parsed) { - parsed->cnum = 3; /* We are loading x, y, and z no matter what. */ + parsed->cnum = 0; parsed->parameters = PARAMS_ALL_OFF; for (char *p = params; *p != '\0'; p++) { switch (*p) { + case 'x': + case 'X': + if (!(parsed->parameters ^ PARAM_X_COORD)) { + fprintf(stderr, "WARNING: Parameter %c already set. Ignoring.\n", *p); + continue; + } + parsed->parameters |= PARAM_X_COORD; + parsed->cnum++; + break; + case 'y': + case 'Y': + if (!(parsed->parameters ^ PARAM_Y_COORD)) { + fprintf(stderr, "WARNING: Parameter %c already set. Ignoring.\n", *p); + continue; + } + parsed->parameters |= PARAM_Y_COORD; + parsed->cnum++; + break; + case 'z': + case 'Z': + if (!(parsed->parameters ^ PARAM_Z_COORD)) { + fprintf(stderr, "WARNING: Parameter %c already set. Ignoring.\n", *p); + continue; + } + parsed->parameters |= PARAM_Z_COORD; + parsed->cnum++; + break; case 't': if (!(parsed->parameters ^ PARAM_GPS_TIME)) { fprintf(stderr, "WARNING: Parameter %c already set. Ignoring.\n", *p); @@ -1133,19 +1164,92 @@ LIDARattach(Client cntxt, MalBlkPtr mb, /* add a lidar_column tuple */ col = mvc_bind_column(m, lidar_col, "id"); cid = store_funcs.count_col(tr, col, 1) + 1; + /* create an SQL table to hold the LIDAR table */ - /* cnum = 3;//x, y, z. TODO: Add all available columnt */ - parse_parameters(params, &input_params); + if (params != NULL) { + parse_parameters(params, &input_params); + } + else { + /* If no parameter string is given read x, y, and z */ + input_params.cnum = 3; + input_params.parameters = PARAM_X_COORD | PARAM_Y_COORD | PARAM_Z_COORD; + } tbl = mvc_create_table(m, sch, tname_low, tt_table, 0, SQL_PERSIST, 0, input_params.cnum); - sql_find_subtype(&t, "decimal", precisionX, scaleX); - mvc_create_column(m, tbl, "x", &t); - - sql_find_subtype(&t, "decimal", precisionY, scaleY); - mvc_create_column(m, tbl, "y", &t); - - sql_find_subtype(&t, "decimal", precisionZ, scaleZ); - mvc_create_column(m, tbl, "z", &t); + for (int x = 1; x < PARAMS_END_SENTINEL; x <<= 1) { + if (input_params.parameters & x) { + switch(x) { + case PARAM_X_COORD: + sql_find_subtype(&t, "decimal", precisionX, scaleX); + mvc_create_column(m, tbl, "x", &t); + break; + case PARAM_Y_COORD: + sql_find_subtype(&t, "decimal", precisionY, scaleY); + mvc_create_column(m, tbl, "y", &t); + break; + case PARAM_Z_COORD: + sql_find_subtype(&t, "decimal", precisionZ, scaleZ); + mvc_create_column(m, tbl, "z", &t); + break; + case PARAM_GPS_TIME: + sql_find_subtype(&t, "double", 0, 0); + mvc_create_column(m, tbl, "gpstime", &t); + break; + case PARAM_SCAN_ANGLE: + sql_find_subtype(&t, "tinyint", 0, 0); + mvc_create_column(m, tbl, "scan_angle", &t); + break; + case PARAM_INTENSITY: + sql_find_subtype(&t, "smallint", 0, 0); + mvc_create_column(m, tbl, "intensity", &t); + break; + case PARAM_N_RETURNS: + sql_find_subtype(&t, "smallint", 0, 0); + mvc_create_column(m, tbl, "n_returns", &t); + break; + case PARAM_N_THIS_RETURN: + sql_find_subtype(&t, "smallint", 0, 0); + mvc_create_column(m, tbl, "n_this_return", &t); + break; + case PARAM_CLASSIFICATION_NUMBER: + sql_find_subtype(&t, "tinyint", 0, 0); + mvc_create_column(m, tbl, "classification_number", &t); + break; + case PARAM_USER_DATA: + sql_find_subtype(&t, "tinyint", 0, 0); + mvc_create_column(m, tbl, "user_data", &t); + break; + case PARAM_POINT_SOURCE_ID: + sql_find_subtype(&t, "smallint", 0, 0); + mvc_create_column(m, tbl, "point_source_id", &t); + break; + case PARAM_EDGE_OF_FLIGHT_LINE: + sql_find_subtype(&t, "smallint", 0, 0); + mvc_create_column(m, tbl, "edge_of_flight_line", &t); + break; + case PARAM_DIRECTION_OF_SCAN_FLAG: + sql_find_subtype(&t, "smallint", 0, 0); + mvc_create_column(m, tbl, "direction_of_scan_flag", &t); + break; + case PARAM_RED_CHANNEL: + sql_find_subtype(&t, "smallint", 0, 0); + mvc_create_column(m, tbl, "red_channel", &t); + break; + case PARAM_GREEN_CHANNEL: + sql_find_subtype(&t, "smallint", 0, 0); + mvc_create_column(m, tbl, "green_channel", &t); + break; + case PARAM_BLUE_CHANNEL: + sql_find_subtype(&t, "smallint", 0, 0); + mvc_create_column(m, tbl, "blue_channel", &t); + break; + case PARAM_VERTEX_INDEX: + sql_find_subtype(&t, "integer", 0, 0); + mvc_create_column(m, tbl, "vertex_index", &t); + break; + } + } + } istmt = (char *) GDKzalloc(8192); snprintf(istmt, 8192, "INSERT INTO sys.vault_journal VALUES(%d, '%s', 'lidar', '%s');", tbl->base.id, tname_low, LIDAR_READER_VERSION); @@ -1157,48 +1261,42 @@ LIDARattach(Client cntxt, MalBlkPtr mb, cstmt = GDKzalloc(8192); col = mvc_bind_column(m, tbl, "x"); - snprintf(minval, BUFSIZ, "%lf", header->hi->minX); - snprintf(maxval, BUFSIZ, "%lf", header->hi->maxX); - snprintf(col_type, BUFSIZ, "%s(%u,%u)", col->type.type->sqlname, col->type.digits, col->type.scale); - if (!col) { - GDKfree(cstmt); - return createException(SQL, "lidar.attach", "cannot bind column x"); - } - snprintf(cstmt, 8192, "insert into sys.statistics values(%d,'%s',%d,now()," LLFMT "," LLFMT "," LLFMT "," LLFMT ",'%s','%s',%s);", col->base.id, col_type, precisionX, sz, sz, uniq, nils, minval, maxval, (header->hi->minX == header->hi->maxX) ? "true" : "false"); - msg = SQLstatementIntern(cntxt, &cstmt, "LIDARattach", TRUE, FALSE, NULL); - if (msg) { - GDKfree(cstmt); - return msg; + if (col) { + snprintf(minval, BUFSIZ, "%lf", header->hi->minX); + snprintf(maxval, BUFSIZ, "%lf", header->hi->maxX); + snprintf(col_type, BUFSIZ, "%s(%u,%u)", col->type.type->sqlname, col->type.digits, col->type.scale); + snprintf(cstmt, 8192, "insert into sys.statistics values(%d,'%s',%d,now()," LLFMT "," LLFMT "," LLFMT "," LLFMT ",'%s','%s',%s);", col->base.id, col_type, precisionX, sz, sz, uniq, nils, minval, maxval, (header->hi->minX == header->hi->maxX) ? "true" : "false"); + msg = SQLstatementIntern(cntxt, &cstmt, "LIDARattach", TRUE, FALSE, NULL); + if (msg) { + GDKfree(cstmt); + return msg; + } } col = mvc_bind_column(m, tbl, "y"); - snprintf(minval, BUFSIZ, "%lf", header->hi->minY); - snprintf(maxval, BUFSIZ, "%lf", header->hi->maxY); - snprintf(col_type, BUFSIZ, "%s(%u,%u)", col->type.type->sqlname, col->type.digits, col->type.scale); - if (!col) { - GDKfree(cstmt); - return createException(SQL, "lidar.attach", "cannot bind column x"); + if (col) { + snprintf(minval, BUFSIZ, "%lf", header->hi->minY); + snprintf(maxval, BUFSIZ, "%lf", header->hi->maxY); + snprintf(col_type, BUFSIZ, "%s(%u,%u)", col->type.type->sqlname, col->type.digits, col->type.scale); + snprintf(cstmt, 8192, "insert into sys.statistics values(%d,'%s',%d,now()," LLFMT "," LLFMT "," LLFMT "," LLFMT ",'%s','%s',%s);", col->base.id, col_type, precisionX, sz, sz, uniq, nils, minval, maxval, (header->hi->minY == header->hi->maxY) ? "true" : "false"); + msg = SQLstatementIntern(cntxt, &cstmt, "LIDARattach", TRUE, FALSE, NULL); + if (msg) { + GDKfree(cstmt); + return msg; + } } - snprintf(cstmt, 8192, "insert into sys.statistics values(%d,'%s',%d,now()," LLFMT "," LLFMT "," LLFMT "," LLFMT ",'%s','%s',%s);", col->base.id, col_type, precisionX, sz, sz, uniq, nils, minval, maxval, (header->hi->minY == header->hi->maxY) ? "true" : "false"); - msg = SQLstatementIntern(cntxt, &cstmt, "LIDARattach", TRUE, FALSE, NULL); - if (msg) { - GDKfree(cstmt); - return msg; - } + col = mvc_bind_column(m, tbl, "z"); + if (col) { + snprintf(minval, BUFSIZ, "%lf", header->hi->minZ); + snprintf(maxval, BUFSIZ, "%lf", header->hi->maxZ); + snprintf(col_type, BUFSIZ, "%s(%u,%u)", col->type.type->sqlname, col->type.digits, col->type.scale); - col = mvc_bind_column(m, tbl, "z"); - snprintf(minval, BUFSIZ, "%lf", header->hi->minZ); - snprintf(maxval, BUFSIZ, "%lf", header->hi->maxZ); - snprintf(col_type, BUFSIZ, "%s(%u,%u)", col->type.type->sqlname, col->type.digits, col->type.scale); - if (!col) { - GDKfree(cstmt); - return createException(SQL, "lidar.attach", "cannot bind column x"); - } - snprintf(cstmt, 8192, "insert into sys.statistics values(%d,'%s',%d,now()," LLFMT "," LLFMT "," LLFMT "," LLFMT ",'%s','%s',%s);", col->base.id, col_type, precisionX, sz, sz, uniq, nils, minval, maxval, (header->hi->minZ == header->hi->maxZ) ? "true" : "false"); - msg = SQLstatementIntern(cntxt, &cstmt, "LIDARattach", TRUE, FALSE, NULL); - if (msg) { - GDKfree(cstmt); - return msg; + snprintf(cstmt, 8192, "insert into sys.statistics values(%d,'%s',%d,now()," LLFMT "," LLFMT "," LLFMT "," LLFMT ",'%s','%s',%s);", col->base.id, col_type, precisionX, sz, sz, uniq, nils, minval, maxval, (header->hi->minZ == header->hi->maxZ) ? "true" : "false"); + msg = SQLstatementIntern(cntxt, &cstmt, "LIDARattach", TRUE, FALSE, NULL); + if (msg) { + GDKfree(cstmt); + return msg; + } } GDKfree(cstmt); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list