1/* -*- c-basic-offset: 2 -*- */
2/*
3 Copyright(C) 2015-2016 Brazil
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License version 2.1 as published by the Free Software Foundation.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17*/
18
19#pragma once
20
21#include "../grn.h"
22
23#include "ts_buf.h"
24#include "ts_expr.h"
25#include "ts_expr_node.h"
26#include "ts_op.h"
27#include "ts_str.h"
28#include "ts_types.h"
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
34typedef struct {
35 grn_obj *src_table; /* The source table of a bridge (no ref. count). */
36 grn_obj *dest_table; /* The destination table of a bridge. */
37 size_t n_nodes; /* The stack depth (position) of a bridge. */
38} grn_ts_expr_bridge;
39
40typedef struct {
41 grn_obj *table; /* Associated table. */
42 grn_obj *curr_table; /* Current table (no ref. count). */
43 grn_ts_expr_node **nodes; /* Node stack. */
44 size_t n_nodes; /* Number of nodes (stack depth). */
45 size_t max_n_nodes; /* Maximum number of nodes (stack capacity). */
46 grn_ts_expr_bridge *bridges; /* Bridges to subexpressions. */
47 size_t n_bridges; /* Number of bridges (subexpression depth). */
48 size_t max_n_bridges; /* Max. number (capacity) of bridges. */
49} grn_ts_expr_builder;
50
51/* grn_ts_expr_builder_open() creates an expression builder. */
52grn_rc grn_ts_expr_builder_open(grn_ctx *ctx, grn_obj *table,
53 grn_ts_expr_builder **builder);
54
55/* grn_ts_expr_builder_close() destroys an expression builder. */
56grn_rc grn_ts_expr_builder_close(grn_ctx *ctx, grn_ts_expr_builder *builder);
57
58/* grn_ts_expr_builder_complete() completes an expression. */
59grn_rc grn_ts_expr_builder_complete(grn_ctx *ctx, grn_ts_expr_builder *builder,
60 grn_ts_expr **expr);
61
62/* grn_ts_expr_builder_clear() clears the internal states. */
63grn_rc grn_ts_expr_builder_clear(grn_ctx *ctx, grn_ts_expr_builder *builder);
64
65/* grn_ts_expr_builder_push_name() pushes a named object. */
66grn_rc grn_ts_expr_builder_push_name(grn_ctx *ctx,
67 grn_ts_expr_builder *builder,
68 grn_ts_str name);
69
70/*
71 * grn_ts_expr_builder_push_obj() pushes an object.
72 *
73 * Acceptable objects are as follows:
74 * - Consts
75 * - GRN_BULK: GRN_DB_*.
76 * - GRN_UVECTOR: GRN_DB_* except GRN_DB_[SHORT/LONG_]TEXT.
77 * - GRN_VECTOR: GRN_DB_[SHORT/LONG_]TEXT.
78 * - Columns
79 * - GRN_ACCESSOR: _id, _score, _key, _value, and columns.
80 * - GRN_COLUMN_FIX_SIZE: GRN_DB_* except GRN_DB_[SHORT/LONG_]TEXT.
81 * - GRN_COLUMN_VAR_SIZE: GRN_DB_[SHORT/LONG_]TEXT.
82 */
83grn_rc grn_ts_expr_builder_push_obj(grn_ctx *ctx, grn_ts_expr_builder *builder,
84 grn_obj *obj);
85
86/* grn_ts_expr_builder_push_id() pushes "_id". */
87grn_rc grn_ts_expr_builder_push_id(grn_ctx *ctx, grn_ts_expr_builder *builder);
88
89/* grn_ts_expr_builder_push_score() pushes "_score". */
90grn_rc grn_ts_expr_builder_push_score(grn_ctx *ctx,
91 grn_ts_expr_builder *builder);
92
93/* grn_ts_expr_builder_push_key() pushes "_key". */
94grn_rc grn_ts_expr_builder_push_key(grn_ctx *ctx,
95 grn_ts_expr_builder *builder);
96
97/* grn_ts_expr_builder_push_value() pushes "_value". */
98grn_rc grn_ts_expr_builder_push_value(grn_ctx *ctx,
99 grn_ts_expr_builder *builder);
100
101/* grn_ts_expr_builder_push_const() pushes a const. */
102grn_rc grn_ts_expr_builder_push_const(grn_ctx *ctx,
103 grn_ts_expr_builder *builder,
104 grn_ts_data_kind kind,
105 grn_ts_data_type type,
106 grn_ts_any value);
107
108/* grn_ts_expr_builder_push_column() pushes a column. */
109grn_rc grn_ts_expr_builder_push_column(grn_ctx *ctx,
110 grn_ts_expr_builder *builder,
111 grn_obj *column);
112
113/* grn_ts_expr_builder_push_op() pushes an operator. */
114grn_rc grn_ts_expr_builder_push_op(grn_ctx *ctx, grn_ts_expr_builder *builder,
115 grn_ts_op_type op_type);
116
117/* grn_ts_expr_builder_begin_subexpr() begins a subexpression. */
118grn_rc grn_ts_expr_builder_begin_subexpr(grn_ctx *ctx,
119 grn_ts_expr_builder *builder);
120
121/* grn_ts_expr_builder_end_subexpr() ends a subexpression. */
122grn_rc grn_ts_expr_builder_end_subexpr(grn_ctx *ctx,
123 grn_ts_expr_builder *builder);
124
125#ifdef __cplusplus
126}
127#endif
128
129