Changeset: 72ee15dd7744 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=72ee15dd7744
Modified Files:
        sql/backends/monet5/vaults/lidar/75_lidar.sql
        sql/backends/monet5/vaults/lidar/lidar.c
        sql/backends/monet5/vaults/lidar/lidar.mal
Branch: data-vaults
Log Message:

[LiDAR]: Start the param parser impementation


diffs (256 lines):

diff --git a/sql/backends/monet5/vaults/lidar/75_lidar.sql 
b/sql/backends/monet5/vaults/lidar/75_lidar.sql
--- a/sql/backends/monet5/vaults/lidar/75_lidar.sql
+++ b/sql/backends/monet5/vaults/lidar/75_lidar.sql
@@ -1,5 +1,6 @@
 create procedure lidarattach(fname string) external name lidar.attach;
 create procedure lidarattach(fname string, tname string) external name 
lidar.attach;
+create procedure lidarattach(fname string, tname string, params string) 
external name lidar.attach;
 create procedure lidarload(tname string) external name lidar.load;
 create procedure lidarexport(tname string, fname string, format string) 
external name lidar.export;
 create procedure lidarchecktab(tname string) external name lidar.checktab;
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
@@ -719,9 +719,159 @@ LIDARopenFile(str fname)
        return res;
 }
 
