Merge remote branch 'cloudant:refactor-mrview-index-get'

This closes #65

Signed-off-by: Eric Avdey <eiri@eiri.ca>
diff --git a/src/couch_mrview_index.erl b/src/couch_mrview_index.erl
index 95698bc..a65bc94 100644
--- a/src/couch_mrview_index.erl
+++ b/src/couch_mrview_index.erl
@@ -23,84 +23,77 @@
 -include_lib("couch_mrview/include/couch_mrview.hrl").
 
 
-get(Property, State) ->
-    case Property of
-        db_name ->
-            State#mrst.db_name;
-        idx_name ->
-            State#mrst.idx_name;
-        signature ->
-            State#mrst.sig;
-        update_seq ->
-            State#mrst.update_seq;
-        purge_seq ->
-            State#mrst.purge_seq;
-        update_options ->
-            Opts = State#mrst.design_opts,
-            IncDesign = couch_util:get_value(<<"include_design">>, Opts, false),
-            LocalSeq = couch_util:get_value(<<"local_seq">>, Opts, false),
-            SeqIndexed = couch_util:get_value(<<"seq_indexed">>, Opts, false),
-            KeySeqIndexed = couch_util:get_value(<<"keyseq_indexed">>, Opts, false),
-            if IncDesign -> [include_design]; true -> [] end
-                ++ if LocalSeq -> [local_seq]; true -> [] end
-                ++ if KeySeqIndexed -> [keyseq_indexed]; true -> [] end
-                ++ if SeqIndexed -> [seq_indexed]; true -> [] end;
-        fd ->
-            State#mrst.fd;
-        language ->
-            State#mrst.language;
-        views ->
-            State#mrst.views;
-        info ->
-            #mrst{
-                fd = Fd,
-                sig = Sig,
-                id_btree = IdBtree,
-                log_btree = LogBtree,
-                language = Lang,
-                update_seq = UpdateSeq,
-                purge_seq = PurgeSeq,
-                views = Views,
-                design_opts = Opts
-            } = State,
-            {ok, FileSize} = couch_file:bytes(Fd),
-            {ok, ExternalSize} = couch_mrview_util:calculate_external_size(Views),
-            LogBtSize = case LogBtree of
-                nil ->
-                    0;
-                _ ->
-                    couch_btree:size(LogBtree)
-            end,
-            ActiveSize = couch_btree:size(IdBtree) + LogBtSize + ExternalSize,
+get(db_name, #mrst{db_name = DbName}) ->
+    DbName;
+get(idx_name, #mrst{idx_name = IdxName}) ->
+    IdxName;
+get(signature, #mrst{sig = Signature}) ->
+    Signature;
+get(update_seq, #mrst{update_seq = UpdateSeq}) ->
+    UpdateSeq;
+get(purge_seq, #mrst{purge_seq = PurgeSeq}) ->
+    PurgeSeq;
+get(update_options, #mrst{design_opts = Opts}) ->
+    IncDesign = couch_util:get_value(<<"include_design">>, Opts, false),
+    LocalSeq = couch_util:get_value(<<"local_seq">>, Opts, false),
+    SeqIndexed = couch_util:get_value(<<"seq_indexed">>, Opts, false),
+    KeySeqIndexed = couch_util:get_value(<<"keyseq_indexed">>, Opts, false),
+    if IncDesign -> [include_design]; true -> [] end
+        ++ if LocalSeq -> [local_seq]; true -> [] end
+        ++ if KeySeqIndexed -> [keyseq_indexed]; true -> [] end
+        ++ if SeqIndexed -> [seq_indexed]; true -> [] end;
+get(fd, #mrst{fd = Fd}) ->
+    Fd;
+get(language, #mrst{language = Language}) ->
+    Language;
+get(views, #mrst{views = Views}) ->
+    Views;
+get(info, State) ->
+    #mrst{
+        fd = Fd,
+        sig = Sig,
+        id_btree = IdBtree,
+        log_btree = LogBtree,
+        language = Lang,
+        update_seq = UpdateSeq,
+        purge_seq = PurgeSeq,
+        views = Views,
+        design_opts = Opts
+    } = State,
+    {ok, FileSize} = couch_file:bytes(Fd),
+    {ok, ExternalSize} = couch_mrview_util:calculate_external_size(Views),
+    LogBtSize = case LogBtree of
+        nil ->
+            0;
+        _ ->
+            couch_btree:size(LogBtree)
+    end,
+    ActiveSize = couch_btree:size(IdBtree) + LogBtSize + ExternalSize,
 
-            IncDesign = couch_util:get_value(<<"include_design">>, Opts, false),
-            LocalSeq = couch_util:get_value(<<"local_seq">>, Opts, false),
-            SeqIndexed = couch_util:get_value(<<"seq_indexed">>, Opts, false),
-            KeySeqIndexed = couch_util:get_value(<<"keyseq_indexed">>, Opts, false),
-            UpdateOptions =
-                if IncDesign -> [<<"include_design">>]; true -> [] end
-                ++ if LocalSeq -> [<<"local_seq">>]; true -> [] end
-                ++ if KeySeqIndexed -> [<<"keyseq_indexed">>]; true -> [] end
-                ++ if SeqIndexed -> [<<"seq_indexed">>]; true -> [] end,
+    IncDesign = couch_util:get_value(<<"include_design">>, Opts, false),
+    LocalSeq = couch_util:get_value(<<"local_seq">>, Opts, false),
+    SeqIndexed = couch_util:get_value(<<"seq_indexed">>, Opts, false),
+    KeySeqIndexed = couch_util:get_value(<<"keyseq_indexed">>, Opts, false),
 
+    UpdateOptions0 = get(update_options, State),
+    UpdateOptions = [atom_to_binary(O, latin1) || O <- UpdateOptions0],
 
-            {ok, [
-                {signature, list_to_binary(couch_index_util:hexsig(Sig))},
-                {language, Lang},
-                {disk_size, FileSize}, % legacy
-                {data_size, ExternalSize}, % legacy
-                {sizes, {[
-                    {file, FileSize},
-                    {active, ActiveSize},
-                    {external, ExternalSize}
-                ]}},
-                {update_seq, UpdateSeq},
-                {purge_seq, PurgeSeq},
-                {update_options, UpdateOptions}
-            ]};
-        Other ->
-            throw({unknown_index_property, Other})
-    end.
+    {ok, [
+        {signature, list_to_binary(couch_index_util:hexsig(Sig))},
+        {language, Lang},
+        {disk_size, FileSize}, % legacy
+        {data_size, ExternalSize}, % legacy
+        {sizes, {[
+            {file, FileSize},
+            {active, ActiveSize},
+            {external, ExternalSize}
+        ]}},
+        {update_seq, UpdateSeq},
+        {purge_seq, PurgeSeq},
+        {update_options, UpdateOptions}
+    ]};
+get(Other, _) ->
+    throw({unknown_index_property, Other}).
 
 
 init(Db, DDoc) ->