grn_rc grn_ts_expr_parse(grn_ctx *ctx, grn_obj *table, grn_ts_str str, grn_ts_expr **expr) { grn_rc rc; grn_ts_expr *new_expr; grn_ts_expr_parser *parser; if (!ctx) { return GRN_INVALID_ARGUMENT; } if (!table || !grn_ts_obj_is_table(ctx, table) || (!str.ptr && str.size) || !expr) { GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "invalid argument"); } rc = grn_ts_expr_parser_open(ctx, table, &parser); if (rc != GRN_SUCCESS) { return rc; } rc = grn_ts_expr_parser_parse(ctx, parser, str, &new_expr); grn_ts_expr_parser_close(ctx, parser); if (rc != GRN_SUCCESS) { return rc; } *expr = new_expr; return GRN_SUCCESS; }
/* grn_ts_writer_parse() parses output expressions. */ static grn_rc grn_ts_writer_parse(grn_ctx *ctx, grn_ts_writer *writer, grn_obj *table, grn_ts_str str) { grn_rc rc; grn_ts_str rest = str; rc = grn_ts_expr_parser_open(ctx, table, &writer->parser); for ( ; ; ) { grn_ts_str first = { NULL, 0 }; rc = grn_ts_expr_parser_split(ctx, writer->parser, rest, &first, &rest); if (rc != GRN_SUCCESS) { return (rc == GRN_END_OF_DATA) ? GRN_SUCCESS : rc; } if ((first.ptr[first.size - 1] == '*') && grn_ts_str_is_name_prefix((grn_ts_str){ first.ptr, first.size - 1 })) { rc = grn_ts_writer_expand(ctx, writer, table, first); if (rc != GRN_SUCCESS) { return rc; } } else if (grn_ts_str_is_key_name(first) && !grn_ts_table_has_key(ctx, table)) { /* * Skip _key if the table has no _key, because the default output_columns * option contains _key. */ GRN_TS_DEBUG("skip \"_key\" because the table has no _key"); } else { rc = grn_vector_add_element(ctx, &writer->name_buf, first.ptr, first.size, 0, GRN_DB_TEXT); if (rc != GRN_SUCCESS) { return rc; } } } return GRN_SUCCESS; }