diff --git a/riak_test/yz_pb.erl b/riak_test/yz_pb.erl index ea409c5c..36daf10b 100644 --- a/riak_test/yz_pb.erl +++ b/riak_test/yz_pb.erl @@ -43,6 +43,7 @@ confirm() -> confirm_admin_index(Cluster), confirm_admin_bad_index_name(Cluster), confirm_basic_search(Cluster), + confirm_w1c_search(Cluster), confirm_encoded_search(Cluster), confirm_search_to_test_max_score_defaults(Cluster), confirm_multivalued_field(Cluster), @@ -82,11 +83,12 @@ create_index(Cluster, BucketType, Index) -> create_index(Cluster, BucketType, Index, UseDefaultSchema) when is_boolean(UseDefaultSchema) -> - create_index(Cluster, BucketType, Index, 3, UseDefaultSchema); + create_index(Cluster, BucketType, Index, [{use_default_schema, UseDefaultSchema}]); create_index(Cluster, BucketType, Index, Nval) when is_integer(Nval) -> - create_index(Cluster, BucketType, Index, Nval, true). - -create_index(Cluster, BucketType, Index, Nval, UseDefaultSchema) -> + create_index(Cluster, BucketType, Index, [{n_val, Nval}]); +create_index(Cluster, BucketType, Index, Props) when is_list(Props) -> + Nval = proplists:get_value(n_val, Props, 3), + UseDefaultSchema = proplists:get_value(use_default_schema, Props, true), Node = select_random(Cluster), [{Host, Port}] = host_entries(rt:connection_info([Node])), lager:info("create_index ~s for bucket type ~s [~p]", [Index, BucketType, {Host, Port}]), @@ -111,11 +113,14 @@ create_index(Cluster, BucketType, Index, Nval, UseDefaultSchema) -> ?assertEqual([{index, Index}, {schema, SchemaName}, NvalT], IndexData), %% Add the index to the bucket props - yz_rt:set_bucket_type_index(Node, BucketType, Index, Nval), + yz_rt:set_bucket_type_index(Node, BucketType, Index, [{n_val, Nval} | Props]), yz_rt:wait_for_bucket_type(Cluster, BucketType), riakc_pb_socket:stop(Pid), ok. +create_index(Cluster, BucketType, Index, Nval, UseDefaultSchema) -> + create_index(Cluster, BucketType, Index, [{n_val, Nval}, {use_default_schema, UseDefaultSchema}]). + store_and_search(Cluster, Bucket, Key, Body, Search, Params) -> store_and_search(Cluster, Bucket, Key, Body, "text/plain", Search, Params). @@ -210,6 +215,15 @@ confirm_basic_search(Cluster) -> Params = [{sort, <<"score desc">>}, {fl, ["*","score"]}], store_and_search(Cluster, Bucket, "test", Body, <<"text:herp">>, Params). +confirm_w1c_search(Cluster) -> + Index = <<"write_once">>, + Bucket = {Index, <<"b1">>}, + create_index(Cluster, Index, Index, [{write_once, true}]), + lager:info("confirm_basic_search ~p", [Bucket]), + Body = "herp derp", + Params = [{sort, <<"score desc">>}, {fl, ["*","score"]}], + store_and_search(Cluster, Bucket, "test", Body, <<"text:herp">>, Params). + confirm_encoded_search(Cluster) -> Index = <<"encoded">>, Bucket = {Index, <<"b1">>}, diff --git a/riak_test/yz_rt.erl b/riak_test/yz_rt.erl index 32fcfdc2..18ceac5c 100644 --- a/riak_test/yz_rt.erl +++ b/riak_test/yz_rt.erl @@ -334,9 +334,11 @@ set_bucket_type_index(Node, BucketType, Index) -> lager:info("Set bucket type ~s index to ~s [~p]", [BucketType, Index, Node]), create_bucket_type(Node, BucketType, [{?YZ_INDEX, Index}]). -set_bucket_type_index(Node, BucketType, Index, NVal) -> +set_bucket_type_index(Node, BucketType, Index, NVal) when is_integer(NVal) -> + set_bucket_type_index(Node, BucketType, Index, [{n_val, NVal}]); +set_bucket_type_index(Node, BucketType, Index, Props) -> lager:info("Set bucket type ~s index to ~s [~p]", [BucketType, Index, Node]), - create_bucket_type(Node, BucketType, [{?YZ_INDEX, Index},{n_val,NVal}]). + create_bucket_type(Node, BucketType, [{?YZ_INDEX, Index} | Props]). solr_http({_Node, ConnInfo}) -> solr_http(ConnInfo); diff --git a/src/yz_kv.erl b/src/yz_kv.erl index 5fd5b2bd..fe2997c4 100644 --- a/src/yz_kv.erl +++ b/src/yz_kv.erl @@ -190,35 +190,53 @@ has_indexes(RemoteNode) -> _ -> false end. + +%% @doc Index the data supplied in the Riak Object. +%% The Riak Object should be a serialized object (a binary, +%% which has been serialized using riak_object:to_binary/1) +-spec index_binary(bucket(), key(), binary(), write_reason(), p()) -> ok. +index_binary(Bucket, Key, Obj, Reason, P) -> + index_internal( + Bucket, Key, Obj, Reason, P + ). + +%% @doc Index the data supplied in the Riak Object. +-spec index(riak_object:riak_object(), write_reason(), p()) -> ok. index(Obj, Reason, P) -> + index_internal( + riak_object:bucket(Obj), riak_object:key(Obj), Obj, Reason, P + ). + +%% @private +index_internal(Bucket, Key, Obj, Reason, P) -> case yokozuna:is_enabled(index) andalso ?YZ_ENABLED of true -> Ring = yz_misc:get_ring(transformed), case is_owner_or_future_owner(P, node(), Ring) of true -> T1 = os:timestamp(), - BKey = {riak_object:bucket(Obj), riak_object:key(Obj)}, + BKey = {Bucket, Key}, try Index = get_index(BKey), ShortPL = riak_kv_util:get_index_n(BKey), case should_index(Index) of true -> - index(Obj, Reason, Ring, P, BKey, ShortPL, Index); + index(robj(Bucket, Key, Obj), Reason, Ring, P, BKey, ShortPL, Index); false -> - dont_index(Obj, Reason, P, BKey, ShortPL) + dont_index(robj(Bucket, Key, Obj), Reason, P, BKey, ShortPL) end, yz_stat:index_end(?YZ_TIME_ELAPSED(T1)) catch _:Err -> - yz_stat:index_fail(), - Trace = erlang:get_stacktrace(), - case Reason of - delete -> - ?ERROR("failed to delete docid ~p with error ~p because ~p", - [BKey, Err, Trace]); - _ -> - ?ERROR("failed to index object ~p with error ~p because ~p", - [BKey, Err, Trace]) - end + yz_stat:index_fail(), + Trace = erlang:get_stacktrace(), + case Reason of + delete -> + ?ERROR("failed to delete docid ~p with error ~p because ~p", + [BKey, Err, Trace]); + _ -> + ?ERROR("failed to index object ~p with error ~p because ~p", + [BKey, Err, Trace]) + end end; false -> ok @@ -227,6 +245,12 @@ index(Obj, Reason, P) -> ok end. +%% @private +robj(Bucket, Key, Obj) when is_binary(Obj) -> + riak_object:from_binary(Bucket, Key, Obj); +robj(_Bucket, _Key, Obj) -> + Obj. + %% @private %% %% @doc Update the hashtree so that AAE works but don't create any diff --git a/test/yz_component_tests.erl b/test/yz_component_tests.erl index 41b31ca6..967886bd 100644 --- a/test/yz_component_tests.erl +++ b/test/yz_component_tests.erl @@ -6,7 +6,7 @@ disable_index_test()-> yokozuna:disable(index), - ?assertEqual(yz_kv:index({},delete,{}), ok). + ?assertEqual(yz_kv:index(riak_object:new({<<"type">>, <<"bucket">>}, <<"key">>, <<"value">>), delete, {}), ok). disable_search_test()-> yokozuna:disable(search),