You are viewing a plain text version of this content. The canonical link for it is here.
Posted to alois-commits@incubator.apache.org by fl...@apache.org on 2011/04/04 07:55:18 UTC
svn commit: r1088492 - in /incubator/alois/trunk/rails: app/models/view.rb
test/unit/view_test.rb
Author: flavio
Date: Mon Apr 4 07:55:17 2011
New Revision: 1088492
URL: http://svn.apache.org/viewvc?rev=1088492&view=rev
Log:
Added group by for update query in view.rb
Modified:
incubator/alois/trunk/rails/app/models/view.rb
incubator/alois/trunk/rails/test/unit/view_test.rb
Modified: incubator/alois/trunk/rails/app/models/view.rb
URL: http://svn.apache.org/viewvc/incubator/alois/trunk/rails/app/models/view.rb?rev=1088492&r1=1088491&r2=1088492&view=diff
==============================================================================
--- incubator/alois/trunk/rails/app/models/view.rb (original)
+++ incubator/alois/trunk/rails/app/models/view.rb Mon Apr 4 07:55:17 2011
@@ -185,7 +185,7 @@
# | INTO DUMPFILE 'file_name'
# | INTO var_name [, var_name]]
# [FOR UPDATE | LOCK IN SHARE MODE]]
-
+
def View.insert_generic(type, query, value, regexps)
return query if value == "" or value.nil?
@@ -224,6 +224,15 @@
query + " " + val
end
+ def View.insert_group(query, group_by)
+ # we cannot simply replace a group by because a grouping on a grouping is not the same
+ # as the second grouping alone.
+ raise "There exist already a group by in the query, cannot insert group by: #{query.inspect}" if query =~ /GROUP\s+BY/
+ val = "GROUP BY #{group_by}"
+ insert_generic(:before, query, val, [/HAVING/i,/(ORDER BY)/i,/(LIMIT)/i,/(PROCEDURE)/i,/(INTO\s)/i,/(FOR UPDATE)/i, /(LOCK IN)/i]) or
+ query + " " + val
+ end
+
def View.insert_order(query, order)
val = "ORDER BY #{order}"
insert_generic(:replace, query, "#{val} LIMIT", [/ORDER\s*BY\s.*\s*LIMIT/i]) or
@@ -263,6 +272,10 @@
part = View.insert_condition(part,options[:conditions]) if options[:conditions]
part = View.insert_limit_offset(part,options[:limit],options[:offset]) if options[:limit]
+ if options[:group]
+ raise "Cannot insert group by for union query: #{query.inspect}" if parts.length > 1
+ part = View.insert_group(part,options[:group])
+ end
part = View.insert_order(part,options[:order]) if options[:order]
part += " " unless part.ends_with?(" ")
start + part
Modified: incubator/alois/trunk/rails/test/unit/view_test.rb
URL: http://svn.apache.org/viewvc/incubator/alois/trunk/rails/test/unit/view_test.rb?rev=1088492&r1=1088491&r2=1088492&view=diff
==============================================================================
--- incubator/alois/trunk/rails/test/unit/view_test.rb (original)
+++ incubator/alois/trunk/rails/test/unit/view_test.rb Mon Apr 4 07:55:17 2011
@@ -61,6 +61,22 @@ class ViewTest < ActiveSupport::TestCase
assert_equal "SELECT * FROM x ORDER BY #{order} LIMIT 324, 234 ", View.insert_order("SELECT * FROM x ORDER BY sum(xxx) , ss ASC LIMIT 324, 234 ", order)
assert_equal "SELECT * FROM x ORDER BY #{order}", View.insert_order("SELECT * FROM x ORDER BY sum(xxx) , ss ASC", order)
end
+
+ def test_insert_group
+ group = "field1, field2"
+ assert_equal "SELECT * FROM x GROUP BY #{group}", View.insert_group("SELECT * FROM x",group)
+ assert_equal "SELECT * FROM x WHERE a = b GROUP BY #{group}", View.insert_group("SELECT * FROM x WHERE a = b",group)
+ assert_equal "SELECT * FROM x GROUP BY #{group} LIMIT 324,234", View.insert_group("SELECT * FROM x LIMIT 324,234",group)
+ assert_raise(RuntimeError) {
+ View.insert_group("SELECT * FROM x GROUP BY sum(xxx) , ss ASC LIMIT 324, 234 ", group)
+ }
+ assert_raise(RuntimeError) {
+ View.insert_group("SELECT * FROM x GROUP BY sum(xxx) , ss ASC", group)
+ }
+ assert_raise(RuntimeError) {
+ View.update_query("SELECT * FROM x UNION SELECT * FROM y", :group => "f1,f2")
+ }
+ end
def test_update_query
condition = "abc = 'xyz'"