diff options
Diffstat (limited to 'storage/mroonga/vendor/groonga/lib/mrb/scripts/table.rb')
-rw-r--r-- | storage/mroonga/vendor/groonga/lib/mrb/scripts/table.rb | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/storage/mroonga/vendor/groonga/lib/mrb/scripts/table.rb b/storage/mroonga/vendor/groonga/lib/mrb/scripts/table.rb index 5a1b640c25f..75c918949f0 100644 --- a/storage/mroonga/vendor/groonga/lib/mrb/scripts/table.rb +++ b/storage/mroonga/vendor/groonga/lib/mrb/scripts/table.rb @@ -1,5 +1,26 @@ module Groonga class Table + include Enumerable + include Indexable + + def columns + context = Context.instance + column_ids.collect do |id| + context[id] + end + end + + def each + flags = + TableCursorFlags::ASCENDING | + TableCursorFlags::BY_ID + TableCursor.open(self, :flags => flags) do |cursor| + cursor.each do |id| + yield(id) + end + end + end + def sort(keys, options={}) offset = options[:offset] || 0 limit = options[:limit] || -1 @@ -21,7 +42,32 @@ module Groonga end end + def apply_window_function(output_column, + window_function_call, + options={}) + ensure_sort_keys_accept_nil(options[:sort_keys]) do |sort_keys| + ensure_sort_keys_accept_nil(options[:group_keys]) do |group_keys| + window_definition = WindowDefinition.new + begin + window_definition.sort_keys = sort_keys + window_definition.group_keys = group_keys + apply_window_function_raw(output_column, + window_definition, + window_function_call) + ensure + window_definition.close + end + end + end + end + private + def ensure_sort_keys_accept_nil(keys, &block) + return yield(nil) if keys.nil? + + ensure_sort_keys(keys, &block) + end + def ensure_sort_keys(keys) if keys.is_a?(::Array) and keys.all? {|key| key.is_a?(TableSortKey)} return yield(keys) @@ -77,7 +123,15 @@ module Groonga key_name[0] = "" end - sort_key.key = find_column(key_name) + key = find_column(key_name) + if key.nil? + table_name = name || "(temporary)" + message = "unknown key: #{key_name.inspect}: " + message << "#{table_name}(#{size})" + raise ArgumentError, message + end + + sort_key.key = key if order == :ascending sort_key.flags = Groonga::TableSortFlags::ASCENDING else |