aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel/algebra/attributes/attribute.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/arel/algebra/attributes/attribute.rb')
-rw-r--r--lib/arel/algebra/attributes/attribute.rb304
1 files changed, 0 insertions, 304 deletions
diff --git a/lib/arel/algebra/attributes/attribute.rb b/lib/arel/algebra/attributes/attribute.rb
deleted file mode 100644
index 16124abcc4..0000000000
--- a/lib/arel/algebra/attributes/attribute.rb
+++ /dev/null
@@ -1,304 +0,0 @@
-require 'set'
-
-module Arel
- class TypecastError < StandardError ; end
- class Attribute
- attr_reader :relation, :name, :alias, :ancestor, :hash
- attr_reader :history, :root
-
- def initialize(relation, name, options = {})
- @relation = relation # this is actually a table (I think)
- @name = name
- @alias = options[:alias]
- @ancestor = options[:ancestor]
- @history = [self] + (@ancestor ? @ancestor.history : [])
- @root = @history.last
- @original_relation = nil
- @original_attribute = nil
-
- # FIXME: I think we can remove this eventually
- @hash = name.hash + root.relation.class.hash
- end
-
- def engine
- @relation.engine
- end
-
- def christener
- @relation.christener
- end
-
- def == other
- super ||
- Attribute === other &&
- @name == other.name &&
- @alias == other.alias &&
- @ancestor == other.ancestor &&
- @relation == other.relation
- end
-
- alias :eql? :==
-
- def named?(hypothetical_name)
- (@alias || name).to_s == hypothetical_name.to_s
- end
-
- def aggregation?
- false
- end
-
- def eval(row)
- row[self]
- end
-
- def as(aliaz = nil)
- Attribute.new(relation, name, :alias => aliaz, :ancestor => self)
- end
-
- def bind(new_relation)
- relation == new_relation ? self : Attribute.new(new_relation, name, :alias => @alias, :ancestor => self)
- end
-
- def to_attribute(relation)
- bind(relation)
- end
-
- def join?
- relation.join?
- end
-
- def root
- history.last
- end
-
- def original_relation
- @original_relation ||= original_attribute.relation
- end
-
- def original_attribute
- @original_attribute ||= history.detect { |a| !a.join? }
- end
-
- def find_correlate_in(relation)
- relation[self] || self
- end
-
- def descends_from?(other)
- history.include?(other)
- end
-
- def /(other)
- other ? (history & other.history).size : 0
- end
-
- PREDICATES = [
- :eq, :eq_any, :eq_all, :not_eq, :not_eq_any, :not_eq_all, :lt, :lt_any,
- :lt_all, :lteq, :lteq_any, :lteq_all, :gt, :gt_any, :gt_all, :gteq,
- :gteq_any, :gteq_all, :matches, :matches_any, :matches_all, :not_matches,
- :not_matches_any, :not_matches_all, :in, :in_any, :in_all, :not_in,
- :not_in_any, :not_in_all
- ]
-
- Predications = Class.new do
- def self.instance_methods *args
- warn "this module is deprecated, please use the PREDICATES constant"
- PREDICATES
- end
- end
-
- def eq(other)
- Predicates::Equality.new(self, other)
- end
-
- def eq_any(*others)
- Predicates::Any.build(Predicates::Equality, self, *others)
- end
-
- def eq_all(*others)
- Predicates::All.build(Predicates::Equality, self, *others)
- end
-
- def not_eq(other)
- Predicates::Inequality.new(self, other)
- end
-
- def not_eq_any(*others)
- Predicates::Any.build(Predicates::Inequality, self, *others)
- end
-
- def not_eq_all(*others)
- Predicates::All.build(Predicates::Inequality, self, *others)
- end
-
- def lt(other)
- Predicates::LessThan.new(self, other)
- end
-
- def lt_any(*others)
- Predicates::Any.build(Predicates::LessThan, self, *others)
- end
-
- def lt_all(*others)
- Predicates::All.build(Predicates::LessThan, self, *others)
- end
-
- def lteq(other)
- Predicates::LessThanOrEqualTo.new(self, other)
- end
-
- def lteq_any(*others)
- Predicates::Any.build(Predicates::LessThanOrEqualTo, self, *others)
- end
-
- def lteq_all(*others)
- Predicates::All.build(Predicates::LessThanOrEqualTo, self, *others)
- end
-
- def gt(other)
- Predicates::GreaterThan.new(self, other)
- end
-
- def gt_any(*others)
- Predicates::Any.build(Predicates::GreaterThan, self, *others)
- end
-
- def gt_all(*others)
- Predicates::All.build(Predicates::GreaterThan, self, *others)
- end
-
- def gteq(other)
- Predicates::GreaterThanOrEqualTo.new(self, other)
- end
-
- def gteq_any(*others)
- Predicates::Any.build(Predicates::GreaterThanOrEqualTo, self, *others)
- end
-
- def gteq_all(*others)
- Predicates::All.build(Predicates::GreaterThanOrEqualTo, self, *others)
- end
-
- def matches(other)
- Predicates::Match.new(self, other)
- end
-
- def matches_any(*others)
- Predicates::Any.build(Predicates::Match, self, *others)
- end
-
- def matches_all(*others)
- Predicates::All.build(Predicates::Match, self, *others)
- end
-
- def not_matches(other)
- Predicates::NotMatch.new(self, other)
- end
-
- def not_matches_any(*others)
- Predicates::Any.build(Predicates::NotMatch, self, *others)
- end
-
- def not_matches_all(*others)
- Predicates::All.build(Predicates::NotMatch, self, *others)
- end
-
- def in(other)
- Predicates::In.new(self, other)
- end
-
- def in_any(*others)
- Predicates::Any.build(Predicates::In, self, *others)
- end
-
- def in_all(*others)
- Predicates::All.build(Predicates::In, self, *others)
- end
-
- def not_in(other)
- Predicates::NotIn.new(self, other)
- end
-
- def not_in_any(*others)
- Predicates::Any.build(Predicates::NotIn, self, *others)
- end
-
- def not_in_all(*others)
- Predicates::All.build(Predicates::NotIn, self, *others)
- end
-
- module Expressions
- def count(distinct = false)
- distinct ? Distinct.new(self).count : Count.new(self)
- end
-
- def sum
- Sum.new(self)
- end
-
- def maximum
- Maximum.new(self)
- end
-
- def minimum
- Minimum.new(self)
- end
-
- def average
- Average.new(self)
- end
- end
- include Expressions
-
- module Orderings
- def asc
- Ascending.new(self)
- end
-
- def desc
- Descending.new(self)
- end
-
- alias_method :to_ordering, :asc
- end
- include Orderings
-
- module Types
- def type_cast(value)
- if root == self
- raise NotImplementedError, "#type_cast should be implemented in a subclass."
- else
- root.type_cast(value)
- end
- end
-
- def type_cast_to_numeric(value, method)
- return unless value
- if value.respond_to?(:to_str)
- str = value.to_str.strip
- return if str.empty?
- return $1.send(method) if str =~ /\A(-?(?:0|[1-9]\d*)(?:\.\d+)?|(?:\.\d+))\z/
- elsif value.respond_to?(method)
- return value.send(method)
- end
- raise typecast_error(value)
- end
-
- def typecast_error(value)
- raise TypecastError, "could not typecast #{value.inspect} to #{self.class.name.split('::').last}"
- end
- end
- include Types
-
- def column
- original_relation.column_for(self)
- end
-
- def format(object)
- object.to_sql(Sql::Attribute.new(self))
- end
-
- def to_sql(formatter = Sql::WhereCondition.new(relation))
- formatter.attribute self
- end
- end
-end