arel 0.4.0 → 1.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. data/README.markdown +24 -0
  2. data/lib/arel.rb +3 -1
  3. data/lib/arel/algebra/attributes/attribute.rb +175 -141
  4. data/lib/arel/algebra/core_extensions.rb +0 -1
  5. data/lib/arel/algebra/core_extensions/hash.rb +5 -9
  6. data/lib/arel/algebra/core_extensions/object.rb +0 -4
  7. data/lib/arel/algebra/expression.rb +37 -24
  8. data/lib/arel/algebra/header.rb +5 -6
  9. data/lib/arel/algebra/ordering.rb +13 -5
  10. data/lib/arel/algebra/predicates.rb +143 -27
  11. data/lib/arel/algebra/relations.rb +0 -1
  12. data/lib/arel/algebra/relations/operations/from.rb +10 -2
  13. data/lib/arel/algebra/relations/operations/group.rb +8 -6
  14. data/lib/arel/algebra/relations/operations/having.rb +3 -6
  15. data/lib/arel/algebra/relations/operations/join.rb +52 -18
  16. data/lib/arel/algebra/relations/operations/lock.rb +4 -6
  17. data/lib/arel/algebra/relations/operations/order.rb +11 -7
  18. data/lib/arel/algebra/relations/operations/project.rb +10 -10
  19. data/lib/arel/algebra/relations/operations/skip.rb +10 -3
  20. data/lib/arel/algebra/relations/operations/take.rb +10 -3
  21. data/lib/arel/algebra/relations/operations/where.rb +12 -6
  22. data/lib/arel/algebra/relations/relation.rb +161 -92
  23. data/lib/arel/algebra/relations/row.rb +8 -5
  24. data/lib/arel/algebra/relations/utilities/compound.rb +34 -33
  25. data/lib/arel/algebra/relations/utilities/externalization.rb +10 -8
  26. data/lib/arel/algebra/relations/writes.rb +24 -13
  27. data/lib/arel/algebra/value.rb +41 -2
  28. data/lib/arel/engines/memory.rb +0 -2
  29. data/lib/arel/engines/memory/engine.rb +3 -9
  30. data/lib/arel/engines/memory/relations.rb +0 -3
  31. data/lib/arel/engines/memory/relations/array.rb +5 -3
  32. data/lib/arel/engines/memory/relations/operations.rb +2 -60
  33. data/lib/arel/engines/sql.rb +0 -2
  34. data/lib/arel/engines/sql/christener.rb +12 -6
  35. data/lib/arel/engines/sql/compilers/oracle_compiler.rb +34 -23
  36. data/lib/arel/engines/sql/compilers/postgresql_compiler.rb +23 -15
  37. data/lib/arel/engines/sql/engine.rb +19 -27
  38. data/lib/arel/engines/sql/formatters.rb +26 -10
  39. data/lib/arel/engines/sql/relations.rb +0 -7
  40. data/lib/arel/engines/sql/relations/compiler.rb +70 -35
  41. data/lib/arel/engines/sql/relations/table.rb +44 -32
  42. data/lib/arel/{engines/sql/relations/utilities/recursion.rb → recursion/base_case.rb} +0 -0
  43. data/lib/arel/session.rb +24 -40
  44. data/lib/arel/sql_literal.rb +13 -0
  45. data/lib/arel/version.rb +1 -1
  46. data/spec/algebra/unit/predicates/inequality_spec.rb +32 -0
  47. data/spec/algebra/unit/predicates/predicate_spec.rb +22 -0
  48. data/spec/algebra/unit/primitives/attribute_spec.rb +3 -9
  49. data/spec/algebra/unit/primitives/expression_spec.rb +1 -7
  50. data/spec/algebra/unit/relations/join_spec.rb +0 -7
  51. data/spec/algebra/unit/relations/project_spec.rb +3 -3
  52. data/spec/algebra/unit/relations/relation_spec.rb +74 -25
  53. data/spec/algebra/unit/session/session_spec.rb +7 -7
  54. data/spec/engines/memory/integration/joins/cross_engine_spec.rb +20 -10
  55. data/spec/engines/memory/unit/relations/array_spec.rb +6 -5
  56. data/spec/engines/memory/unit/relations/join_spec.rb +7 -6
  57. data/spec/engines/memory/unit/relations/order_spec.rb +7 -6
  58. data/spec/engines/memory/unit/relations/project_spec.rb +6 -6
  59. data/spec/engines/memory/unit/relations/skip_spec.rb +10 -5
  60. data/spec/engines/memory/unit/relations/take_spec.rb +7 -5
  61. data/spec/engines/memory/unit/relations/where_spec.rb +13 -9
  62. data/spec/engines/sql/unit/engine_spec.rb +20 -0
  63. data/spec/engines/sql/unit/relations/group_spec.rb +2 -2
  64. data/spec/engines/sql/unit/relations/order_spec.rb +5 -5
  65. data/spec/engines/sql/unit/relations/project_spec.rb +4 -4
  66. data/spec/engines/sql/unit/relations/table_spec.rb +0 -7
  67. data/spec/engines/sql/unit/relations/take_spec.rb +26 -0
  68. data/spec/engines/sql/unit/relations/where_spec.rb +1 -1
  69. data/spec/spec_helper.rb +1 -4
  70. data/spec/sql/christener_spec.rb +70 -0
  71. data/spec/support/model.rb +7 -2
  72. metadata +109 -23
  73. data/lib/arel/algebra/core_extensions/class.rb +0 -32
  74. data/lib/arel/algebra/relations/operations/alias.rb +0 -7
  75. data/lib/arel/engines/memory/predicates.rb +0 -99
  76. data/lib/arel/engines/memory/primitives.rb +0 -27
  77. data/lib/arel/engines/memory/relations/compound.rb +0 -9
  78. data/lib/arel/engines/memory/relations/writes.rb +0 -7
  79. data/lib/arel/engines/sql/predicates.rb +0 -103
  80. data/lib/arel/engines/sql/primitives.rb +0 -97
  81. data/lib/arel/engines/sql/relations/operations/alias.rb +0 -5
  82. data/lib/arel/engines/sql/relations/operations/join.rb +0 -33
  83. data/lib/arel/engines/sql/relations/relation.rb +0 -65
  84. data/lib/arel/engines/sql/relations/utilities/compound.rb +0 -10
  85. data/lib/arel/engines/sql/relations/utilities/externalization.rb +0 -14
  86. data/lib/arel/engines/sql/relations/writes.rb +0 -19
