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