/*
* call-seq:
* boolean_query.add_query(query, occur = :should) -> boolean_clause
* boolean_query.<<(query, occur = :should) -> boolean_clause
* boolean_query << boolean_clause -> boolean_clause
*
* Us this method to add sub-queries to a BooleanQuery. You can either add
* a straight Query or a BooleanClause. When adding a Query, the default
* occurrence requirement is :should. That is the Query's match will be
* scored but it isn't essential for a match. If the query should be
* essential, use :must. For exclusive queries use :must_not.
*
* When adding a Boolean clause to a BooleanQuery there is no need to set the
* occurrence property because it is already set in the BooleanClause.
* Therefor the +occur+ parameter will be ignored in this case.
*
* query:: Query to add to the BooleanQuery
* occur:: occurrence requirement for the query being added. Must be one of
* [:must, :should, :must_not]
* returns:: BooleanClause which was added
*/
static VALUE
frt_bq_add_query(int argc, VALUE *argv, VALUE self)
{
GET_Q();
VALUE rquery, roccur;
enum BC_TYPE occur = BC_SHOULD;
Query *sub_q;
VALUE klass;
if (rb_scan_args(argc, argv, "11", &rquery, &roccur) == 2) {
occur = frt_get_occur(roccur);
}
klass = CLASS_OF(rquery);
if (klass == cBooleanClause) {
BooleanClause *bc = (BooleanClause *)DATA_PTR(rquery);
if (argc > 1) {
rb_warning("Second argument to BooleanQuery#add is ignored "
"when adding BooleanClause");
}
bq_add_clause(q, bc);
return rquery;
} else if (TYPE(rquery) == T_DATA) {
Data_Get_Struct(rquery, Query, sub_q);
return frt_bc_wrap(bq_add_query(q, sub_q, occur));
} else {
rb_raise(rb_eArgError, "Cannot add %s to a BooleanQuery",
rb_class2name(klass));
}
return self;
}