Exemple #1
0
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"));
}
Exemple #2
0
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);
}
Exemple #3
0
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;
}
Exemple #4
0
/* 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;
}