[Groonga-commit] droonga/droonga-engine at bae926b [master] groonga: Accept "filter" for Groonga's delete

Back to archive index

YUKI Hiroshi null+****@clear*****
Thu Apr 24 15:13:27 JST 2014


YUKI Hiroshi	2014-04-24 15:13:27 +0900 (Thu, 24 Apr 2014)

  New Revision: bae926b0aef60ec3b1e0e258bc10cdeb374be89e
  https://github.com/droonga/droonga-engine/commit/bae926b0aef60ec3b1e0e258bc10cdeb374be89e

  Message:
    groonga: Accept "filter" for Groonga's delete

  Modified files:
    lib/droonga/plugins/groonga/delete.rb
    lib/droonga/plugins/groonga/generic_command.rb
    test/unit/plugins/groonga/test_delete.rb

  Modified: lib/droonga/plugins/groonga/delete.rb (+15 -9)
===================================================================
--- lib/droonga/plugins/groonga/delete.rb    2014-04-24 14:21:04 +0900 (5d198ab)
+++ lib/droonga/plugins/groonga/delete.rb    2014-04-24 15:13:27 +0900 (8edb0db)
@@ -66,14 +66,6 @@ module Droonga
                                      :message => message,
                                      :result => false)
             end
-
-            #XXX this must be removed after it is implemented
-            if filter
-              message = "\"filter\" is not supported yet"
-              raise CommandError.new(:status => Status::INVALID_ARGUMENT,
-                                     :message => message,
-                                     :result => false)
-            end
           end
 
           def delete_record(table_name, parameters={})
@@ -81,9 +73,23 @@ module Droonga
             if parameters[:id]
               record = table[parameters[:id].to_i]
               record.delete if record and record.valid_id?
-            else
+            else if parameters[:key]
               record = table[parameters[:key]]
               record.delete unless record.nil?
+            else
+              filter = Groonga::Expression.new(:context => @context)
+              begin
+                filter.parse(parameters[:filter].dump, :syntax => :script)
+                records = table.select(filter)
+                records.each do |record|
+                  record.delete
+                end
+              rescue ::Groonga::SyntaxError
+                message = "syntax error in filter: <#{parameters[:filter].to_s}>"
+                raise CommandError.new(:status => Status::SYNTAX_ERROR,
+                                       :message => message,
+                                       :result => false)
+              end
             end
             true
           end

  Modified: lib/droonga/plugins/groonga/generic_command.rb (+1 -0)
===================================================================
--- lib/droonga/plugins/groonga/generic_command.rb    2014-04-24 14:21:04 +0900 (1d41be2)
+++ lib/droonga/plugins/groonga/generic_command.rb    2014-04-24 15:13:27 +0900 (9613da7)
@@ -21,6 +21,7 @@ module Droonga
       module Status
         SUCCESS          = 0
         INVALID_ARGUMENT = -22
+        SYNTAX_ERROR     = -63
       end
 
       class GenericCommand

  Modified: test/unit/plugins/groonga/test_delete.rb (+19 -15)
===================================================================
--- test/unit/plugins/groonga/test_delete.rb    2014-04-24 14:21:04 +0900 (32b7fad)
+++ test/unit/plugins/groonga/test_delete.rb    2014-04-24 15:13:27 +0900 (04080f2)
@@ -79,21 +79,6 @@ class DeleteTest < GroongaHandlerTest
     )
   end
 
-  def test_not_implemented_identifier
-    Groonga::Schema.define(:context => @context) do |schema|
-      schema.create_table("Books", :type => :hash)
-    end
-    message = {
-      "table" => "Books",
-      "filter" => "filter",
-    }
-    response = process(:delete, message)
-    assert_equal(
-      [NORMALIZED_HEADER_INVALID_ARGUMENT, false],
-      [normalize_header(response.first), response.last]
-    )
-  end
-
   class DeleteTest < self
     def test_key
       Groonga::Schema.define(:context => @context) do |schema|
@@ -118,5 +103,24 @@ table_create Books TABLE_HASH_KEY --key_type ShortText
 table_create Ages TABLE_NO_KEY
       DUMP
     end
+
+    def test_filter
+      Groonga::Schema.define(:context => @context) do |schema|
+        schema.create_table("Books", :type => :hash)
+      end
+      table = Groonga::Context.default["Books"]
+      table.add("Groonga")
+      table.add("Droonga")
+      process(:delete,
+              {"table" => "Books", "filter" => '_key @^ "D"'})
+      assert_equal(<<-DUMP, dump)
+table_create Books TABLE_HASH_KEY --key_type ShortText
+load --table Books
+[
+  ["_key"],
+  ["Groonga"]
+]
+      DUMP
+    end
   end
 end
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index