/* * 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 Qnil; }