Skip to content

Commit 4043593

Browse files
committed
PCBC-722: fix boolean search query encoding
Change-Id: I83da6e3f0deee83d7290653812dc41cbb47276c6 Reviewed-on: http://review.couchbase.org/c/php-couchbase/+/139409 Tested-by: Build Bot <[email protected]> Reviewed-by: Sergey Avseyev <[email protected]>
1 parent cdbc121 commit 4043593

File tree

2 files changed

+25
-100
lines changed

2 files changed

+25
-100
lines changed

src/couchbase/search/boolean_query.c

Lines changed: 22 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ static inline pcbc_boolean_search_query_t *pcbc_boolean_search_query_fetch_objec
4343
#define LOGARGS(lvl) LCB_LOG_##lvl, NULL, "pcbc/boolean_search_query", __FILE__, __LINE__
4444

4545
zend_class_entry *pcbc_boolean_search_query_ce;
46+
extern zend_class_entry *pcbc_disjunction_search_query_ce;
47+
extern zend_class_entry *pcbc_conjunction_search_query_ce;
4648

4749
/* {{{ proto void BooleanSearchQuery::__construct() */
4850
PHP_METHOD(BooleanSearchQuery, __construct)
@@ -75,46 +77,21 @@ PHP_METHOD(BooleanSearchQuery, boost)
7577
PHP_METHOD(BooleanSearchQuery, must)
7678
{
7779
pcbc_boolean_search_query_t *obj;
78-
#if PHP_VERSION_ID >= 70000
79-
zval *args = NULL;
80-
#else
81-
zval ***args = NULL;
82-
#endif
83-
int num_args = 0;
80+
zval *conjunct = NULL;
8481
int rv;
8582

86-
rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &num_args);
83+
rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &conjunct, pcbc_conjunction_search_query_ce);
8784
if (rv == FAILURE) {
8885
return;
8986
}
9087

9188
obj = Z_BOOLEAN_SEARCH_QUERY_OBJ_P(getThis());
9289

93-
PCBC_ZVAL_ALLOC(obj->must);
94-
array_init(PCBC_P(obj->must));
95-
96-
if (num_args && args) {
97-
int i;
98-
for (i = 0; i < num_args; ++i) {
99-
PCBC_ZVAL *query;
10090
#if PHP_VERSION_ID >= 70000
101-
query = &args[i];
91+
ZVAL_ZVAL(&obj->must, conjunct, 1, 0);
10292
#else
103-
query = args[i];
104-
#endif
105-
if (Z_TYPE_P(PCBC_P(*query)) != IS_OBJECT ||
106-
!instanceof_function(Z_OBJCE_P(PCBC_P(*query)), pcbc_search_query_part_ce TSRMLS_CC)) {
107-
pcbc_log(LOGARGS(WARN), "query has to implement SearchQueryPart interface (skipping argument #%d)", i);
108-
continue;
109-
}
110-
add_next_index_zval(PCBC_P(obj->must), PCBC_P(*query));
111-
PCBC_ADDREF_P(PCBC_P(*query));
112-
}
113-
}
114-
#if PHP_VERSION_ID < 70000
115-
if (args) {
116-
efree(args);
117-
}
93+
PCBC_ADDREF_P(disjunct);
94+
obj->must = conjunct;
11895
#endif
11996

12097
RETURN_ZVAL(getThis(), 1, 0);
@@ -125,46 +102,21 @@ PHP_METHOD(BooleanSearchQuery, must)
125102
PHP_METHOD(BooleanSearchQuery, mustNot)
126103
{
127104
pcbc_boolean_search_query_t *obj;
128-
#if PHP_VERSION_ID >= 70000
129-
zval *args = NULL;
130-
#else
131-
zval ***args = NULL;
132-
#endif
133-
int num_args = 0;
105+
zval *disjunct = NULL;
134106
int rv;
135107

136-
rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &num_args);
108+
rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &disjunct, pcbc_disjunction_search_query_ce);
137109
if (rv == FAILURE) {
138110
return;
139111
}
140112

141113
obj = Z_BOOLEAN_SEARCH_QUERY_OBJ_P(getThis());
142114

143-
PCBC_ZVAL_ALLOC(obj->must_not);
144-
array_init(PCBC_P(obj->must_not));
145-
146-
if (num_args && args) {
147-
int i;
148-
for (i = 0; i < num_args; ++i) {
149-
PCBC_ZVAL *query;
150115
#if PHP_VERSION_ID >= 70000
151-
query = &args[i];
116+
ZVAL_ZVAL(&obj->must_not, disjunct, 1, 0);
152117
#else
153-
query = args[i];
154-
#endif
155-
if (Z_TYPE_P(PCBC_P(*query)) != IS_OBJECT ||
156-
!instanceof_function(Z_OBJCE_P(PCBC_P(*query)), pcbc_search_query_part_ce TSRMLS_CC)) {
157-
pcbc_log(LOGARGS(WARN), "query has to implement SearchQueryPart interface (skipping argument #%d)", i);
158-
continue;
159-
}
160-
add_next_index_zval(PCBC_P(obj->must_not), PCBC_P(*query));
161-
PCBC_ADDREF_P(PCBC_P(*query));
162-
}
163-
}
164-
#if PHP_VERSION_ID < 70000
165-
if (args) {
166-
efree(args);
167-
}
118+
PCBC_ADDREF_P(disjunct);
119+
obj->must_not = disjunct;
168120
#endif
169121

