You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by to...@apache.org on 2015/09/10 02:34:13 UTC

[11/26] couchdb-mango git commit: Add text index field validator

Add text index field validator

Our original text field validator let any list through. The new
validator makes text fields definitions more restrictive.

BugzID: 46817


Project: http://git-wip-us.apache.org/repos/asf/couchdb-mango/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-mango/commit/a814fe78
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-mango/tree/a814fe78
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-mango/diff/a814fe78

Branch: refs/heads/master
Commit: a814fe78b76c2b84ad2f06dbb87ddb0b57fc1de3
Parents: 85f8a2b
Author: Tony Sun <to...@cloudant.com>
Authored: Tue Aug 25 13:40:06 2015 -0700
Committer: Tony Sun <to...@cloudant.com>
Committed: Tue Aug 25 13:40:06 2015 -0700

----------------------------------------------------------------------
 src/mango_error.erl        |  8 ++++++++
 src/mango_idx_text.erl     | 26 +++++++++++++++++++++++---
 test/01-index-crud-test.py | 21 +++++++++++++++++++++
 3 files changed, 52 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/a814fe78/src/mango_error.erl
----------------------------------------------------------------------
diff --git a/src/mango_error.erl b/src/mango_error.erl
index cf117ab..6ad76bb 100644
--- a/src/mango_error.erl
+++ b/src/mango_error.erl
@@ -141,6 +141,14 @@ info(mango_idx_view, {invalid_index_json, BadIdx}) ->
         <<"invalid_index">>,
         fmt("JSON indexes must be an object, not: ~w", [BadIdx])
     };
+info(mango_idx_text, {invalid_index_fields_definition, Def}) ->
+    {
+        400,
+        <<"invalid_index_fields_definition">>,
+        fmt("Text Index field definitions must be of the form
+            {\"name\": \"fieldname\", \"type\":
+                \"boolean,number, or string\"}. Def: ~p", [Def])
+    };
 info(mango_idx_view, {index_not_found, BadIdx}) ->
     {
         404,

http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/a814fe78/src/mango_idx_text.erl
----------------------------------------------------------------------
diff --git a/src/mango_idx_text.erl b/src/mango_idx_text.erl
index cce978e..321889a 100644
--- a/src/mango_idx_text.erl
+++ b/src/mango_idx_text.erl
@@ -15,6 +15,7 @@
 
 -export([
     validate/1,
+    validate_fields/1,
     add/2,
     remove/2,
     from_ddoc/1,
@@ -148,12 +149,31 @@ def_to_json([{Key, Value} | Rest]) ->
 
 fields_to_json([]) ->
     [];
-fields_to_json([{[{<<"name">>, Name}, {<<"type">>, Type}]} | Rest]) ->
+fields_to_json([{[{<<"name">>, Name}, {<<"type">>, Type0}]} | Rest]) ->
+    Type = validate_field_type(Type0),
     [{[{Name, Type}]} | fields_to_json(Rest)];
-fields_to_json([{[{<<"type">>, Type}, {<<"name">>, Name}]} | Rest]) ->
+fields_to_json([{[{<<"type">>, Type0}, {<<"name">>, Name}]} | Rest]) ->
+    Type = validate_field_type(Type0),
     [{[{Name, Type}]} | fields_to_json(Rest)].
 
 
+validate_field_type(<<"string">>) ->
+    <<"string">>;
+validate_field_type(<<"number">>) ->
+    <<"number">>;
+validate_field_type(<<"boolean">>) ->
+    <<"boolean">>.
+
+
+validate_fields(Fields) ->
+    try fields_to_json(Fields) of
+        _ ->
+            mango_fields:new(Fields)
+    catch error:function_clause ->
+        ?MANGO_ERROR({invalid_index_fields_definition, Fields})
+    end.
+
+
 opts() ->
     [
         {<<"default_analyzer">>, [
@@ -176,7 +196,7 @@ opts() ->
             {tag, fields},
             {optional, true},
             {default, []},
-            {validator, fun mango_opts:validate_fields/1}
+            {validator, fun ?MODULE:validate_fields/1}
         ]}
     ].
 

http://git-wip-us.apache.org/repos/asf/couchdb-mango/blob/a814fe78/test/01-index-crud-test.py
----------------------------------------------------------------------
diff --git a/test/01-index-crud-test.py b/test/01-index-crud-test.py
index 31e0b08..bd41516 100644
--- a/test/01-index-crud-test.py
+++ b/test/01-index-crud-test.py
@@ -241,6 +241,27 @@ class IndexCrudTests(mango.DbPerClass):
             return
         raise AssertionError("index not created")
 
+    def test_create_bad_text_idx(self):
+        bad_fields = [
+            True,
+            False,
+            "bing",
+            2.0,
+            ["foo", "bar"],
+            [{"name": "foo2"}],
+            [{"name": "foo3", "type": "garbage"}],
+            [{"type": "number"}],
+            [{"name": "age", "type": "number"} , {"name": "bad"}],
+            [{"name": "age", "type": "number"} , "bla"]
+        ]
+        for fields in bad_fields:
+            try:
+                self.db.create_text_index(fields=fields)
+            except Exception, e:
+                assert e.response.status_code == 400
+            else:
+                raise AssertionError("bad create text index")
+
     def test_limit_skip_index(self):
         fields = ["field1"]
         ret = self.db.create_index(fields, name="idx_01")