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

Reply via email to