void test_column_create(gconstpointer data) { const gchar *expected; table_create("Blog", 0, NULL, NULL); column_create(gcut_data_get_string(data, "table"), gcut_data_get_string(data, "name"), gcut_data_get_uint(data, "flags"), gcut_data_get_string(data, "type_name"), gcut_data_get_string(data, "source")); expected = gcut_data_get_string(data, "expected"); cut_assert_equal_string( cut_take_printf("table_create Blog TABLE_HASH_KEY\n%s", expected), send_command("dump")); }
void test_vector_column(gconstpointer data) { const gchar *expected; grn_id id, type_id; grn_obj vector; grn_obj *elements; grn_obj *table, *column; const gchar *type_name; type_name = gcut_data_get_string(data, "type_name"); type_id = grn_obj_id(context, get_object(type_name)); table = table_create("Table", GRN_OBJ_TABLE_NO_KEY, NULL, NULL); grn_test_assert_context(context); column = column_create("Table", "Column", GRN_OBJ_COLUMN_VECTOR, type_name, NULL); grn_test_assert_context(context); id = grn_table_add(context, table, NULL, 0, NULL); grn_test_assert_context(context); cut_assert_equal_int(1, id); elements = construct_elements(data); GRN_TEXT_INIT(&vector, GRN_OBJ_VECTOR); grn_vector_add_element(context, &vector, GRN_TEXT_VALUE(&elements[0]), GRN_TEXT_LEN(&elements[0]), 0, type_id); grn_vector_add_element(context, &vector, GRN_TEXT_VALUE(&elements[1]), GRN_TEXT_LEN(&elements[1]), 0, type_id); grn_vector_add_element(context, &vector, GRN_TEXT_VALUE(&elements[2]), GRN_TEXT_LEN(&elements[2]), 0, type_id); grn_obj_set_value(context, column, id, &vector, GRN_OBJ_SET); expected = cut_take_printf("table_create Table TABLE_NO_KEY\n" "column_create Table Column COLUMN_VECTOR %s\n" "load --table Table\n" "[\n" "[\"_id\",\"Column\"],\n" "[1,%s]\n" "]", type_name, gcut_data_get_string(data, "expected")); cut_assert_equal_string(expected, send_command("dump")); GRN_OBJ_FIN(context, &vector); }
column_ref_t *column_add(column_ref_t **stack, char* name, char* alias, table_t *table) { column_ref_t *ret = column_create(name,alias,table); if (*stack) { int i = 0; column_ref_t *s = *stack; while (s->next) { i++; s = s->next; } s->next = ret; }else{ *stack = ret; } return ret; }
/* find a column in a table referenced in a result */ column_ref_t *column_find(char* str, result_t *r) { char* tbl = NULL; char* col; char* rdup; char* tmp; char* c; nvp_t *n; int t_i = 0; int r_i = 0; table_ref_t *t = NULL; table_t *tab = NULL; int l; column_ref_t *ret = NULL; column_ref_t *cl; if (!str || !r) { error(r,CSVDB_ERROR_COLUMNREF,str); return NULL; } l = strlen(str); rdup = alloca(l+1); strcpy(rdup,str); if ((col = strchr(rdup,'.'))) { *col = 0; col++; tbl = rdup; }else{ col = rdup; } if (!col || !col[0]) { error(r,CSVDB_ERROR_COLUMNREF,str); return NULL; } if (tbl) { if (tbl[0] == '`' && (tmp = strchr(tbl+1,'`')) && !tmp[1]) { tbl++; *tmp = 0; } t = r->table; if (strcasecmp(tbl,"FILE")) { while (t) { if (!strcmp(tbl,t->alias) || nvp_search(t->t->name,tbl)) break; t_i++; t = t->next; } } if (!t) { error(r,CSVDB_ERROR_TABLEREF,str); return NULL; } } if (col[0] == '`' && (tmp = strchr(col+1,'`')) && !tmp[1]) { col++; *tmp = 0; } if (!strcmp(col,"*")) { if (t) { tab = t->t; n = tab->columns; while (n) { cl = column_add(&ret,n->value,NULL,tab); cl->r_index = r_i++; cl->t_index = t_i; n = n->next; } }else{ t = r->table; t_i = 0; while (t) { n = t->t->columns; r_i = 0; while (n) { cl = column_add(&ret,n->value,NULL,t->t); cl->r_index = r_i++; cl->t_index = t_i; n = n->next; } t_i++; t = t->next; } } return ret; } if (!t) { t = r->table; t_i = 0; while (t) { if (nvp_searchi(t->t->columns,col) > -1) { tab = t->t; break; } t_i++; t = t->next; } }else{ t_i = 0; tab = t->t; } if (tab) { l = nvp_searchi(tab->columns,col); if (l < 0) { if ((tmp = strchr(col,'('))) { *tmp = 0; if (!strcasecmp(col,"COLUMN")) { *tmp = '('; c = strchr(tmp+1,')'); if (c) { *c = 0; l = atoi(tmp+1); *c = ')'; l--; if (t) { n = nvp_grabi(t->t->columns,l); if (!n) { char bf[50]; sprintf(bf,"COLUMN(%d)",l); error(r,CSVDB_ERROR_OUTOFRANGE,bf); return NULL; } return column_find(n->value,r); }else if (!r->table->next) { n = nvp_grabi(r->table->t->columns,l); if (!n) { char bf[50]; sprintf(bf,"COLUMN(%d)",l); error(r,CSVDB_ERROR_OUTOFRANGE,bf); return NULL; } return column_find(n->value,r); } } } *tmp = '('; } } if (l > -1) { n = nvp_grabi(tab->columns,l); ret = column_create(n->value,NULL,tab); ret->t_index = t_i; ret->r_index = l; return ret; } } error(r,CSVDB_ERROR_COLUMNREF,str); return NULL; }