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