+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 */
+} ParameterValues;
+
+typedef struct input_parameters {
+       int cnum;
+       int parameters;
+} InputParameters;
+
+/* Parse the parameter string that specifies what columns will be
+ * read.
+ */
+static void
+parse_parameters(str params, InputParameters *parsed) {
+       parsed->cnum = 0;
+       parsed->parameters = PARAMS_ALL_OFF;
+       for (char *p = params; *p != '\0'; p++) {
+               switch (*p) {
+               case 't':
+                       if (!(parsed->parameters ^ PARAM_GPS_TIME)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_GPS_TIME;
+                       parsed->cnum++;
+                       break;
+               case 'a':
+                       if (!(parsed->parameters ^ PARAM_SCAN_ANGLE)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_SCAN_ANGLE;
+                       parsed->cnum++;
+                       break;
+               case 'i':
+                       if (!(parsed->parameters ^ PARAM_INTENSITY)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_INTENSITY;
+                       parsed->cnum++;
+                       break;
+               case 'n':
+                       if (!(parsed->parameters ^ PARAM_N_RETURNS)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_N_RETURNS;
+                       parsed->cnum++;
+                       break;
+               case 'r':
+                       if (!(parsed->parameters ^ PARAM_N_THIS_RETURN)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_N_THIS_RETURN;
+                       parsed->cnum++;
+                       break;
+               case 'c':
+                       if (!(parsed->parameters ^ 
PARAM_CLASSIFICATION_NUMBER)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_CLASSIFICATION_NUMBER;
+                       parsed->cnum++;
+                       break;
+               case 'u':
+                       if (!(parsed->parameters ^ PARAM_USER_DATA)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_USER_DATA;
+                       parsed->cnum++;
+                       break;
+               case 'p':
+                       if (!(parsed->parameters ^ PARAM_POINT_SOURCE_ID)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_POINT_SOURCE_ID;
+                       parsed->cnum++;
+                       break;
+               case 'e':
+                       if (!(parsed->parameters ^ PARAM_EDGE_OF_FLIGHT_LINE)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_EDGE_OF_FLIGHT_LINE;
+                       parsed->cnum++;
+                       break;
+               case 'd':
+                       if (!(parsed->parameters ^ 
PARAM_DIRECTION_OF_SCAN_FLAG)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_DIRECTION_OF_SCAN_FLAG;
+                       parsed->cnum++;
+                       break;
+               case 'R':
+                       if (!(parsed->parameters ^ PARAM_RED_CHANNEL)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_RED_CHANNEL;
+                       parsed->cnum++;
+                       break;
+               case 'G':
+                       if (!(parsed->parameters ^ PARAM_GREEN_CHANNEL)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_GREEN_CHANNEL;
+                       parsed->cnum++;
+                       break;
+               case 'B':
+                       if (!(parsed->parameters ^ PARAM_BLUE_CHANNEL)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_BLUE_CHANNEL;
+                       parsed->cnum++;
+                       break;
+               case 'M':
+                       if (!(parsed->parameters ^ PARAM_VERTEX_INDEX)) {
+                               fprintf(stderr, "WARNING: Parameter %c already 
set. Ignoring.\n", *p);
+                               continue;
+                       }
+                       parsed->parameters |= PARAM_VERTEX_INDEX;
+                       parsed->cnum++;
+                       break;
+               default:
+                       fprintf(stderr, "WARNING: Unknown parameter char: %c. 
Ignoring.\n", *p);
+               }
+       }
+}
 
 #define LIDAR_READER_VERSION "1.8.0"
-str LIDARattach(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+str
+LIDARattach(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        mvc *m = NULL;
        sql_trans *tr;
@@ -732,10 +882,12 @@ str LIDARattach(Client cntxt, MalBlkPtr 
        str msg = MAL_SUCCEED;
        str fname = *getArgReference_str(stk, pci, 1);
        str tname = NULL;
+       str params = NULL;
+       InputParameters input_params;
        oid fid, tid, cid, rid = oid_nil;
        char *tname_low = NULL, *s, bname[BUFSIZ];
        char *p;
-       int cnum;
+       /* int cnum; */
        lidar_header *header;
        struct stat buf;
        int scaleX, scaleY, scaleZ;
@@ -746,11 +898,23 @@ str LIDARattach(Client cntxt, MalBlkPtr 
        lng uniq = 0;
        lng sz = 0;
 
-       if (pci->argc == 3) {
+       switch(pci->argc) {
+       case 2:
+               tname = fname;
+               break;
+       case 3:
                tname = *getArgReference_str(stk, pci, 2);
-       }
-       else if (pci->argc == 2) {
-               tname = fname;
+               break;
+       case 4:
+               tname = *getArgReference_str(stk, pci, 2);
+               params = *getArgReference_str(stk, pci, 3);
+#ifndef NDEBUG
+               fprintf(stderr, "Params: %s\n", params);
+#endif
+               break;
+       default:
+               msg = createException(MAL, "lidar.attach", "Wrong number of 
arguments");
+               return msg;
        }
 
 #ifndef NDEBUG
@@ -970,8 +1134,9 @@ str LIDARattach(Client cntxt, MalBlkPtr 
        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
-       tbl = mvc_create_table(m, sch, tname_low, tt_table, 0, SQL_PERSIST, 0, 
cnum);
+       /* cnum = 3;//x, y, z. TODO: Add all available columnt */
+       parse_parameters(params, &input_params);
+       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);
diff --git a/sql/backends/monet5/vaults/lidar/lidar.mal 
b/sql/backends/monet5/vaults/lidar/lidar.mal
--- a/sql/backends/monet5/vaults/lidar/lidar.mal
+++ b/sql/backends/monet5/vaults/lidar/lidar.mal
@@ -18,6 +18,10 @@ pattern attach(fname:str, tname:str):voi
 address LIDARattach
 comment "Attach to a specific table"
 
+pattern attach(fname:str, tname:str, params:str):void
+address LIDARattach
+comment "Attach to a specific table, with parameters"
+
 pattern load(tablename:str):void
 address LIDARloadTable
 comment "Load a LIDAR table from an attached file";
@@ -72,11 +76,10 @@ comment "Bind the 'schema.table.column' 
        1 - inserts
        2 - updates";
 
-pattern tid(id:int, mvc:int, sname:str, tname:str):bat[:oid] 
+pattern tid(id:int, mvc:int, sname:str, tname:str):bat[:oid]
 address LIDARTid
 comment "Return the tables tid column.";
 
-pattern tid(id:int, mvc:int, sname:str, tname:str, part_nr:int, nr_parts:int 
):bat[:oid] 
+pattern tid(id:int, mvc:int, sname:str, tname:str, part_nr:int, nr_parts:int 
):bat[:oid]
 address LIDARTid
 comment "Return the tables tid column.";
-
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to