/*
* call-seq:
* Sort.new(sort_fields = [SortField::SCORE, SortField::DOC_ID], reverse = false) -> Sort
*
* Create a new Sort object. If +reverse+ is true, all sort_fields will be
* reversed so if any of them are already reversed the will be turned back
* to their natural order again. By default
*/
static VALUE
frt_sort_init(int argc, VALUE *argv, VALUE self)
{
int i;
VALUE rfields, rreverse;
bool reverse = false;
bool has_sfd = false;
GET_SORT();
switch (rb_scan_args(argc, argv, "02", &rfields, &rreverse)) {
case 2: reverse = RTEST(rreverse);
case 1:
if (TYPE(rfields) == T_ARRAY) {
int i;
for (i = 0; i < RARRAY(rfields)->len; i++) {
frt_sort_add(sort, RARRAY(rfields)->ptr[i], reverse);
}
} else {
frt_sort_add(sort, rfields, reverse);
}
for (i = 0; i < sort->size; i++) {
if (sort->sort_fields[i] == &SORT_FIELD_DOC) has_sfd = true;
}
if (!has_sfd) {
sort_add_sort_field(sort, (SortField *)&SORT_FIELD_DOC);
}
break;
case 0:
sort_add_sort_field(sort, (SortField *)&SORT_FIELD_SCORE);
sort_add_sort_field(sort, (SortField *)&SORT_FIELD_DOC);
}
return self;
}