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