1 /*
2    +----------------------------------------------------------------------+
3    | Copyright (c) The PHP Group                                          |
4    +----------------------------------------------------------------------+
5    | This source file is subject to version 3.01 of the PHP license,      |
6    | that is bundled with this package in the file LICENSE, and is        |
7    | available through the world-wide-web at the following url:           |
8    | http://www.php.net/license/3_01.txt                                  |
9    | If you did not receive a copy of the PHP license and are unable to   |
10    | obtain it through the world-wide-web, please send a note to          |
11    | license@php.net so we can mail you a copy immediately.               |
12    +----------------------------------------------------------------------+
13    | Authors:                                                             |
14    |          Israel Ekpo <iekpo@php.net>                                 |
15    |          Omar Shaban <omars@php.net>                                 |
16    +----------------------------------------------------------------------+
17 */
18 
19 #include "php_solr.h"
20 
21 /* extern function_entry; */
22 
23 zend_class_entry *solr_ce_SolrDixMaxQuery;
24 
25 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_zero_arg_info, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0)
26 ZEND_END_ARG_INFO()
27 
28 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_addQueryField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1)
29 ZEND_ARG_INFO(0, field)
30 ZEND_ARG_INFO(0, boost)
31 ZEND_END_ARG_INFO()
32 
33 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery__construct_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 0)
34 ZEND_ARG_INFO(0, q)
35 ZEND_END_ARG_INFO()
36 
37 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery__queryAlt_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1)
38 ZEND_ARG_INFO(0, q)
39 ZEND_END_ARG_INFO()
40 
41 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_remove_field_arg, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1)
42 ZEND_ARG_INFO(0, field)
43 ZEND_END_ARG_INFO()
44 
45 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_addPhraseField_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2)
46 ZEND_ARG_INFO(0, field)
47 ZEND_ARG_INFO(0, boost)
48 ZEND_ARG_INFO(0, slop)
49 ZEND_END_ARG_INFO()
50 
51 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_addBoostQuery_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 2)
52 ZEND_ARG_INFO(0, field)
53 ZEND_ARG_INFO(0, value)
54 ZEND_ARG_INFO(0, boost)
55 ZEND_END_ARG_INFO()
56 
57 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setPhraseSlop_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1)
58 ZEND_ARG_INFO(0, slop)
59 ZEND_END_ARG_INFO()
60 
61 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setBoostFunction_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1)
62 ZEND_ARG_INFO(0, function)
63 ZEND_END_ARG_INFO()
64 
65 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setMinimumMatch_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1)
66 ZEND_ARG_INFO(0, value)
67 ZEND_END_ARG_INFO()
68 
69 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setTieBreaker_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1)
70 ZEND_ARG_INFO(0, tieBreaker)
71 ZEND_END_ARG_INFO()
72 
73 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setFields_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1)
74 ZEND_ARG_INFO(0, fields)
75 ZEND_END_ARG_INFO()
76 
77 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_uf_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1)
78 ZEND_ARG_INFO(0, field)
79 ZEND_END_ARG_INFO()
80 
81 ZEND_BEGIN_ARG_INFO_EX(SolrDisMaxQuery_setufs_args, SOLR_ARG_PASS_REMAINING_BY_REF_FALSE, SOLR_METHOD_RETURN_REFERENCE_FALSE, 1)
82 ZEND_ARG_INFO(0, fields)
83 ZEND_END_ARG_INFO()
84 
85 static zend_function_entry solr_dismax_query_methods[] = {
86     PHP_ME(SolrDisMaxQuery, __construct, SolrDisMaxQuery__construct_args, ZEND_ACC_PUBLIC)
87     PHP_ME(SolrDisMaxQuery, setQueryAlt, SolrDisMaxQuery__queryAlt_args, ZEND_ACC_PUBLIC)
88 
89     PHP_ME(SolrDisMaxQuery, addQueryField, SolrDisMaxQuery_addQueryField_args, ZEND_ACC_PUBLIC)
90     PHP_ME(SolrDisMaxQuery, removeQueryField, SolrDisMaxQuery_remove_field_arg, ZEND_ACC_PUBLIC)
91 
92     PHP_ME(SolrDisMaxQuery, addPhraseField, SolrDisMaxQuery_addPhraseField_args, ZEND_ACC_PUBLIC)
93     PHP_ME(SolrDisMaxQuery, removePhraseField, SolrDisMaxQuery_remove_field_arg, ZEND_ACC_PUBLIC)
94     PHP_ME(SolrDisMaxQuery, setPhraseFields, SolrDisMaxQuery_setFields_args, ZEND_ACC_PUBLIC)
95 
96 
97     PHP_ME(SolrDisMaxQuery, setPhraseSlop, SolrDisMaxQuery_setPhraseSlop_args, ZEND_ACC_PUBLIC)
98     PHP_ME(SolrDisMaxQuery, setQueryPhraseSlop, SolrDisMaxQuery_setPhraseSlop_args, ZEND_ACC_PUBLIC)
99     PHP_ME(SolrDisMaxQuery, setBoostQuery, SolrDisMaxQuery__queryAlt_args   , ZEND_ACC_PUBLIC)
100     PHP_ME(SolrDisMaxQuery, addBoostQuery, SolrDisMaxQuery_addBoostQuery_args, ZEND_ACC_PUBLIC)
101     PHP_ME(SolrDisMaxQuery, removeBoostQuery, SolrDisMaxQuery_remove_field_arg, ZEND_ACC_PUBLIC)
102     PHP_ME(SolrDisMaxQuery, setBoostFunction, SolrDisMaxQuery_setBoostFunction_args, ZEND_ACC_PUBLIC)
103     PHP_ME(SolrDisMaxQuery, setMinimumMatch, SolrDisMaxQuery_setMinimumMatch_args, ZEND_ACC_PUBLIC)
104     PHP_ME(SolrDisMaxQuery, setTieBreaker, SolrDisMaxQuery_setTieBreaker_args, ZEND_ACC_PUBLIC)
105 
106     PHP_ME(SolrDisMaxQuery, useDisMaxQueryParser, SolrDisMaxQuery_zero_arg_info, ZEND_ACC_PUBLIC)
107     PHP_ME(SolrDisMaxQuery, useEDisMaxQueryParser, SolrDisMaxQuery_zero_arg_info, ZEND_ACC_PUBLIC)
108 
109     PHP_ME(SolrDisMaxQuery, setBigramPhraseFields, SolrDisMaxQuery_setFields_args, ZEND_ACC_PUBLIC)
110     PHP_ME(SolrDisMaxQuery, addBigramPhraseField, SolrDisMaxQuery_addPhraseField_args, ZEND_ACC_PUBLIC)
111     PHP_ME(SolrDisMaxQuery, removeBigramPhraseField, SolrDisMaxQuery_remove_field_arg, ZEND_ACC_PUBLIC)
112     PHP_ME(SolrDisMaxQuery, setBigramPhraseSlop, SolrDisMaxQuery_setPhraseSlop_args, ZEND_ACC_PUBLIC)
113 
114     PHP_ME(SolrDisMaxQuery, setTrigramPhraseFields, SolrDisMaxQuery_setFields_args, ZEND_ACC_PUBLIC)
115     PHP_ME(SolrDisMaxQuery, addTrigramPhraseField, SolrDisMaxQuery_addPhraseField_args, ZEND_ACC_PUBLIC)
116     PHP_ME(SolrDisMaxQuery, removeTrigramPhraseField, SolrDisMaxQuery_remove_field_arg, ZEND_ACC_PUBLIC)
117     PHP_ME(SolrDisMaxQuery, setTrigramPhraseSlop, SolrDisMaxQuery_setPhraseSlop_args, ZEND_ACC_PUBLIC)
118 
119     PHP_ME(SolrDisMaxQuery, addUserField, SolrDisMaxQuery_uf_args, ZEND_ACC_PUBLIC)
120     PHP_ME(SolrDisMaxQuery, removeUserField, SolrDisMaxQuery_uf_args, ZEND_ACC_PUBLIC)
121     PHP_ME(SolrDisMaxQuery, setUserFields, SolrDisMaxQuery_setufs_args, ZEND_ACC_PUBLIC)
122 
123     PHP_FE_END
124 };
125 
init_solr_dismax_query(void)126 void init_solr_dismax_query(void){
127     zend_class_entry ce;
128     INIT_CLASS_ENTRY(ce, "SolrDisMaxQuery", solr_dismax_query_methods);
129     solr_ce_SolrDixMaxQuery = zend_register_internal_class_ex(
130             &ce,
131             solr_ce_SolrQuery
132     );
133 }
134 
135 /* {{{ proto SolrQuery::__construct([string q])
136    Constructor for SolrDisMaxQuery */
PHP_METHOD(SolrDisMaxQuery,__construct)137 PHP_METHOD(SolrDisMaxQuery, __construct)
138 {
139     zval *param_value = NULL;
140     solr_char_t *deftype_param_name = "defType", *deftype_param_value = SOLR_DISMAX_DEFAULT_PARSER;
141     COMPAT_ARG_SIZE_T deftype_param_name_len = strlen("defType"),
142             deftype_param_value_len = strlen(SOLR_DISMAX_DEFAULT_PARSER);
143 
144     if(zend_parse_parameters(ZEND_NUM_ARGS(), "|z", &param_value) == FAILURE){
145             php_error_docref(NULL, E_ERROR, "Invalid parameters");
146             RETURN_NULL();
147     }
148     if(param_value == NULL){
149         zend_call_method_with_0_params(OBJ_FOR_PROP(getThis()), solr_ce_SolrDixMaxQuery, &solr_ce_SolrDixMaxQuery->parent->constructor, "__construct", NULL);
150     }else{
151         zend_call_method_with_1_params(OBJ_FOR_PROP(getThis()), solr_ce_SolrDixMaxQuery, &solr_ce_SolrDixMaxQuery->parent->constructor, "__construct", NULL, param_value);
152     }
153     solr_add_or_set_normal_param(
154             getThis(),
155             deftype_param_name,
156             deftype_param_name_len,
157             deftype_param_value,
158             deftype_param_value_len,
159             0
160     );
161 }
162 /* }}} */
163 
164 /* {{{ proto SolrQuery::useDisMaxQueryParser()
165    Switch Query Parser to dismax */
PHP_METHOD(SolrDisMaxQuery,useDisMaxQueryParser)166 PHP_METHOD(SolrDisMaxQuery, useDisMaxQueryParser)
167 {
168     solr_char_t *param_name = "defType", *param_value = "dismax";
169     COMPAT_ARG_SIZE_T param_name_len = strlen("defType"), param_value_len = strlen("dismax"), result=1;
170 
171     result = solr_add_or_set_normal_param(
172             getThis(),
173             param_name,
174             param_name_len,
175             param_value,
176             param_value_len,
177             0
178     );
179 
180     if(result != SUCCESS)
181     {
182         RETURN_NULL();
183     }
184     SOLR_RETURN_THIS();
185 }
186 /* }}} */
187 
188 /* {{{ proto SolrQuery::useDisMaxQueryParser()
189    Switch Query Parser to edismax */
PHP_METHOD(SolrDisMaxQuery,useEDisMaxQueryParser)190 PHP_METHOD(SolrDisMaxQuery, useEDisMaxQueryParser)
191 {
192     solr_char_t *pname = "defType", *param_value = "edismax";
193     COMPAT_ARG_SIZE_T pname_len = strlen("defType"), param_value_len = strlen("edismax"), result=1;
194 
195     result = solr_add_or_set_normal_param(
196             getThis(),
197             pname,
198             pname_len,
199             param_value,
200             param_value_len,
201             0
202     );
203 
204     if(result != SUCCESS)
205     {
206         RETURN_NULL();
207     }
208     SOLR_RETURN_THIS();
209 }
210 /* }}} */
211 
212 /* {{{ proto SolrQuery::setQueryAlt(string q)
213    SetQueryAlt uses q.alt if the q param is not defined */
PHP_METHOD(SolrDisMaxQuery,setQueryAlt)214 PHP_METHOD(SolrDisMaxQuery, setQueryAlt)
215 {
216     solr_char_t *pname = "q.alt";
217     COMPAT_ARG_SIZE_T pname_len = sizeof("q.alt")-1;
218     solr_char_t *param_value = NULL;
219     COMPAT_ARG_SIZE_T param_value_len = 0, set_param_return = 0;
220 
221     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &param_value, &param_value_len) == FAILURE){
222         php_error_docref(NULL, E_ERROR, "Invalid parameters");
223         RETURN_NULL();
224     }
225 
226     set_param_return = solr_add_or_set_normal_param(getThis(), pname, pname_len, param_value, param_value_len, 0);
227     if(set_param_return == FAILURE)
228     {
229         RETURN_NULL();
230     }
231     SOLR_RETURN_THIS();
232 }
233 /* }}} */
234 
235 /* {{{ proto SolrQuery::addQueryField(string field[, bool boost])
236    SetQueryAlt uses q.alt if the q param is not defined */
PHP_METHOD(SolrDisMaxQuery,addQueryField)237 PHP_METHOD(SolrDisMaxQuery, addQueryField) {
238     solr_char_t *pname = "qf";
239     COMPAT_ARG_SIZE_T pname_len = sizeof("qf")-1;
240     solr_char_t *boost_str = NULL;
241     solr_char_t *field_name = NULL;
242     COMPAT_ARG_SIZE_T field_name_len = 0;
243     int add_result = 0;
244     solr_char_t *delimiter = " ";
245     solr_char_t *separator = "^";
246     solr_char_t *separator_override="";
247     zval * boost = NULL;
248     int boost_len = 0;
249 
250     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s|z", &field_name, &field_name_len, &boost) == FAILURE)
251     {
252         php_error_docref(NULL, E_ERROR, "Invalid parameters");
253         RETURN_NULL();
254     }
255 
256     if(boost != NULL)
257     {
258         convert_to_string(boost);
259         boost_str = Z_STRVAL_P(boost);
260         boost_len = Z_STRLEN_P(boost);
261         add_result = solr_add_arg_list_param(
262                 getThis(), pname, pname_len, field_name, field_name_len,
263                 boost_str, boost_len, *delimiter, *separator
264         );
265     }else{
266         boost_str = "";
267         add_result = solr_add_arg_list_param_ex(
268                         getThis(), pname, pname_len, field_name, field_name_len,
269                         boost_str, boost_len, *delimiter, *separator, *separator_override
270         );
271     }
272 
273     if(add_result == FAILURE)
274     {
275         RETURN_NULL();
276     }
277 
278     SOLR_RETURN_THIS();
279 }
280 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::removeQueryField(string field)
281    Removes a sort field from the sort parameter. */
PHP_METHOD(SolrDisMaxQuery,removeQueryField)282 PHP_METHOD(SolrDisMaxQuery, removeQueryField)
283 {
284     solr_char_t *pname = (solr_char_t*) "qf";
285     COMPAT_ARG_SIZE_T pname_len = sizeof("qf")-1;
286     solr_char_t *field_name = NULL;
287     COMPAT_ARG_SIZE_T field_name_len = 0;
288 
289     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE)
290     {
291         php_error_docref(NULL, E_WARNING, "Invalid parameters");
292         RETURN_NULL();
293     }
294     solr_delete_arg_list_param_value(
295             getThis(), pname, pname_len, field_name, field_name_len
296     );
297     SOLR_RETURN_THIS();
298 }
299 /* }}} */
300 
301 /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::addPhraseField(string field, float boost [, float slop])
302  * Adds a new phrase field
303  */
PHP_METHOD(SolrDisMaxQuery,addPhraseField)304 PHP_METHOD(SolrDisMaxQuery, addPhraseField)
305 {
306     solr_char_t *pname = (solr_char_t*) "pf";
307     COMPAT_ARG_SIZE_T pname_len = sizeof("pf")-1;
308     solr_char_t *field_name = NULL;
309     COMPAT_ARG_SIZE_T field_name_len = 0;
310     zval *boost = NULL;
311     zval *slop = NULL;
312     solr_char_t *boost_str = NULL;
313     solr_char_t *slop_str = NULL;
314     int add_result = 0;
315     char * separator = "^";
316     solr_char_t * delimiter_override = "";
317     solr_string_t boost_slop_buffer;
318 
319     if(zend_parse_parameters(ZEND_NUM_ARGS(), "sz|z", &field_name, &field_name_len, &boost, &slop) == FAILURE)
320     {
321         php_error_docref(NULL, E_WARNING, "Invalid parameters");
322         RETURN_NULL();
323     }
324 
325     if(boost != NULL)
326     {
327         convert_to_string(boost);
328         boost_str = Z_STRVAL_P(boost);
329     }
330 
331     if (slop != NULL) {
332         convert_to_string(slop);
333         slop_str = Z_STRVAL_P(slop);
334     }
335 
336     if (slop != NULL && boost !=NULL)
337     {
338         delimiter_override = "~";
339         memset(&boost_slop_buffer, 0, sizeof(solr_string_t));
340         solr_string_appends(&boost_slop_buffer, (solr_char_t *)slop_str , Z_STRLEN_P(slop));
341         solr_string_appendc(&boost_slop_buffer, '^');
342         solr_string_appends(&boost_slop_buffer, boost_str , Z_STRLEN_P(boost));
343         add_result = solr_add_arg_list_param_ex(
344                     getThis(), pname, pname_len, field_name, field_name_len,
345                     boost_slop_buffer.str, boost_slop_buffer.len, ' ', *separator,
346                     *delimiter_override
347         );
348 
349         solr_string_free(&boost_slop_buffer);
350     } else {
351         add_result = solr_add_arg_list_param(
352                     getThis(), pname, pname_len, field_name, field_name_len,
353                     boost_str, Z_STRLEN_P(boost),' ',*separator
354 
355         );
356     }
357 
358     if(add_result == FAILURE)
359     {
360         RETURN_NULL();
361     }
362 
363     SOLR_RETURN_THIS();
364 }
365 /* }}} */
366 
367 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::removeQueryField(string field)
368    Removes a phrase field from pf. */
PHP_METHOD(SolrDisMaxQuery,removePhraseField)369 PHP_METHOD(SolrDisMaxQuery, removePhraseField)
370 {
371     solr_char_t *pname = (solr_char_t*) "pf";
372     COMPAT_ARG_SIZE_T pname_len = sizeof("pf")-1;
373     solr_char_t *field_name = NULL;
374     COMPAT_ARG_SIZE_T field_name_len = 0;
375 
376     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE)
377     {
378         php_error_docref(NULL, E_WARNING, "Invalid parameters");
379         RETURN_NULL();
380     }
381     solr_delete_arg_list_param_value(
382             getThis(), pname, pname_len, field_name, field_name_len
383     );
384     SOLR_RETURN_THIS();
385 }
386 /* }}} */
387 
388 /* {{{ proto SolrQuery::setPhraseFields(string fields)
389    setPhraseFields uses pf parameter */
PHP_METHOD(SolrDisMaxQuery,setPhraseFields)390 PHP_METHOD(SolrDisMaxQuery, setPhraseFields)
391 {
392     solr_char_t *pname = "pf";
393     COMPAT_ARG_SIZE_T pname_len = sizeof("pf")-1;
394     int add_result = -1;
395     solr_char_t *pvalue = NULL;
396     COMPAT_ARG_SIZE_T pvalue_len = 0;
397     solr_param_t *param = NULL;
398     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE)
399     {
400         php_error_docref(NULL, E_WARNING, "Invalid parameters");
401         RETURN_NULL();
402     }
403 
404     /* if the parameter is registered with a different type, remove it first */
405     if(solr_param_find(getThis(), pname, pname_len, &param) == SUCCESS && param->type != SOLR_PARAM_TYPE_NORMAL)
406     {
407         php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname);
408         solr_delete_solr_parameter(getThis(), pname, pname_len);
409     }
410 
411     add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0);
412 
413     if(add_result == FAILURE)
414     {
415         php_error_docref(NULL, E_WARNING, "Unable to add parameter %s", pname);
416         RETURN_NULL();
417     }
418 
419     SOLR_RETURN_THIS();
420 }
421 /* }}} */
422 
423 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::setPhraseSlop(integer slop)
424    sets Phrase Slop ps argument. */
PHP_METHOD(SolrDisMaxQuery,setPhraseSlop)425 PHP_METHOD(SolrDisMaxQuery, setPhraseSlop)
426 {
427     solr_char_t *pname = (solr_char_t*) "ps";
428     COMPAT_ARG_SIZE_T pname_len = sizeof("ps")-1;
429     int add_result = -1;
430     solr_char_t *pvalue = NULL;
431     COMPAT_ARG_SIZE_T pvalue_len = 0;
432 
433     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE)
434     {
435         php_error_docref(NULL, E_WARNING, "Invalid parameters");
436         RETURN_NULL();
437     }
438     add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0);
439 
440     if(add_result == FAILURE)
441     {
442         php_error_docref(NULL, E_WARNING, "Invalid parameter value");
443         RETURN_NULL();
444     }
445     SOLR_RETURN_THIS();
446 }
447 /* }}} */
448 
449 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::setQueryPhraseSlop(integer slop)
450    sets QueryPhrase Slop qs argument. */
PHP_METHOD(SolrDisMaxQuery,setQueryPhraseSlop)451 PHP_METHOD(SolrDisMaxQuery, setQueryPhraseSlop)
452 {
453     solr_char_t *pname = (solr_char_t*) "qs";
454     COMPAT_ARG_SIZE_T pname_len = sizeof("qs")-1;
455     int add_result = -1;
456     solr_char_t *pvalue = NULL;
457     COMPAT_ARG_SIZE_T pvalue_len = 0;
458 
459     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE)
460     {
461         php_error_docref(NULL, E_WARNING, "Invalid parameters");
462         RETURN_NULL();
463     }
464     add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0);
465 
466     if(add_result == FAILURE)
467     {
468         php_error_docref(NULL, E_WARNING, "Invalid parameter value");
469         RETURN_NULL();
470     }
471     SOLR_RETURN_THIS();
472 }
473 /* }}} */
474 
475 
476 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::setBoostQuery(string q)
477    sets Boost Query bq parameter. */
PHP_METHOD(SolrDisMaxQuery,setBoostQuery)478 PHP_METHOD(SolrDisMaxQuery, setBoostQuery)
479 {
480     solr_char_t *pname = (solr_char_t*) "bq";
481     COMPAT_ARG_SIZE_T pname_len = sizeof("bq")-1;
482     int add_result = -1;
483     solr_char_t *pvalue = NULL;
484     COMPAT_ARG_SIZE_T pvalue_len = 0;
485     solr_param_t *param = NULL;
486     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE)
487     {
488         php_error_docref(NULL, E_WARNING, "Invalid parameters");
489         RETURN_NULL();
490     }
491 
492     /* if the parameter is registered with a different type, remove it first */
493     if(solr_param_find(getThis(), pname, pname_len, &param) == SUCCESS && param->type != SOLR_PARAM_TYPE_NORMAL)
494     {
495         php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname);
496         solr_delete_solr_parameter(getThis(), pname, pname_len);
497     }
498 
499     add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0);
500 
501     if(add_result == FAILURE)
502     {
503         php_error_docref(NULL, E_WARNING, "Unable to add parameter %s", pname);
504         RETURN_NULL();
505     }
506 
507     SOLR_RETURN_THIS();
508 }
509 /* }}} */
510 
511 /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::addBoostQueryField(string field, string value [, float boost])
512  * Adds a new boost query field using the bq parameter
513  */
PHP_METHOD(SolrDisMaxQuery,addBoostQuery)514 PHP_METHOD(SolrDisMaxQuery, addBoostQuery)
515 {
516     solr_char_t *pname = (solr_char_t*) "bq";
517     COMPAT_ARG_SIZE_T pname_len = sizeof("bq")-1;
518     solr_char_t *field_name = NULL;
519     COMPAT_ARG_SIZE_T field_name_len = 0;
520     zval *boost = NULL;
521     solr_char_t *field_value = NULL;
522     COMPAT_ARG_SIZE_T field_value_len = 0;
523     solr_char_t *boost_str = NULL;
524     int add_result = 0;
525     char * separator = ":";
526     solr_char_t *boost_separator = "^";
527     solr_string_t *value_boost_str = NULL;
528     solr_param_t *param = NULL;
529 
530     if(zend_parse_parameters(ZEND_NUM_ARGS(), "ss|z", &field_name, &field_name_len, &field_value, &field_value_len, &boost) == FAILURE)
531     {
532         php_error_docref(NULL, E_WARNING, "Invalid parameters");
533         RETURN_NULL();
534     }
535 
536     /* if the parameter is registered with a different type, remove it first */
537     if(solr_param_find(getThis(), pname, pname_len, &param) == SUCCESS && param->type != SOLR_PARAM_TYPE_ARG_LIST)
538     {
539         php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname);
540         solr_delete_solr_parameter(getThis(), pname, pname_len);
541     }
542 
543     if(boost != NULL)
544     {
545         convert_to_string(boost);
546         boost_str = Z_STRVAL_P(boost);
547     }
548 
549     if(boost !=NULL)
550     {
551         value_boost_str = emalloc(sizeof(solr_string_t));
552         memset(value_boost_str, 0, sizeof(solr_string_t));
553         solr_string_appends(value_boost_str, field_value, field_value_len);
554         solr_string_appendc(value_boost_str, *boost_separator);
555         solr_string_appends(value_boost_str, boost_str, Z_STRLEN_P(boost));
556 
557         add_result = solr_add_arg_list_param(
558                             getThis(),pname, pname_len, field_name, field_name_len,
559                             value_boost_str->str, value_boost_str->len,' ',*separator
560 
561         );
562         solr_string_free(value_boost_str);
563         efree(value_boost_str);
564     }else{
565         add_result = solr_add_arg_list_param(
566                     getThis(),pname, pname_len, field_name, field_name_len,
567                     field_value, field_value_len,' ',*separator
568 
569         );
570     }
571 
572     if(add_result == FAILURE)
573     {
574         RETURN_NULL();
575     }
576 
577     SOLR_RETURN_THIS();
578 }
579 /* }}} */
580 
581 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::removeBoostQuery(string field)
582    Removes a sort field from the sort parameter. */
PHP_METHOD(SolrDisMaxQuery,removeBoostQuery)583 PHP_METHOD(SolrDisMaxQuery, removeBoostQuery)
584 {
585     solr_char_t *pname = (solr_char_t*) "bq";
586     COMPAT_ARG_SIZE_T pname_len = sizeof("bq")-1;
587     solr_char_t *field_name = NULL;
588     COMPAT_ARG_SIZE_T field_name_len = 0;
589 
590     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE)
591     {
592         php_error_docref(NULL, E_WARNING, "Invalid parameters");
593         RETURN_NULL();
594     }
595     solr_delete_arg_list_param_value(
596             getThis(), pname, pname_len, field_name, field_name_len
597     );
598     SOLR_RETURN_THIS();
599 }
600 /* }}} */
601 
602 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::setBoostFunction(string function)
603    sets Boost Query bf parameter. */
PHP_METHOD(SolrDisMaxQuery,setBoostFunction)604 PHP_METHOD(SolrDisMaxQuery, setBoostFunction)
605 {
606     solr_char_t *pname = (solr_char_t*) "bf";
607     COMPAT_ARG_SIZE_T pname_len = sizeof("bf")-1;
608     int add_result = -1;
609     solr_char_t *pvalue = NULL;
610     COMPAT_ARG_SIZE_T pvalue_len = 0;
611 
612     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE)
613     {
614         php_error_docref(NULL, E_WARNING, "Invalid parameters");
615         RETURN_NULL();
616     }
617 
618     add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0);
619 
620     if(add_result == FAILURE)
621     {
622         php_error_docref(NULL, E_WARNING, "Unable to add parameter %s", pname);
623         RETURN_NULL();
624     }
625 
626     SOLR_RETURN_THIS();
627 }
628 /* }}} */
629 
630 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::setMinimumMatch(string value)
631    sets Minimum Match (mm) parameter. */
PHP_METHOD(SolrDisMaxQuery,setMinimumMatch)632 PHP_METHOD(SolrDisMaxQuery, setMinimumMatch)
633 {
634     solr_char_t *pname = (solr_char_t*) "mm";
635     COMPAT_ARG_SIZE_T pname_len = sizeof("mm")-1;
636     int add_result = -1;
637     solr_char_t *pvalue = NULL;
638     COMPAT_ARG_SIZE_T pvalue_len = 0;
639 
640     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE)
641     {
642         php_error_docref(NULL, E_WARNING, "Invalid parameters");
643         RETURN_NULL();
644     }
645 
646     add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0);
647 
648     if(add_result == FAILURE)
649     {
650         php_error_docref(NULL, E_WARNING, "Unable to add parameter %s", pname);
651         RETURN_NULL();
652     }
653 
654     SOLR_RETURN_THIS();
655 }
656 /* }}} */
657 
658 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::setTieBreaker(float tieBreaker)
659    sets Tie Breaker (tie) parameter. */
PHP_METHOD(SolrDisMaxQuery,setTieBreaker)660 PHP_METHOD(SolrDisMaxQuery, setTieBreaker)
661 {
662     solr_char_t *pname = (solr_char_t*) "tie";
663     COMPAT_ARG_SIZE_T pname_len = sizeof("tie")-1;
664     int add_result = -1;
665     solr_char_t *pvalue = NULL;
666     COMPAT_ARG_SIZE_T pvalue_len = 0;
667 
668     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE)
669     {
670         php_error_docref(NULL, E_WARNING, "Invalid parameters");
671         RETURN_NULL();
672     }
673 
674     add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0);
675 
676     if(add_result == FAILURE)
677     {
678         php_error_docref(NULL, E_WARNING, "Unable to add parameter %s", pname);
679         RETURN_NULL();
680     }
681 
682     SOLR_RETURN_THIS();
683 }
684 /* }}} */
685 
686 /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setBigramPhraseFields(string bigramFields)
687    setBigramPhraseFields uses pf2 parameter */
PHP_METHOD(SolrDisMaxQuery,setBigramPhraseFields)688 PHP_METHOD(SolrDisMaxQuery, setBigramPhraseFields)
689 {
690     solr_char_t *pname = "pf2";
691     COMPAT_ARG_SIZE_T pname_len = sizeof("pf2")-1;
692     solr_char_t *param_value = NULL;
693     COMPAT_ARG_SIZE_T param_value_len = 0;
694     int set_param_return = 0;
695     solr_param_t *param = NULL;
696 
697     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &param_value, &param_value_len) == FAILURE){
698         php_error_docref(NULL, E_ERROR, "Invalid parameters");
699         RETURN_NULL();
700     }
701 
702     /* if the parameter is registered with a different type, remove it first */
703     if(solr_param_find(getThis(), pname, pname_len, &param) == SUCCESS && param->type != SOLR_PARAM_TYPE_NORMAL)
704     {
705         php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname);
706         solr_delete_solr_parameter(getThis(), pname, pname_len);
707     }
708 
709     set_param_return = solr_add_or_set_normal_param(getThis(), pname, pname_len, param_value, param_value_len, 0);
710     if(set_param_return == FAILURE)
711     {
712         RETURN_NULL();
713     }
714     SOLR_RETURN_THIS();
715 }
716 /* }}} */
717 
718 
719 /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::addBigramPhraseField(string field, float boost [, float slop])
720  * Adds a new bigram phrase field (pf2) to the list of fields
721  */
PHP_METHOD(SolrDisMaxQuery,addBigramPhraseField)722 PHP_METHOD(SolrDisMaxQuery, addBigramPhraseField)
723 {
724     solr_char_t *field_name = NULL;
725     COMPAT_ARG_SIZE_T field_name_len = 0;
726     zval *boost = NULL;
727     zval *slop = NULL;
728     int add_result = 0;
729 
730     if(zend_parse_parameters(ZEND_NUM_ARGS(), "sz|z", &field_name, &field_name_len, &boost, &slop) == FAILURE)
731     {
732         php_error_docref(NULL, E_WARNING, "Invalid parameters");
733         RETURN_NULL();
734     }
735     add_result = add_phrase_field(getThis(), "pf2", boost, slop, field_name, field_name_len);
736 
737     if(add_result == FAILURE)
738     {
739         RETURN_NULL();
740     }
741 
742     SOLR_RETURN_THIS();
743 }
744 /* }}} */
745 
746 
747 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::removeQueryField(string field)
748    Removes a bigram phrase field. */
PHP_METHOD(SolrDisMaxQuery,removeBigramPhraseField)749 PHP_METHOD(SolrDisMaxQuery, removeBigramPhraseField)
750 {
751     solr_char_t *pname = (solr_char_t*) "pf2";
752     COMPAT_ARG_SIZE_T pname_len = sizeof("pf2")-1;
753     solr_char_t *field_name = NULL;
754     COMPAT_ARG_SIZE_T field_name_len = 0;
755 
756     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE)
757     {
758         php_error_docref(NULL, E_WARNING, "Invalid parameters");
759         RETURN_NULL();
760     }
761     solr_delete_arg_list_param_value(
762             getThis(), pname, pname_len, field_name, field_name_len
763     );
764     SOLR_RETURN_THIS();
765 }
766 /* }}} */
767 
768 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::setBigramPhraseSlop(integer slop)
769    sets Bigram Phrase Slop ps argument. */
PHP_METHOD(SolrDisMaxQuery,setBigramPhraseSlop)770 PHP_METHOD(SolrDisMaxQuery, setBigramPhraseSlop)
771 {
772     solr_char_t *pname = (solr_char_t*) "ps2";
773     COMPAT_ARG_SIZE_T pname_len = sizeof("ps2")-1;
774     int add_result = -1;
775     solr_char_t *pvalue = NULL;
776     COMPAT_ARG_SIZE_T pvalue_len = 0;
777 
778     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE)
779     {
780         php_error_docref(NULL, E_WARNING, "Invalid parameters");
781         RETURN_NULL();
782     }
783     add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0);
784 
785     if(add_result == FAILURE)
786     {
787         php_error_docref(NULL, E_WARNING, "Invalid parameter value");
788         RETURN_NULL();
789     }
790     SOLR_RETURN_THIS();
791 }
792 /* }}} */
793 
794 
795 /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setTrigramPhraseFields(string fields)
796    setTrigramPhraseFields uses pf3 parameter */
PHP_METHOD(SolrDisMaxQuery,setTrigramPhraseFields)797 PHP_METHOD(SolrDisMaxQuery, setTrigramPhraseFields)
798 {
799     solr_char_t *pname = "pf3";
800     COMPAT_ARG_SIZE_T pname_len = sizeof("pf3")-1;
801     solr_char_t *param_value = NULL;
802     COMPAT_ARG_SIZE_T param_value_len = 0;
803     int set_param_return = 0;
804     solr_param_t *param = NULL;
805 
806     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &param_value, &param_value_len) == FAILURE){
807         php_error_docref(NULL, E_ERROR, "Invalid parameters");
808         RETURN_NULL();
809     }
810 
811     /* if the parameter is registered with a different type, remove it first */
812     if(solr_param_find(getThis(), pname, pname_len, &param) == SUCCESS && param->type != SOLR_PARAM_TYPE_NORMAL)
813     {
814         php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname);
815         solr_delete_solr_parameter(getThis(), pname, pname_len);
816     }
817 
818     set_param_return = solr_add_or_set_normal_param(getThis(), pname, pname_len, param_value, param_value_len, 0);
819     if(set_param_return == FAILURE)
820     {
821         RETURN_NULL();
822     }
823     SOLR_RETURN_THIS();
824 }
825 /* }}} */
826 
827 
828 /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::addTrigramPhraseField(string field, float boost [, float slop])
829  * Adds a new trigram phrase field (pf3) to the list of fields
830  */
PHP_METHOD(SolrDisMaxQuery,addTrigramPhraseField)831 PHP_METHOD(SolrDisMaxQuery, addTrigramPhraseField)
832 {
833     solr_char_t *field_name = NULL;
834     COMPAT_ARG_SIZE_T field_name_len = 0;
835     zval *boost = NULL;
836     zval *slop = NULL;
837     int add_result = 0;
838 
839     if(zend_parse_parameters(ZEND_NUM_ARGS(), "sz|z", &field_name, &field_name_len, &boost, &slop) == FAILURE)
840     {
841         php_error_docref(NULL, E_WARNING, "Invalid parameters");
842         RETURN_NULL();
843     }
844     add_result = add_phrase_field(getThis(), "pf3", boost, slop, field_name, field_name_len);
845 
846     if(add_result == FAILURE)
847     {
848         RETURN_NULL();
849     }
850 
851     SOLR_RETURN_THIS();
852 }
853 /* }}} */
854 
855 
856 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::removeQueryField(string field)
857    Removes a trigram phrase field. */
PHP_METHOD(SolrDisMaxQuery,removeTrigramPhraseField)858 PHP_METHOD(SolrDisMaxQuery, removeTrigramPhraseField)
859 {
860     solr_char_t *pname = (solr_char_t*) "pf3";
861     COMPAT_ARG_SIZE_T pname_len = sizeof("pf3")-1;
862     solr_char_t *field_name = NULL;
863     COMPAT_ARG_SIZE_T field_name_len = 0;
864 
865     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE)
866     {
867         php_error_docref(NULL, E_WARNING, "Invalid parameters");
868         RETURN_NULL();
869     }
870     solr_delete_arg_list_param_value(
871             getThis(), pname, pname_len, field_name, field_name_len
872     );
873     SOLR_RETURN_THIS();
874 }
875 /* }}} */
876 
877 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::setTrigramPhraseSlop(integer slop)
878    sets Trigram Phrase Slop ps3 argument. */
PHP_METHOD(SolrDisMaxQuery,setTrigramPhraseSlop)879 PHP_METHOD(SolrDisMaxQuery, setTrigramPhraseSlop)
880 {
881     solr_char_t *pname = (solr_char_t*) "ps3";
882     COMPAT_ARG_SIZE_T pname_len = sizeof("ps3")-1;
883     int add_result = -1;
884     solr_char_t *pvalue = NULL;
885     COMPAT_ARG_SIZE_T pvalue_len = 0;
886 
887     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE)
888     {
889         php_error_docref(NULL, E_WARNING, "Invalid parameters");
890         RETURN_NULL();
891     }
892     add_result = solr_add_or_set_normal_param(getThis(), pname, pname_len, pvalue, pvalue_len, 0);
893 
894     if(add_result == FAILURE)
895     {
896         php_error_docref(NULL, E_WARNING, "Invalid parameter value");
897         RETURN_NULL();
898     }
899     SOLR_RETURN_THIS();
900 }
901 /* }}} */
902 
903 
904 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::addUserField(string field)
905    Adds a userfield rule to uf parameter. */
PHP_METHOD(SolrDisMaxQuery,addUserField)906 PHP_METHOD(SolrDisMaxQuery, addUserField)
907 {
908     solr_char_t *pname = (solr_char_t*) "uf";
909     COMPAT_ARG_SIZE_T pname_len = sizeof("uf")-1;
910     int add_result = -1;
911     solr_char_t *pvalue = NULL;
912     COMPAT_ARG_SIZE_T pvalue_len = 0;
913 
914     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &pvalue, &pvalue_len) == FAILURE)
915     {
916         php_error_docref(NULL, E_WARNING, "Invalid parameters");
917         RETURN_NULL();
918     }
919     add_result = solr_add_simple_list_param_ex(getThis(), pname, pname_len, pvalue, pvalue_len, " ");
920 
921     if(add_result == FAILURE)
922     {
923         php_error_docref(NULL, E_WARNING, "Unable to add user field: Invalid parameter value");
924         RETURN_NULL();
925     }
926     SOLR_RETURN_THIS();
927 }
928 /* }}} */
929 
930 /* {{{  proto SolrDisMaxQuery SolrDisMaxQuery::removeUserField(string field)
931    Removes a userfield rule from uf parameter. */
PHP_METHOD(SolrDisMaxQuery,removeUserField)932 PHP_METHOD(SolrDisMaxQuery, removeUserField)
933 {
934     solr_char_t *pname = (solr_char_t*) "uf";
935     COMPAT_ARG_SIZE_T pname_len = sizeof("uf")-1;
936     solr_char_t *field_name = NULL;
937     COMPAT_ARG_SIZE_T field_name_len = 0;
938 
939     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &field_name, &field_name_len) == FAILURE)
940     {
941         php_error_docref(NULL, E_WARNING, "Invalid parameters");
942         RETURN_NULL();
943     }
944 
945     solr_delete_simple_list_param_value(getThis(), pname, pname_len, field_name, field_name_len);
946 
947     SOLR_RETURN_THIS();
948 }
949 /* }}} */
950 
951 
952 /* {{{ proto SolrDisMaxQuery SolrDisMaxQuery::setUserFields(string fields)
953    Sets user fields (uf parameter) */
PHP_METHOD(SolrDisMaxQuery,setUserFields)954 PHP_METHOD(SolrDisMaxQuery, setUserFields)
955 {
956     solr_char_t *pname = "uf";
957     COMPAT_ARG_SIZE_T pname_len = sizeof("uf")-1;
958     solr_char_t *param_value = NULL;
959     COMPAT_ARG_SIZE_T param_value_len = 0;
960     int set_param_return = 0;
961     solr_param_t *param = NULL;
962 
963     if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &param_value, &param_value_len) == FAILURE){
964         php_error_docref(NULL, E_ERROR, "Invalid parameters");
965         RETURN_NULL();
966     }
967 
968     /* if the parameter is registered with a different type, remove it first */
969     if(solr_param_find(getThis(), pname, pname_len, &param) == SUCCESS && param->type != SOLR_PARAM_TYPE_NORMAL)
970     {
971         php_error_docref(NULL, E_NOTICE, "Parameter %s value(s) was overwritten by this call", pname);
972         solr_delete_solr_parameter(getThis(), pname, pname_len);
973     }
974 
975     set_param_return = solr_add_or_set_normal_param(getThis(), pname, pname_len, param_value, param_value_len, 0);
976     if(set_param_return == FAILURE)
977     {
978         RETURN_NULL();
979     }
980     SOLR_RETURN_THIS();
981 }
982 /* }}} */
983 
984 
add_phrase_field(zval * obj,solr_char_t * pname,zval * boost,zval * slop,solr_char_t * field_name,COMPAT_ARG_SIZE_T field_name_len)985 int add_phrase_field(zval *obj, solr_char_t *pname, zval *boost, zval *slop, solr_char_t *field_name, COMPAT_ARG_SIZE_T field_name_len)
986 {
987     COMPAT_ARG_SIZE_T pname_len = strlen(pname);
988     int add_result = 0;
989     solr_char_t *boost_str = NULL;
990     solr_char_t *slop_str = NULL;
991     char * separator = "^";
992     solr_char_t * delimiter_override = "";
993 
994     solr_string_t boost_slop_buffer;
995     if(boost != NULL)
996     {
997         convert_to_string(boost);
998         boost_str = Z_STRVAL_P(boost);
999     }
1000 
1001     if (slop != NULL) {
1002         convert_to_string(slop);
1003         slop_str = Z_STRVAL_P(slop);
1004     }
1005 
1006     if (slop != NULL && boost !=NULL)
1007     {
1008         delimiter_override = "~";
1009         memset(&boost_slop_buffer, 0, sizeof(solr_string_t));
1010         solr_string_appends(&boost_slop_buffer, (solr_char_t *)slop_str , Z_STRLEN_P(slop));
1011         solr_string_appendc(&boost_slop_buffer, '^');
1012         solr_string_appends(&boost_slop_buffer, boost_str , Z_STRLEN_P(boost));
1013         add_result = solr_add_arg_list_param_ex(
1014                 obj, pname, pname_len, field_name, field_name_len,
1015                 boost_slop_buffer.str, boost_slop_buffer.len, ' ', *separator,
1016                 *delimiter_override
1017         );
1018 
1019         solr_string_free(&boost_slop_buffer);
1020     } else {
1021         add_result = solr_add_arg_list_param(
1022                 obj, pname, pname_len, field_name, field_name_len,
1023                 boost_str, Z_STRLEN_P(boost),' ',*separator
1024 
1025         );
1026     }
1027     return add_result;
1028 }
1029