lib/cql.rb in cql-1.0.1 vs lib/cql.rb in cql-1.1.0

- old
+ new

@@ -1,19 +1,17 @@ -if RUBY_VERSION < '1.9.2' - require 'backports/1.9.2/array/rotate' -end - require 'cuke_modeler' -require 'cql/dsl' +require 'cql/map_reduce' module CQL class Query include Dsl attr_reader :data, :what def format_data data + space_data + Array.new.tap do |result_array| data.each do |element| result_array << Hash.new.tap do |result| @what.each_with_index do |attribute, index| key = determine_key(attribute, index) @@ -32,15 +30,20 @@ @data = directory # Populate configurables from DSL block self.instance_eval(&block) + + raise(ArgumentError, "A query must specify a 'select' clause") unless @what + raise(ArgumentError, "A query must specify a 'from' clause") unless @from + + # Gather relevant objects from root object and filters - @data= CQL::MapReduce.gather_objects(@data, @from, @filters) + @data = CQL::MapReduce.gather_objects(@data, @from, @filters) # Extract properties from gathered objects - @data= format_output(@data) + @data = format_output(@data) end private @@ -48,20 +51,20 @@ def format_output(data) format_data(data) end def determine_key(attribute, index) - key = transform_stuff(@name_transforms, attribute, index) if @name_transforms + key = mapped_attribute(@name_transforms, attribute, index) if @name_transforms key || attribute end def determine_value(element, attribute, index) original_value = attribute.is_a?(Symbol) ? special_value(element, attribute) : element.send(attribute) if @value_transforms - value = transform_stuff(@value_transforms, attribute, index) + value = mapped_attribute(@value_transforms, attribute, index) value = value.call(original_value) if value.is_a?(Proc) end value || original_value end @@ -70,29 +73,73 @@ # todo - Not sure what other special values to have but this could be expanded upon later. case attribute when :self val = element else - # todo - error message? + raise(ArgumentError, ":#{attribute} is not a valid attribute for selection.") end val end - def transform_stuff(transforms, attribute, location) + def mapped_attribute(mappings, attribute, location) case - when transforms.is_a?(Array) - value = transforms[location] - when transforms.is_a?(Hash) - if transforms[attribute] - value = transforms[attribute].first - transforms[attribute].rotate! + when mappings.is_a?(Array) + value = mappings[location] + when mappings.is_a?(Hash) + if mappings[attribute] + value = mappings[attribute][location] end else # todo - add error message end value + end + + def space_data + space_renamings + space_transforms + end + + def space_renamings + if @name_transforms.is_a?(Hash) + new_names = {} + + @name_transforms.each_pair do |key, value| + new_names[key] = [] + + @what.each do |attribute| + if attribute == key + new_names[key] << value.shift + else + new_names[key] << nil + end + end + end + + @name_transforms = new_names + end + end + + def space_transforms + if @value_transforms.is_a?(Hash) + new_values = {} + + @value_transforms.each_pair do |key, value| + new_values[key] = [] + + @what.each do |attribute| + if attribute == key + new_values[key] << value.shift + else + new_values[key] << nil + end + end + end + + @value_transforms = new_values + end end end