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
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 @@
<<"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,
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 @@
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 @@
{tag, fields},
{optional, true},
{default, []},
- {validator, fun mango_opts:validate_fields/1}
+ {validator, fun ?MODULE:validate_fields/1}
]}
].
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 @@
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")