lib/conceptql/operators/numeric.rb in conceptql-0.2.0 vs lib/conceptql/operators/numeric.rb in conceptql-0.3.0
- old
+ new
@@ -10,44 +10,63 @@
#
# Accepts two params:
# - Either a number value or a symbol representing a column name
# - An optional stream
class Numeric < PassThru
+ register __FILE__
+
desc <<-EOF
-Represents a operator that will either:
-- create a value_as_number value for every person in the database
-- change the value_as_number value for every every result passed in
- - either to a number
- - or a value from a column in the origin row
+Represents an operator that will either:
+- Create a value_as_number value for every person in the database
+- Change the value_as_number value for every result passed in
+ - Either to a number
+ - Or a value from a column in the origin row
Accepts two params:
- Either a number value or a symbol representing a column name
- An optional stream
EOF
argument :value, type: :float
allows_one_upstream
+ validate_at_most_one_upstream
+ validate_one_argument
+ default_query_columns
+ require_column :value_as_number
+ def query_cols
+ dynamic_columns - [:value_as_number] + [:value_as_number]
+ end
+
def query(db)
stream.nil? ? as_criterion(db) : with_kids(db)
end
- def types
+ def domains(db)
stream.nil? ? [:person] : super
end
private
def with_kids(db)
db.from(stream.evaluate(db))
- .select(*(COLUMNS - [:value_as_number]))
- .select_append(Sequel.lit('?', arguments.first).cast(Float).as(:value_as_number))
+ .select(*(dynamic_columns - [:value_as_number]))
+ .select_append(first_argument.cast(Float).as(:value_as_number))
.from_self
end
def as_criterion(db)
- db.from(select_it(db.from(:person), :person))
- .select(*(COLUMNS - [:value_as_number]))
- .select_append(Sequel.lit('?', arguments.first).cast(Float).as(:value_as_number))
+ db.from(select_it(db.from(:person).clone(:force_columns=>table_columns(:person)), :person))
+ .select(*(dynamic_columns - [:value_as_number]))
+ .select_append(first_argument.cast(Float).as(:value_as_number))
.from_self
+ end
+
+ def first_argument
+ case arguments.first
+ when String
+ Sequel.identifier(arguments.first)
+ else
+ Sequel.expr(arguments.first)
+ end
end
end
end
end