/* * call-seq: * SpanNearQuery.new(options = {}) -> query * * Create a new SpanNearQuery. You can add an array of clauses with the * +:clause+ parameter or you can add clauses individually using the * SpanNearQuery#add method. * * query = SpanNearQuery.new(:clauses => [spanq1, spanq2, spanq3]) * # is equivalent to * query = SpanNearQuery.new() * query << spanq1 << spanq2 << spanq3 * * You have two other options which you can set. * * :slop:: Default: 0. Works exactly like a PhraseQuery slop. It is the * amount of slop allowed in the match (the term edit distance * allowed in the match). * :in_order:: Default: false. Specifies whether or not the matches have to * occur in the order they were added to the query. When slop is * set to 0, this parameter will make no difference. */ static VALUE frt_spannq_init(int argc, VALUE *argv, VALUE self) { Query *q; VALUE roptions; int slop = 0; bool in_order = false; if (rb_scan_args(argc, argv, "01", &roptions) > 0) { VALUE v; if (Qnil != (v = rb_hash_aref(roptions, sym_slop))) { slop = FIX2INT(v); } if (Qnil != (v = rb_hash_aref(roptions, sym_in_order))) { in_order = RTEST(v); } } q = spannq_new(slop, in_order); if (argc > 0) { VALUE v; if (Qnil != (v = rb_hash_aref(roptions, sym_clauses))) { int i; Query *clause; Check_Type(v, T_ARRAY); for (i = 0; i < RARRAY(v)->len; i++) { Data_Get_Struct(RARRAY(v)->ptr[i], Query, clause); spannq_add_clause(q, clause); } } } Frt_Wrap_Struct(self, &frt_spannq_mark, &frt_q_free, q); object_add(q, self); return self; }