couchdb-erlang mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From david martin <david.mar...@lymegreen.co.uk>
Subject Re: Hi! Here is a Sample of A general purpose crypto map/reduce Erlang function for you.
Date Mon, 28 Oct 2013 12:55:33 GMT
On 28/10/13 04:18, Andrey Kuprianov wrote:
> Hi all.
>
> Im interested in being able to do some Erlang especially when writing
> design docs. At very least it would be nice to follow some examples and
> pick up some basic Erlang programming skills.
>
> Btw (and probably everyone knows anyway), there's a great book on Erlang
> and it's available online on http://learnyousomeerlang.com/.
>
>    Cheers,
>
>      Andrey
>
Here is a generic piece of Erlang code I wrote some time ago. Paste into futon to run.

%----------------------------------------------------------------------
% A general purpose crypto map/reduce Erlang function pair.
% This Function performs a crypto md5 hash sum of all the JSON keys in every document.
% This enables verification of the existence of every key in every document or enables the
% differing documents to be identified.

fun({Doc}) ->
         Attachments = proplists:get_value(<<"_attachments">>, Doc),
        %returns a proplist or the atom undefined

         DocKeys = proplists:get_keys(Doc),
        % returns list of all keys in doc

         CryptoContextDocKeys=crypto:md5_init(),

         CryptoContextDocKeysFinal =
              lists:foldr(fun(Dk,CryptoAccum)->
                    crypto:md5_update(CryptoAccum,crypto:md5(Dk))
              end, CryptoContextDocKeys,DocKeys),

         CryptoNameAllKeys =
         list_to_binary(lists:flatten(
             [io_lib:format("~2.16.0b",[N]) || <<N>>
             <= crypto:md5_final(CryptoContextDocKeysFinal)])),

           Emit([CryptoNameAllKeys,DocKeys] ,2),

         case Attachments of

            {Propslist1}-> PropsKeysList=proplists:get_keys(Propslist1),
                lists:foreach(fun(K)->
{[{<<"content_type">>,Content_type1},{<<"revpos">>,Revpos1},
{<<"digest">>,Mp5digest1},{<<"length">>, Length1},{<<"stub">>,
Stub1}]}
                   =  proplists:get_value(K, Propslist1) ,
Emit([Content_type1,Stub1,Length1,Mp5digest1,K,Revpos1], 1)
               end, PropsKeysList);

          undefined-> ok

         end %end of Attachments case

end.%end of view map function

%----------------------------------------------------------------------

fun(Keys,Values,ReReduce)->

case ReReduce of
     true->lists:sum(Values);
     false->length(Values)
end
end.%end of view reduce function
%----------------------------------------------------------------------

sample data
{
    "_id": "Competition 300608.csv1",
    "_rev": "1-e87429f1dbea2db5cfd242b3398e32ee",
    "URN": "130908",
    "LA": "806",
    "LA NAME": "Middlesbrough",
    "ESTAB": "6907",
    "SCHOOL NAME": "Macmillan Academy",
    "STREET": "PO Box 8",
    "LOCALITY": "Stockton Road",
    "ADDRESS 3": "",
    " TOWN": "Middlesbrough",
    "COUNTY": "Cleveland",
    "POSTCODE": "TS5 4YU",
    "TEL STD": "01642",
    "TEL NO": "800800",
    "HEAD TITLE": "Mr",
    "HEAD FIRST NAME": "K U",
    "HEAD LAST NAME": "Junior",
    "HEAD HONOURS": "O.B.E",
    "TYPE OF ESTABLISHMENT": "Academies",
    "PHASE OF EDUCATION": "[Not Applicable]",
    "STAT LOW AGE": "11",
    "STAT HIGH AGE": "19"
}
%----------------------------------------------------------------------

sample output
       Map Value
["947fad4183f054d4f6c50bd956dbb576", ["_rev", "URN", "COUNTY", "_id", "POSTCODE", "LA", "
TOWN", "HEAD LAST NAME", "TYPE OF ESTABLISHMENT", "STAT HIGH AGE", "ESTAB", "ADDRESS 3", "TEL
STD", "SCHOOL NAME", "HEAD TITLE", "PHASE OF EDUCATION", "LOCALITY", "TEL NO", "LA NAME",
"STREET", "HEAD FIRST NAME", "HEAD HONOURS", "STAT LOW AGE"]]
ID: Competition 300608.csv1

Exact Reduce value
["947fad4183f054d4f6c50bd956dbb576", ["_rev", "URN", "COUNTY", "_id", "POSTCODE", "LA", "
TOWN", "HEAD LAST NAME", "TYPE OF ESTABLISHMENT", "STAT HIGH AGE", "ESTAB", "ADDRESS 3", "TEL
STD", "SCHOOL NAME", "HEAD TITLE", "PHASE OF EDUCATION", "LOCALITY", "TEL NO", "LA NAME",
"STREET", "HEAD FIRST NAME", "HEAD HONOURS", "STAT LOW AGE"]]
22518     %no. docs in database.
%----------------------------------------------------------------------


-- 
David Martin


Mime
View raw message