blob: 5a1b640c25f425def495151c078cfb3b7c99fdcf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
module Groonga
class Table
def sort(keys, options={})
offset = options[:offset] || 0
limit = options[:limit] || -1
ensure_sort_keys(keys) do |sort_keys|
sorted = Array.create("", self)
begin
sort_raw(sort_keys, offset, limit, sorted)
rescue Exception
sorted.close
raise
end
sorted
end
end
def group(keys, result)
ensure_sort_keys(keys) do |sort_keys|
group_raw(sort_keys, result)
end
end
private
def ensure_sort_keys(keys)
if keys.is_a?(::Array) and keys.all? {|key| key.is_a?(TableSortKey)}
return yield(keys)
end
converted_keys = []
begin
keys = [keys] unless keys.is_a?(::Array)
sort_keys = keys.collect do |key|
ensure_sort_key(key, converted_keys)
end
yield(sort_keys)
ensure
converted_keys.each do |converted_key|
converted_key.close
end
end
end
def ensure_sort_key(key, converted_keys)
return key if key.is_a?(TableSortKey)
sort_key = TableSortKey.new
converted_keys << sort_key
key_name = nil
order = :ascending
offset = 0
if key.is_a?(::Hash)
key_name = key[:key]
order = key[:order] || order
offset = key[:offset] || offset
else
key_name = key
end
case key_name
when String
# Do nothing
when Symbol
key_name = key_name.to_s
else
message = "sort key name must be String or Symbol: " +
"#{key_name.inspect}: #{key.inspect}"
raise ArgumentError, message
end
if key_name.start_with?("-")
key_name[0] = ""
order = :descending
elsif key_name.start_with?("+")
key_name[0] = ""
end
sort_key.key = find_column(key_name)
if order == :ascending
sort_key.flags = Groonga::TableSortFlags::ASCENDING
else
sort_key.flags = Groonga::TableSortFlags::DESCENDING
end
sort_key.offset = offset
sort_key
end
end
end
|