momomoto 0.1.10 → 0.1.11
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.
- data/lib/momomoto/base.rb +18 -10
- data/lib/momomoto/procedure.rb +2 -1
- data/lib/timeinterval.rb +1 -1
- data/test/test_base.rb +10 -6
- data/test/test_table.rb +2 -0
- metadata +2 -2
data/lib/momomoto/base.rb
CHANGED
@@ -80,16 +80,29 @@ module Momomoto
|
|
80
80
|
|
81
81
|
# compiles the where-clause of the query
|
82
82
|
def compile_where( conditions )
|
83
|
-
conditions
|
84
|
-
where =
|
83
|
+
conditions ||= {}
|
84
|
+
where = compile_expression( conditions, logical_operator )
|
85
|
+
where.empty? ? '' : " WHERE #{where}"
|
86
|
+
end
|
87
|
+
|
88
|
+
def compile_expression( conditions, operator )
|
89
|
+
where = []
|
85
90
|
conditions.each do | key , value |
|
86
91
|
key = key.to_sym if key.kind_of?( String )
|
87
|
-
|
88
|
-
|
92
|
+
case key
|
93
|
+
when :OR then
|
94
|
+
where << compile_expression( value, "OR" )
|
95
|
+
when :AND then
|
96
|
+
where << compile_expression( value, "AND" )
|
97
|
+
else
|
98
|
+
raise CriticalError, "condition key '#{key}' not a column in table '#{table_name}'" unless columns.keys.member?( key )
|
99
|
+
where << columns[key].compile_rule( key, value )
|
100
|
+
end
|
89
101
|
end
|
90
|
-
where
|
102
|
+
where.join( " #{operator} ")
|
91
103
|
end
|
92
104
|
|
105
|
+
|
93
106
|
# compiles the sql statement defining the limit
|
94
107
|
def compile_limit( limit )
|
95
108
|
" LIMIT #{Integer(limit)}"
|
@@ -120,11 +133,6 @@ module Momomoto
|
|
120
133
|
" ORDER BY #{order.join(',')}"
|
121
134
|
end
|
122
135
|
|
123
|
-
# append where string
|
124
|
-
def where_append( where, append )
|
125
|
-
( where.empty? ? ' WHERE ' : where + ' ' + logical_operator + ' ' ) + append
|
126
|
-
end
|
127
|
-
|
128
136
|
# construct the Row class for the table
|
129
137
|
def initialize_row( row, table, columns = table.columns )
|
130
138
|
|
data/lib/momomoto/procedure.rb
CHANGED
@@ -13,6 +13,7 @@ module Momomoto
|
|
13
13
|
@schema_name ||= construct_schema_name( self.name )
|
14
14
|
@parameters ||= database.fetch_procedure_parameters( procedure_name )
|
15
15
|
@columns ||= database.fetch_procedure_columns( procedure_name )
|
16
|
+
@logical_operator ||= "AND"
|
16
17
|
|
17
18
|
const_set( :Row, Class.new( Momomoto::Row ) ) if not const_defined?( :Row )
|
18
19
|
initialize_row( const_get( :Row ), self )
|
@@ -77,7 +78,7 @@ module Momomoto
|
|
77
78
|
parameters.each do | parameter |
|
78
79
|
field_name, datatype = parameter.to_a.first
|
79
80
|
raise Error, "parameter #{field_name} not specified" if not params.member?( field_name )
|
80
|
-
raise Error, "Not null fields(#{field_name}) need to be set" if !params[field_name] && datatype.not_null?
|
81
|
+
raise Error, "Not null fields(#{field_name}) need to be set in #{procedure_name}" if !params[field_name] && datatype.not_null?
|
81
82
|
args << datatype.escape( params[field_name] )
|
82
83
|
end
|
83
84
|
args.join(',')
|
data/lib/timeinterval.rb
CHANGED
@@ -55,7 +55,7 @@ class TimeInterval
|
|
55
55
|
@sec = d%60
|
56
56
|
when String then
|
57
57
|
parsed = Date._parse( d, false)
|
58
|
-
if ( parsed.empty? && d.length > 0 ) || !(parsed.keys - [:hour,:min,:sec]).empty?
|
58
|
+
if ( parsed.empty? && d.length > 0 ) || !(parsed.keys - [:hour,:min,:sec,:sec_fraction]).empty?
|
59
59
|
raise ParseError, "Could not parse interval `#{d}`"
|
60
60
|
end
|
61
61
|
@hour = parsed[:hour] || 0
|
data/test/test_base.rb
CHANGED
@@ -26,12 +26,16 @@ class TestBase < Test::Unit::TestCase
|
|
26
26
|
t = Class.new( Momomoto::Table )
|
27
27
|
t.table_name = 'person'
|
28
28
|
t.initialize_table
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
assert_equal( " WHERE person_id = '1'" , t.instance_eval do compile_where( :person_id => '1' ) end )
|
30
|
+
assert_equal( " WHERE person_id IN ('1')" , t.instance_eval do compile_where( :person_id => ['1'] ) end )
|
31
|
+
assert_equal( " WHERE person_id IN ('1','2')" , t.instance_eval do compile_where( :person_id => ['1',2] ) end )
|
32
|
+
assert_equal( " WHERE first_name = E'1'" , t.instance_eval do compile_where( :first_name => '1' ) end )
|
33
|
+
assert_equal( " WHERE first_name = E'chu''nky'" , t.instance_eval do compile_where( :first_name => "chu'nky" ) end )
|
34
|
+
assert_equal( " WHERE first_name IN (E'chu''nky',E'bac''n')" , t.instance_eval do compile_where( :first_name => ["chu'nky","bac'n"] ) end )
|
35
|
+
assert_equal( " WHERE person_id = '1'" , t.instance_eval do compile_where( :OR => { :person_id => '1' } ) end )
|
36
|
+
assert_equal( " WHERE person_id = '1'" , t.instance_eval do compile_where( :AND => { :person_id => '1' } ) end )
|
37
|
+
assert_equal( " WHERE person_id = '1' OR first_name = E's'" , t.instance_eval do compile_where( :OR => { :person_id => '1',:first_name=>'s' } ) end )
|
38
|
+
assert_equal( " WHERE person_id = '1' AND first_name = E's'" , t.instance_eval do compile_where( :AND => { :person_id => '1',:first_name=>'s' } ) end )
|
35
39
|
end
|
36
40
|
|
37
41
|
end
|
data/test/test_table.rb
CHANGED
@@ -157,6 +157,8 @@ class TestTable < Test::Unit::TestCase
|
|
157
157
|
def test_select
|
158
158
|
r = Person.select( nil, {:limit => 3})
|
159
159
|
assert_equal( 3, r.length )
|
160
|
+
Person.select({:OR=>{:person_id=>1}})
|
161
|
+
Person.select({:AND=>{:person_id=>1}})
|
160
162
|
Person.select( nil, {:limit => 3, :order => :person_id})
|
161
163
|
Person.select( nil, {:limit => 3, :order => "person_id"})
|
162
164
|
Person.select( nil, {:limit => 3, :order => ["person_id"]})
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: momomoto
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2007-11-
|
6
|
+
version: 0.1.11
|
7
|
+
date: 2007-11-16 00:00:00 +01:00
|
8
8
|
summary: Momomoto is an object relational mapper for PostgreSQL.
|
9
9
|
require_paths:
|
10
10
|
- lib
|