1
+ from ravendb import GetTermsOperation
1
2
from ravendb .documents .indexes .counters import AbstractJavaScriptCountersIndexCreationTask
2
3
from ravendb .infrastructure .entities import User
3
- from ravendb .infrastructure .orders import Company
4
+ from ravendb .infrastructure .orders import Company , Address
4
5
from ravendb .tests .test_base import TestBase
5
6
6
7
@@ -55,6 +56,38 @@ def __init__(self):
55
56
self .maps = maps
56
57
57
58
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
+
58
91
class TestBasicCountersIndexes_JavaScript (TestBase ):
59
92
def setUp (self ):
60
93
super (TestBasicCountersIndexes_JavaScript , self ).setUp ()
@@ -80,3 +113,36 @@ def test_basic_multi_map_index(self):
80
113
with self .store .open_session () as session :
81
114
results = list (session .query_index_type (MyMultiMapCounterIndex , MyMultiMapCounterIndex .Result ))
82
115
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