Changeset: b0536295deed for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b0536295deed
Modified Files:
sql/storage/store.c
Branch: arrays
Log Message:
arrays are loaded during startup
diffs (224 lines):
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -485,6 +485,7 @@ load_column(sql_trans *tr, sql_table *t,
sql_table *columns = find_sql_table(syss, "_columns");
sqlid cid;
+
v = table_funcs.column_find_value(tr, find_sql_column(columns, "id"),
rid);
cid = *(sqlid *)v; _DELETE(v);
v = table_funcs.column_find_value(tr, find_sql_column(columns, "name"),
rid);
@@ -524,84 +525,107 @@ load_column(sql_trans *tr, sql_table *t,
fprintf(stderr, "#\t\tload column %s\n", c->base.name);
return c;
}
-/*
+
static sql_dimension *
load_dimension(sql_trans *tr, sql_table *t, oid rid)
{
void *v;
- char *def, *tpe, *st, *min, *step, *max;
+ char *tpe, *st;
int sz, d;
- sql_dimension *dim = SA_ZNEW(tr->sa, sql_dimension);
+ sql_dimension *c = SA_ZNEW(tr->sa, sql_dimension);
sql_schema *syss = find_sql_schema(tr, "sys");
- sql_table *columns = find_sql_table(syss, "_dimensions");
+ sql_table *dimensions = find_sql_table(syss, "_dimensions");
+
+ sql_table *ranges = find_sql_table(syss, "_ranges");
+ sql_column *range_dimension_id;
+ rids *rs;
+ oid rng_rid;
+
sqlid cid;
- v = table_funcs.column_find_value(tr, find_sql_column(columns, "id"),
rid);
+ v = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"id"), rid);
cid = *(sqlid *)v; _DELETE(v);
- v = table_funcs.column_find_value(tr, find_sql_column(columns, "name"),
rid);
- base_init(tr->sa, &dim->base, cid, TR_OLD, v); _DELETE(v);
-
- tpe = table_funcs.column_find_value(tr, find_sql_column(columns,
"type"), rid);
- v = table_funcs.column_find_value(tr, find_sql_column(columns,
"type_digits"), rid);
+ v = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"name"), rid);
+ base_init(tr->sa, &c->base, cid, TR_OLD, v); _DELETE(v);
+
+ tpe = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"type"), rid);
+ v = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"type_digits"), rid);
sz = *(int *)v; _DELETE(v);
- v = table_funcs.column_find_value(tr, find_sql_column(columns,
"type_scale"), rid);
+ v = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"type_scale"), rid);
d = *(int *)v; _DELETE(v);
- if (!sql_find_subtype(&dim->type, tpe, sz, d))
- sql_init_subtype(&dim->type, sql_trans_bind_type(tr, t->s,
tpe), sz, d);
+ if (!sql_find_subtype(&c->type, tpe, sz, d))
+ sql_init_subtype(&c->type, sql_trans_bind_type(tr, t->s, tpe),
sz, d);
_DELETE(tpe);
-
- dim->def = NULL;
- def = table_funcs.column_find_value(tr, find_sql_column(columns,
"default"), rid);
- if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), def) != 0)
- dim->def = def;
- else
- _DELETE(def);
- dim->min = NULL;
- min = table_funcs.column_find_value(tr, find_sql_column(columns,
"min"), rid);
- if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), def) != 0)
- dim->min = min;
- else
- _DELETE(min);
- dim->step = NULL;
- step = table_funcs.column_find_value(tr, find_sql_column(columns,
"step"), rid);
- if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), def) != 0)
- dim->step = step;
- else
- _DELETE(step);
- dim->max = NULL;
- max = table_funcs.column_find_value(tr, find_sql_column(columns,
"max"), rid);
- if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), def) != 0)
- dim->max = max;
- else
- _DELETE(max);
-
- v = table_funcs.column_find_value(tr, find_sql_column(columns,
"dimnr"), rid);
- dim->dimnr = *(int *)v; _DELETE(v);
- v = table_funcs.column_find_value(tr, find_sql_column(columns,
"repeats1"), rid);
- dim->lvl1_repeatsNum = *(int *)v;
_DELETE(v);
- v = table_funcs.column_find_value(tr, find_sql_column(columns,
"repeats2"), rid);
- dim->lvl2_repeatsNum = *(int *)v;
_DELETE(v);
-
- v = table_funcs.column_find_value(tr, find_sql_column(columns, "umin"),
rid);
- dim->unbounded_min = *(bit *)v; _DELETE(v);
- v = table_funcs.column_find_value(tr, find_sql_column(columns, "umax"),
rid);
- dim->unbounded_max = *(bit *)v; _DELETE(v);
-
- dim->storage_type = NULL;
- st = table_funcs.column_find_value(tr, find_sql_column(columns,
"storage"), rid);
+ v = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"dimnr"), rid);
+ c->dimnr = *(int *)v; _DELETE(v);
+ v = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"repeats1"), rid);
+ c->lvl1_repeatsNum = *(int *)v; _DELETE(v);
+ v = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"repeats2"), rid);
+ c->lvl2_repeatsNum = *(int *)v; _DELETE(v);
+ v = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"umin"), rid);
+ c->unbounded_min = *(bit *)v; _DELETE(v);
+ v = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"umax"), rid);
+ c->unbounded_max = *(bit *)v; _DELETE(v);
+ c->storage_type = NULL;
+ st = table_funcs.column_find_value(tr, find_sql_column(dimensions,
"storage"), rid);
if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), st) != 0)
- dim->storage_type = st;
+ c->storage_type = st;
else
_DELETE(st);
- dim->t = t;
- if (isArray(dim->t))
- store_funcs.create_dim(tr, dim);
- dim->dcount = 0;
+ c->t = t;
+
+
+ //query the ranges for the dimensions
+ range_dimension_id = find_sql_column(ranges, "dimension_id");
+ //get the rowids in ranges that are relevant to the dimension
+ rs = table_funcs.rids_select(tr, range_dimension_id, &c->base.id,
&c->base.id, NULL);
+
+ //iterate over the rs and find the ranges that are relevant to this
dimension
+ for(rng_rid = table_funcs.rids_next(rs); rng_rid != oid_nil; rng_rid =
table_funcs.rids_next(rs)) {
+ char *name = NULL, *value = NULL;
+ sql_subtype rangeType;
+
+ v = table_funcs.column_find_value(tr, find_sql_column(ranges,
"name"), rng_rid);
+ name = (char *)v;
+
+ tpe = table_funcs.column_find_value(tr, find_sql_column(ranges,
"type"), rng_rid);
+ v = table_funcs.column_find_value(tr, find_sql_column(ranges,
"type_digits"), rng_rid);
+ sz = *(int *)v; _DELETE(v);
+ v = table_funcs.column_find_value(tr, find_sql_column(ranges,
"type_scale"), rng_rid);
+ d = *(int *)v; _DELETE(v);
+ if (!sql_find_subtype(&rangeType, tpe, sz, d))
+ sql_init_subtype(&rangeType, sql_trans_bind_type(tr,
t->s, tpe), sz, d);
+ _DELETE(tpe);
+
+ v = table_funcs.column_find_value(tr, find_sql_column(ranges,
"value"), rng_rid);
+ value = (char *)v;
+
+ if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), name) != 0) {
//this should always be true
+ char *min = "min";
+ char *max = "max";
+ char *step = "step";
+ char *def = "def";
+
+ if(!strcmp(name, min))
+ c->min = atom_general(tr->sa, &rangeType,
value);
+ else if(!strcmp(name, step))
+ c->step = atom_general(tr->sa, &rangeType,
value);
+ else if(!strcmp(name, max))
+ c->max = atom_general(tr->sa, &rangeType,
value);
+ else if(!strcmp(name, def))
+ c->def = atom_general(tr->sa, &rangeType,
value);
+ }
+ _DELETE(name);
+ }
+
+// if (isArray(c->t))
+// store_funcs.create_col(tr, c);
if (bs_debug)
- fprintf(stderr, "#\t\tload column %s\n", dim->base.name);
-
- return dim;
-}*/
+ fprintf(stderr, "#\t\tload dimension %s\n", c->base.name);
+
+
+ return c;
+}
static void
load_table_parts(sql_trans *tr, sql_table *t, oid rid)
@@ -690,6 +714,7 @@ load_table(sql_trans *tr, sql_schema *s,
t->sz = COLSIZE;
cs_new(&t->columns, tr->sa, (fdestroy) &column_destroy);
+ cs_new(&t->dimensions, tr->sa, NULL);
cs_new(&t->idxs, tr->sa, (fdestroy) &idx_destroy);
cs_new(&t->keys, tr->sa, (fdestroy) &key_destroy);
cs_new(&t->triggers, tr->sa, (fdestroy) &trigger_destroy);
@@ -711,10 +736,24 @@ load_table(sql_trans *tr, sql_schema *s,
rs = table_funcs.rids_select(tr, column_table_id, &t->base.id,
&t->base.id, NULL);
rs = table_funcs.rids_orderby(tr, rs, column_number);
- for(rid = table_funcs.rids_next(rs); rid != oid_nil; rid =
table_funcs.rids_next(rs))
+ for(rid = table_funcs.rids_next(rs); rid != oid_nil; rid =
table_funcs.rids_next(rs))
cs_add(&t->columns, load_column(tr, t, rid), TR_OLD);
table_funcs.rids_destroy(rs);
+ if(isArray(t)) {
+ sql_table *dimensions = find_sql_table(syss, "_dimensions");
+ sql_column *dimension_table_id, *dimension_number;
+
+ dimension_table_id = find_sql_column(dimensions, "table_id");
+ dimension_number = find_sql_column(dimensions, "dimnr");
+ rs = table_funcs.rids_select(tr, dimension_table_id,
&t->base.id, &t->base.id, NULL);
+ rs = table_funcs.rids_orderby(tr, rs, dimension_number);
+
+ for(rid = table_funcs.rids_next(rs); rid != oid_nil; rid =
table_funcs.rids_next(rs))
+ cs_add(&t->dimensions, load_dimension(tr, t, rid),
TR_OLD);
+ table_funcs.rids_destroy(rs);
+ }
+
if (!isKindOfTable(t))
return t;
@@ -1545,7 +1584,7 @@ store_init(int debug, store_type store,
bootstrap_create_column(tr, t, "type_digits", "int", 32);
bootstrap_create_column(tr, t, "type_scale", "int", 32);
bootstrap_create_column(tr, t, "table_id", "int", 32);
- bootstrap_create_column(tr, t, "column_id", "int", 32);
+ bootstrap_create_column(tr, t, "dimension_id", "int", 32);
bootstrap_create_column(tr, t, "value", "varchar", 2048);
t = bootstrap_create_table(tr, s, "keys");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list