/* * call-seq: * phrase_query.add_term(term, position_increment = 1) -> phrase_query * phrase_query << term -> phrase_query * * Add a term to the phrase query. By default the position_increment is set * to 1 so each term you add is expected to come directly after the previous * term. By setting position_increment to 2 you are specifying that the term * you just added should occur two terms after the previous term. For * example; * * phrase_query.add_term("big").add_term("house", 2) * # matches => "big brick house" * # matches => "big red house" * # doesn't match => "big house" */ static VALUE frt_phq_add(int argc, VALUE *argv, VALUE self) { VALUE rterm, rpos_inc; int pos_inc = 1; GET_Q(); if (rb_scan_args(argc, argv, "11", &rterm, &rpos_inc) == 2) { pos_inc = FIX2INT(rpos_inc); } switch (TYPE(rterm)) { case T_STRING: { phq_add_term(q, StringValuePtr(rterm), pos_inc); break; } case T_ARRAY: { int i; char *t; if (RARRAY(rterm)->len < 1) { rb_raise(rb_eArgError, "Cannot add empty array to a " "PhraseQuery. You must add either a string or " "an array of strings"); } t = StringValuePtr(RARRAY(rterm)->ptr[0]); phq_add_term(q, t, pos_inc); for (i = 1; i < RARRAY(rterm)->len; i++) { t = StringValuePtr(RARRAY(rterm)->ptr[i]); phq_append_multi_term(q, t); } break; } default: rb_raise(rb_eArgError, "You can only add a string or an array of " "strings to a PhraseQuery, not a %s\n", RSTRING(rb_obj_as_string(rterm))->ptr); } return self; }