1+ from ravendb import GetTermsOperation
12from ravendb .documents .indexes .counters import AbstractJavaScriptCountersIndexCreationTask
23from ravendb .infrastructure .entities import User
3- from ravendb .infrastructure .orders import Company
4+ from ravendb .infrastructure .orders import Company , Address
45from ravendb .tests .test_base import TestBase
56
67
@@ -55,6 +56,38 @@ def __init__(self):
5556 self .maps = maps
5657
5758
59+ class AverageHeartRate_WithLoad (AbstractJavaScriptCountersIndexCreationTask ):
60+ class Result :
61+ def __init__ (self , heart_beat : float = None , city : str = None , count : int = None ):
62+ self .heart_beat = heart_beat
63+ self .city = city
64+ self .count = count
65+
66+ def __init__ (self ):
67+ super (AverageHeartRate_WithLoad , self ).__init__ ()
68+ mapp = (
69+ "counters.map('Users', 'heartRate', function (counter) {\n "
70+ "var user = load(counter.DocumentId, 'Users');\n "
71+ "var address = load(user.address_id, 'Addresses');\n "
72+ "return {\n "
73+ " heartBeat: counter.Value,\n "
74+ " count: 1,\n "
75+ " city: address.city\n "
76+ "};\n "
77+ "})"
78+ )
79+ self .maps = [mapp ]
80+
81+ self .reduce = (
82+ "groupBy(r => ({ city: r.city }))\n "
83+ " .aggregate(g => ({\n "
84+ " heartBeat: g.values.reduce((total, val) => val.heartBeat + total, 0) / g.values.reduce((total, val) => val.count + total, 0),\n "
85+ " city: g.key.city,\n "
86+ " count: g.values.reduce((total, val) => val.count + total, 0)\n "
87+ " }))"
88+ )
89+
90+
5891class TestBasicCountersIndexes_JavaScript (TestBase ):
5992 def setUp (self ):
6093 super (TestBasicCountersIndexes_JavaScript , self ).setUp ()
@@ -80,3 +113,36 @@ def test_basic_multi_map_index(self):
80113 with self .store .open_session () as session :
81114 results = list (session .query_index_type (MyMultiMapCounterIndex , MyMultiMapCounterIndex .Result ))
82115 self .assertEqual (3 , len (results ))
116+
117+ def test_basic_map_reduce_index_with_load (self ):
118+ with self .store .open_session () as session :
119+ for i in range (10 ):
120+ address = Address (city = "NY" )
121+ session .store (address , f"addresses/{ i } " )
122+
123+ user = User (address_id = f"addresses/{ i } " )
124+ session .store (user , f"users/{ i } " )
125+
126+ session .counters_for_entity (user ).increment ("heartRate" , 180 + i )
127+
128+ session .save_changes ()
129+
130+ time_series_index = AverageHeartRate_WithLoad ()
131+ index_name = time_series_index .index_name
132+ index_definition = time_series_index .create_index_definition ()
133+
134+ time_series_index .execute (self .store )
135+
136+ self .wait_for_indexing (self .store )
137+
138+ terms = self .store .maintenance .send (GetTermsOperation (index_name , "heartBeat" , None ))
139+ self .assertEqual (1 , len (terms ))
140+ self .assertIn ("184.5" , terms )
141+
142+ terms = self .store .maintenance .send (GetTermsOperation (index_name , "count" , None ))
143+ self .assertEqual (1 , len (terms ))
144+ self .assertIn ("10" , terms )
145+
146+ terms = self .store .maintenance .send (GetTermsOperation (index_name , "city" , None ))
147+ self .assertEqual (1 , len (terms ))
148+ self .assertIn ("ny" , terms )
0 commit comments