170122
RETURN_ZVAL(getThis(), 1, 0);
@@ -175,48 +127,22 @@ PHP_METHOD(BooleanSearchQuery, mustNot)
175127
PHP_METHOD(BooleanSearchQuery, should)
176128
{
177129
pcbc_boolean_search_query_t *obj;
178-
#if PHP_VERSION_ID >= 70000
179-
zval *args = NULL;
180-
#else
181-
zval ***args = NULL;
182-
#endif
183-
int num_args = 0;
130+
zval *disjunct = NULL;
184131
int rv;
185132

186-
rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &num_args);
133+
rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &disjunct, pcbc_disjunction_search_query_ce);
187134
if (rv == FAILURE) {
188135
return;
189136
}
190137

191138
obj = Z_BOOLEAN_SEARCH_QUERY_OBJ_P(getThis());
192139

193-
PCBC_ZVAL_ALLOC(obj->should);
194-
array_init(PCBC_P(obj->should));
195-
196-
if (num_args && args) {
197-
int i;
198-
for (i = 0; i < num_args; ++i) {
199-
PCBC_ZVAL *query;
200140
#if PHP_VERSION_ID >= 70000
201-
query = &args[i];
141+
ZVAL_ZVAL(&obj->should, disjunct, 1, 0);
202142
#else
203-
query = args[i];
204-
#endif
205-
if (Z_TYPE_P(PCBC_P(*query)) != IS_OBJECT ||
206-
!instanceof_function(Z_OBJCE_P(PCBC_P(*query)), pcbc_search_query_part_ce TSRMLS_CC)) {
207-
pcbc_log(LOGARGS(WARN), "query has to implement SearchQueryPart interface (skipping argument #%d)", i);
208-
continue;
209-
}
210-
add_next_index_zval(PCBC_P(obj->should), PCBC_P(*query));
211-
PCBC_ADDREF_P(PCBC_P(*query));
212-
}
213-
}
214-
#if PHP_VERSION_ID < 70000
215-
if (args) {
216-
efree(args);
217-
}
143+
PCBC_ADDREF_P(disjunct);
144+
obj->should = disjunct;
218145
#endif
219-
220146
RETURN_ZVAL(getThis(), 1, 0);
221147
} /* }}} */
222148

@@ -258,18 +184,18 @@ ZEND_BEGIN_ARG_INFO_EX(ai_BooleanSearchQuery_boost, 0, 0, 1)
258184
ZEND_ARG_INFO(0, boost)
259185
ZEND_END_ARG_INFO()
260186

261-
ZEND_BEGIN_ARG_INFO_EX(ai_BooleanSearchQuery_queries, 0, 0, 1)
262-
PCBC_ARG_VARIADIC_INFO(0, queries)
187+
ZEND_BEGIN_ARG_INFO_EX(ai_BooleanSearchQuery_query, 0, 0, 1)
188+
ZEND_ARG_INFO(0, query)
263189
ZEND_END_ARG_INFO()
264190

265191
// clang-format off
266192
zend_function_entry boolean_search_query_methods[] = {
267193
PHP_ME(BooleanSearchQuery, __construct, ai_BooleanSearchQuery_none, ZEND_ACC_PRIVATE | ZEND_ACC_FINAL | ZEND_ACC_CTOR)
268194
PHP_ME(BooleanSearchQuery, jsonSerialize, ai_BooleanSearchQuery_none, ZEND_ACC_PUBLIC)
269195
PHP_ME(BooleanSearchQuery, boost, ai_BooleanSearchQuery_boost, ZEND_ACC_PUBLIC)
270-
PHP_ME(BooleanSearchQuery, must, ai_BooleanSearchQuery_queries, ZEND_ACC_PUBLIC)
271-
PHP_ME(BooleanSearchQuery, mustNot, ai_BooleanSearchQuery_queries, ZEND_ACC_PUBLIC)
272-
PHP_ME(BooleanSearchQuery, should, ai_BooleanSearchQuery_queries, ZEND_ACC_PUBLIC)
196+
PHP_ME(BooleanSearchQuery, must, ai_BooleanSearchQuery_query, ZEND_ACC_PUBLIC)
197+
PHP_ME(BooleanSearchQuery, mustNot, ai_BooleanSearchQuery_query, ZEND_ACC_PUBLIC)
198+
PHP_ME(BooleanSearchQuery, should, ai_BooleanSearchQuery_query, ZEND_ACC_PUBLIC)
273199
PHP_FE_END
274200
};
275201
// clang-format on

tests/SearchQueryTest.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@ function testInlineSearchQuery() {
2525
\Couchbase\SearchQuery::geoBoundingBox(1.0, 3.0, 4.0, 5.0),
2626
\Couchbase\SearchQuery::numericRange()->min(3)->max(42.5))->either(
2727
\Couchbase\SearchQuery::wildcard('user*')->field('type')))
28-
->mustNot(
29-
\Couchbase\SearchQuery::phrase('foo', 'bar', 'baz')->field('description'),
30-
\Couchbase\SearchQuery::regexp('user.*')->field('_class_name')
31-
)
28+
->mustNot(\Couchbase\SearchQuery::disjuncts(
29+
\Couchbase\SearchQuery::phrase('foo', 'bar', 'baz')->field('description'),
30+
\Couchbase\SearchQuery::regexp('user.*')->field('_class_name')))
3231
);
3332
$query
3433
->fields("foo", "bar", "baz")

0 commit comments

Comments
 (0)