Class: Ferret::Search::Spans::SpanOrQuery

Summary

SpanOrQuery is just like a BooleanQuery with all +:should+ clauses. However, the difference is that all sub-clauses must be SpanQueries and the resulting query can then be used within other SpanQueries like SpanNearQuery.

Example

Combined with SpanNearQuery we can create a multi-PhraseQuery like query;

  quick_query = SpanOrQuery.new()
  quick_query << SpanTermQuery.new(:field, "quick")
  quick_query << SpanTermQuery.new(:field, "fast")
  quick_query << SpanTermQuery.new(:field, "speedy")

  colour_query = SpanOrQuery.new()
  colour_query << SpanTermQuery.new(:field, "red")
  colour_query << SpanTermQuery.new(:field, "brown")

  query = SpanNearQuery.new(:slop => 2, :in_order => true)
  query << quick_query
  query << colour_query
  query << SpanTermQuery.new(:field, "fox")
  # matches => "quick red speckled sleepy fox"
                            |______2______^
  # matches => "speedy brown speckled fox"
                                |__1__^
  # doesn't match => "brown fast _____ fox"
  #  not in order       ^_____2____|

NOTE

SpanOrQuery only works with other SpanQueries.

Public Class Methods


SpanOrQuery.new(options = {}) → query

Create a new SpanOrQuery. This is just like a BooleanQuery with all clauses with the occur value of :should. The difference is that it can be passed to other SpanQuerys like SpanNearQuery.

/*
 *  call-seq:
 *     SpanOrQuery.new(options = {}) -> query
 *
 *  Create a new SpanOrQuery. This is just like a BooleanQuery with all
 *  clauses with the occur value of :should. The difference is that it can be
 *  passed to other SpanQuerys like SpanNearQuery.
 */
static VALUE
frt_spanoq_init(int argc, VALUE *argv, VALUE self)
{
    Query *q;
    VALUE rclauses;

    q = spanoq_new();
    if (rb_scan_args(argc, argv, "01", &rclauses) > 0) {
        int i;
        Query *clause;
        Check_Type(rclauses, T_ARRAY);
        for (i = 0; i < RARRAY(rclauses)->len; i++) {
            Data_Get_Struct(RARRAY(rclauses)->ptr[i], Query, clause);
            spanoq_add_clause(q, clause);
        }
    }
    Frt_Wrap_Struct(self, &frt_spanoq_mark, &frt_q_free, q);
    object_add(q, self);
    return self;
}

Public Instance Methods


query.add(span_query) → self
query << span_query → self

Add a clause to the SpanOrQuery. Note that clauses must be SpanQueries, not other types of query.

/*
 *  call-seq:
 *     query.add(span_query) -> self
 *     query << span_query -> self
 *
 *  Add a clause to the SpanOrQuery. Note that clauses must be SpanQueries,
 *  not other types of query.
 */
static VALUE
frt_spanoq_add(VALUE self, VALUE rclause)
{
    GET_Q();
    Query *clause;
    Data_Get_Struct(rclause, Query, clause);
    spanoq_add_clause(q, clause);
    return self;
}

query.add(span_query) → self
query << span_query → self

Add a clause to the SpanOrQuery. Note that clauses must be SpanQueries, not other types of query.

/*
 *  call-seq:
 *     query.add(span_query) -> self
 *     query << span_query -> self
 *
 *  Add a clause to the SpanOrQuery. Note that clauses must be SpanQueries,
 *  not other types of query.
 */
static VALUE
frt_spanoq_add(VALUE self, VALUE rclause)
{
    GET_Q();
    Query *clause;
    Data_Get_Struct(rclause, Query, clause);
    spanoq_add_clause(q, clause);
    return self;
}