@@ -1,97 +0,0 @@
1
- module Arel
2
- class SqlLiteral < String
3
- def relation
4
- nil
5
- end
6
-
7
- def to_sql(formatter = nil)
8
- self
9
- end
10
-
11
- include Attribute::Expressions
12
- end
13
-
14
- class Attribute
15
- def column
16
- original_relation.column_for(self)
17
- end
18
-
19
- def format(object)
20
- object.to_sql(Sql::Attribute.new(self))
21
- end
22
-
23
- def to_sql(formatter = Sql::WhereCondition.new(relation))
24
- formatter.attribute self
25
- end
26
- end
27
-
28
- class Value
29
- def inclusion_predicate_sql
30
- value.inclusion_predicate_sql
31
- end
32
-
33
- def exclusion_predicate_sql
34
- value.exclusion_predicate_sql
35
- end
36
-
37
- def equality_predicate_sql
38
- value.equality_predicate_sql
39
- end
40
-
41
- def inequality_predicate_sql
42
- value.inequality_predicate_sql
43
- end
44
-
45
- def to_sql(formatter = Sql::WhereCondition.new(relation))
46
- formatter.value value
47
- end
48
-
49
- def format(object)
50
- object.to_sql(Sql::Value.new(relation))
51
- end
52
- end
53
-
54
- class Ordering
55
- def to_sql(formatter = Sql::OrderClause.new(relation))
56
- formatter.ordering self
57
- end
58
- end
59
-
60
- class Ascending < Ordering
61
- def direction_sql; 'ASC' end
62
- end
63
-
64
- class Descending < Ordering
65
- def direction_sql; 'DESC' end
66
- end
67
-
68
- class Expression < Attribute
69
- def to_sql(formatter = Sql::SelectClause.new(relation))
70
- formatter.expression self
71
- end
72
- end
73
-
74
- class Count < Expression
75
- def function_sql; 'COUNT' end
76
- end
77
-
78
- class Distinct < Expression
79
- def function_sql; 'DISTINCT' end
80
- end
81
-
82
- class Sum < Expression
83
- def function_sql; 'SUM' end
84
- end
85
-
86
- class Maximum < Expression
87
- def function_sql; 'MAX' end
88
- end
89
-
90
- class Minimum < Expression
91
- def function_sql; 'MIN' end
92
- end
93
-
94
- class Average < Expression
95
- def function_sql; 'AVG' end
96
- end
97
- end
@@ -1,5 +0,0 @@
1
- module Arel
2
- class Alias < Compound
3
- include Recursion::BaseCase
4
- end
5
- end
@@ -1,33 +0,0 @@
1
- module Arel
2
- class Join
3
- def table_sql(formatter = Sql::TableReference.new(self))
4
- relation1.externalize.table_sql(formatter)
5
- end
6
-
7
- def joins(environment, formatter = Sql::TableReference.new(environment))
8
- @joins ||= begin
9
- this_join = [
10
- join_sql,
11
- relation2.externalize.table_sql(formatter),
12
- ("ON" unless predicates.blank?),
13
- (ons + relation2.externalize.wheres).collect { |p| p.bind(environment.relation).to_sql(Sql::WhereClause.new(environment)) }.join(' AND ')
14
- ].compact.join(" ")
15
- [relation1.joins(environment), this_join, relation2.joins(environment)].compact.join(" ")
16
- end
17
- end
18
- end
19
-
20
- class InnerJoin < Join
21
- def join_sql; "INNER JOIN" end
22
- end
23
-
24
- class OuterJoin < Join
25
- def join_sql; "LEFT OUTER JOIN" end
26
- end
27
-
28
- class StringJoin < Join
29
- def joins(environment, formatter = Sql::TableReference.new(environment))
30
- [relation1.joins(environment), relation2].compact.join(" ")
31
- end
32
- end
33
- end
@@ -1,65 +0,0 @@
1
- module Arel
2
- module Relation
3
- @@connection_tables_primary_keys = {}
4
-
5
- def compiler
6
- @compiler ||= begin
7
- "Arel::SqlCompiler::#{engine.adapter_name}Compiler".constantize.new(self)
8
- rescue
9
- Arel::SqlCompiler::GenericCompiler.new(self)
10
- end
11
- end
12
-
13
- def to_sql(formatter = Sql::SelectStatement.new(self))
14
- formatter.select compiler.select_sql, self
15
- end
16
-
17
- def christener
18
- @christener ||= Sql::Christener.new
19
- end
20
-
21
- def inclusion_predicate_sql
22
- "IN"
23
- end
24
-
25
- def exclusion_predicate_sql
26
- "NOT IN"
27
- end
28
-
29
- def primary_key
30
- connection_id = engine.connection.object_id
31
- if @@connection_tables_primary_keys[connection_id] && @@connection_tables_primary_keys[connection_id].has_key?(table.name)
32
- @@connection_tables_primary_keys[connection_id][table.name]
33
- else
34
- @@connection_tables_primary_keys[connection_id] ||= {}
35
- @@connection_tables_primary_keys[connection_id][table.name] = engine.connection.primary_key(table.name)
36
- end
37
- end
38
-
39
- protected
40
-
41
- def from_clauses
42
- sources.blank? ? table_sql(Sql::TableReference.new(self)) : sources
43
- end
44
-
45
- def select_clauses
46
- attributes.collect { |a| a.to_sql(Sql::SelectClause.new(self)) }
47
- end
48
-
49
- def where_clauses
50
- wheres.collect { |w| w.to_sql(Sql::WhereClause.new(self)) }
51
- end
52
-
53
- def group_clauses
54
- groupings.collect { |g| g.to_sql(Sql::GroupClause.new(self)) }
55
- end
56
-
57
- def having_clauses
58
- havings.collect { |g| g.to_sql(Sql::HavingClause.new(self)) }
59
- end
60
-
61
- def order_clauses
62
- orders.collect { |o| o.to_sql(Sql::OrderClause.new(self)) }
63
- end
64
- end
65
- end
@@ -1,10 +0,0 @@
1
- module Arel
2
- class Compound
3
- delegate :table, :table_sql, :to => :relation
4
-
5
- def build_query(*parts)
6
- parts.compact.join(" ")
7
- end
8
- end
9
- end
10
-
@@ -1,14 +0,0 @@
1
- module Arel
2
- class Externalization < Compound
3
- include Recursion::BaseCase
4
-
5
- def table_sql(formatter = Sql::TableReference.new(relation))
6
- formatter.select relation.compiler.select_sql, self
7
- end
8
-
9
- # REMOVEME
10
- def name
11
- relation.name + '_external'
12
- end
13
- end
14
- end
@@ -1,19 +0,0 @@
1
- module Arel
2
- class Deletion < Compound
3
- def to_sql
4
- compiler.delete_sql
5
- end
6
- end
7
-
8
- class Insert < Compound
9
- def to_sql(include_returning = true)
10
- compiler.insert_sql(include_returning)
11
- end
12
- end
13
-
14
- class Update < Compound
15
- def to_sql
16
- compiler.update_sql
17
- end
18
- end
19
- end