mapreduce - RavenDB MultiMapReduce Sum not returning the correct value -


sorry lengthy query, decided add whole test easier newbies me total brain-melt.

the using directives are:

using system.collections.generic; using system.linq; using nunit.framework; using raven.client; using raven.client.embedded; using raven.client.indexes; 

please leave feedback if i'm lengthy, possibly go wrong if add complete test?

[testfixture] public class clicksbyscoreandcardtest { private idocumentstore _documentstore; [setup] public void setup() { _documentstore = new embeddabledocumentstore {runinmemory = true}.initialize(); _documentstore.databasecommands.disableallcaching(); indexcreation.createindexes(typeof (clicksbysearchandproductcode).assembly, _documentstore); } [teardown] public void teardown() { _documentstore.dispose(); } [test] public void shouldcounttotalleadsmatchingpreference() { var userfirst = new user {id = "users/134"}; var usersecond = new user {id = "users/135"}; var searchfirst = new search(userfirst) { id = "searches/24", visitid = "visits/63" }; searchfirst.result = new result(); searchfirst.result.rows = new list<row>( new[] { new row {productcode = "creditcards/123", score = 6}, new row {productcode = "creditcards/124", score = 4} }); var searchsecond = new search(usersecond) { id = "searches/25", visitid = "visits/64" }; searchsecond.result = new result(); searchsecond.result.rows = new list<row>( new[] { new row {productcode = "creditcards/122", score = 9}, new row {productcode = "creditcards/124", score = 4} }); var searches = new list<search> { searchfirst, searchsecond }; var click = new click { visitid = "visits/64", productcode = "creditcards/122", searchid = "searches/25" }; using (var session = _documentstore.opensession()) { foreach (var search in searches) { session.store(search); } session.store(click); session.savechanges(); } ilist<clicksbysearchandproductcode.mapreduceresult> clicksbysearchandproductcode = null; using (var session = _documentstore.opensession()) { clicksbysearchandproductcode = session.query<clicksbysearchandproductcode.mapreduceresult>(clicksbysearchandproductcode.index_name) .customize(x => x.waitfornonstaleresults()).toarray(); } assert.that(clicksbysearchandproductcode.count, is.equalto(4)); var mapreduce = clicksbysearchandproductcode .first(x => x.searchid.equals("searches/25") && x.productcode.equals("creditcards/122")); assert.that(mapreduce.clicks, is.equalto(1)); } } public class clicksbysearchandproductcode : abstractmultimapindexcreationtask <clicksbysearchandproductcode.mapreduceresult> { public const string index_name = "clicksbysearchandproductcode"; public override string indexname { { return index_name; } } public class mapreduceresult { public string searchid { get; set; } public string productcode { get; set; } public string score { get; set; } public int clicks { get; set; } } public clicksbysearchandproductcode() { addmap<search>( searches => search in searches row in search.result.rows select new { searchid = search.id, productcode = row.productcode, score = row.score.tostring(), clicks = 0 }); addmap<click>( clicks => click in clicks select new { searchid = click.searchid, productcode = click.productcode, score = (string)null, clicks = 1 }); reduce = results => result in results group result new { searchid = result.searchid, productcode = result.productcode } g select new { searchid = g.key.searchid, productcode = g.key.productcode, score = g.first(x => x.score != null).score, clicks = g.sum(x => x.clicks) }; } } public class user { public string id { get; set; } } public class search { public string id { get; set; } public string visitid { get; set; } public user user { get; set; } private result _result = new result(); public result result { { return _result; } set { _result = value; } } public search(user user) { user = user; } } public class result { private ilist<row> _rows = new list<row>(); public ilist<row> rows { { return _rows; } set { _rows = value; } } } public class row { public string productcode { get; set; } public int score { get; set; } } public class click { public string visitid { get; set; } public string searchid { get; set; } public string productcode { get; set; } } 

my problem here expect count 1 in specific test, doesn't seem add clicks in click map , result 0 clicks. i'm totally confused, , i'm sure there simple solution problem, can't find it..

..hope there week-end warrior out there can take me under wings.

yes, brain-melt, me non-trivial, still. proper reduce should this:

reduce = results => result in results group result new { searchid = result.searchid, productcode = result.productcode } g select new { searchid = g.key.searchid, productcode = g.key.productcode, score = g.select(x=>x.score).firstordefault(), clicks = g.sum(x => x.clicks) }; 

not maps had score set non-null-value, , therefore original version had problem with:

score = g.first(x => x.score != null).score 

mental note, use:

score = g.select(x=>x.score).firstordefault() 

don't use:

score = g.first(x => x.score != null).score 

Comments

Popular posts from this blog

javascript - backbone.js Collection.add() doesn't `construct` (`initialize`) an object -

php - Get uncommon values from two or more arrays -

Adding duplicate array rows in Php -