Skip to content

Commit 476592e

Browse files
committed
RDBC-692 BasicCountersIndexes_JavaScript::basicMultiMapIndex
1 parent 305459f commit 476592e

File tree

2 files changed

+154
-0
lines changed

2 files changed

+154
-0
lines changed

ravendb/documents/indexes/counters.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
FieldTermVector,
99
IndexDefinition,
1010
IndexSourceType,
11+
IndexFieldOptions,
12+
IndexType,
1113
)
1214
from ravendb.documents.indexes.index_creation import AbstractIndexCreationTaskBase, AbstractIndexDefinitionBuilder
1315
from ravendb.documents.indexes.spatial.configuration import SpatialOptions, SpatialOptionsFactory
@@ -119,3 +121,73 @@ def create_index_definition(self) -> CountersIndexDefinition:
119121
index_definition_builder.deployment_mode = self.deployment_mode
120122

121123
return index_definition_builder.to_index_definition(self.conventions)
124+
125+
126+
class AbstractJavaScriptCountersIndexCreationTask(AbstractIndexCreationTaskBase[CountersIndexDefinition]):
127+
def __init__(self):
128+
super(AbstractJavaScriptCountersIndexCreationTask, self).__init__()
129+
self._definition = CountersIndexDefinition()
130+
131+
@property
132+
def maps(self) -> Set[str]:
133+
return self._definition.maps
134+
135+
@maps.setter
136+
def maps(self, value: Set[str]):
137+
self._definition.maps = value
138+
139+
@property
140+
def fields(self) -> Dict[str, IndexFieldOptions]:
141+
return self._definition.fields
142+
143+
@fields.setter
144+
def fields(self, value: Dict[str, IndexFieldOptions]):
145+
self._definition.fields = value
146+
147+
@property
148+
def reduce(self) -> str:
149+
return self._definition.reduce
150+
151+
@reduce.setter
152+
def reduce(self, value: Dict[str, IndexFieldOptions]):
153+
self._definition.reduce = value
154+
155+
@property
156+
def is_map_reduce(self) -> bool:
157+
return self.reduce is not None
158+
159+
@property
160+
def output_reduce_to_collection(self) -> str:
161+
return self._definition.output_reduce_to_collection
162+
163+
@output_reduce_to_collection.setter
164+
def output_reduce_to_collection(self, value: Dict[str, IndexFieldOptions]):
165+
self._definition.output_reduce_to_collection = value
166+
167+
@property
168+
def pattern_references_collection_name(self) -> str:
169+
return self._definition.pattern_references_collection_name
170+
171+
@pattern_references_collection_name.setter
172+
def pattern_references_collection_name(self, value: Dict[str, IndexFieldOptions]):
173+
self._definition.pattern_references_collection_name = value
174+
175+
@property
176+
def pattern_for_output_reduce_to_collection_references(self) -> str:
177+
return self._definition.pattern_for_output_reduce_to_collection_references
178+
179+
@pattern_for_output_reduce_to_collection_references.setter
180+
def pattern_for_output_reduce_to_collection_references(self, value: Dict[str, IndexFieldOptions]):
181+
self._definition.pattern_for_output_reduce_to_collection_references = value
182+
183+
def create_index_definition(self) -> CountersIndexDefinition:
184+
self._definition.name = self.index_name
185+
self._definition.type = IndexType.JAVA_SCRIPT_MAP_REDUCE if self.is_map_reduce else IndexType.JAVA_SCRIPT_MAP
186+
self._definition.additional_sources = self.additional_sources or {}
187+
self._definition.additional_assemblies = self.additional_assemblies or set()
188+
self._definition.configuration = self.configuration
189+
self._definition.lock_mode = self.lock_mode
190+
self._definition.priority = self.priority
191+
self._definition.state = self.state
192+
self._definition.deployment_mode = self.deployment_mode
193+
return self._definition
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
from ravendb.documents.indexes.counters import AbstractJavaScriptCountersIndexCreationTask
2+
from ravendb.infrastructure.entities import User
3+
from ravendb.infrastructure.orders import Company
4+
from ravendb.tests.test_base import TestBase
5+
6+
7+
class MyCounterIndex(AbstractJavaScriptCountersIndexCreationTask):
8+
def __init__(self):
9+
super(MyCounterIndex, self).__init__()
10+
self._maps = [
11+
"counters.map('Companies', 'HeartRate', function (counter) {\n return {\n heartBeat: counter.Value,\nname: counter.Name,\nuser: counter.DocumentId\n};\n})"
12+
]
13+
14+
15+
class MyMultiMapCounterIndex(AbstractJavaScriptCountersIndexCreationTask):
16+
class Result:
17+
def __init__(self, heart_beat: float = None, name: str = None, user: str = None):
18+
self.heart_beat = heart_beat
19+
self.name = name
20+
self.user = user
21+
22+
def __init__(self):
23+
super(MyMultiMapCounterIndex, self).__init__()
24+
maps = set()
25+
maps.add(
26+
"counters.map('Companies', 'heartRate', function (counter) {\n"
27+
+ "return {\n"
28+
+ " heartBeat: counter.Value,\n"
29+
+ " name: counter.Name,\n"
30+
+ " user: counter.DocumentId\n"
31+
+ "};\n"
32+
+ "})"
33+
)
34+
35+
maps.add(
36+
"counters.map('Companies', 'heartRate2', function (counter) {\n"
37+
+ "return {\n"
38+
+ " heartBeat: counter.Value,\n"
39+
+ " name: counter.Name,\n"
40+
+ " user: counter.DocumentId\n"
41+
+ "};\n"
42+
+ "})"
43+
)
44+
45+
maps.add(
46+
"counters.map('Users', 'heartRate', function (counter) {\n"
47+
+ "return {\n"
48+
+ " heartBeat: counter.Value,\n"
49+
+ " name: counter.Name,\n"
50+
+ " user: counter.DocumentId\n"
51+
+ "};\n"
52+
+ "})"
53+
)
54+
55+
self.maps = maps
56+
57+
58+
class TestBasicCountersIndexes_JavaScript(TestBase):
59+
def setUp(self):
60+
super(TestBasicCountersIndexes_JavaScript, self).setUp()
61+
62+
def test_basic_multi_map_index(self):
63+
time_series_index = MyMultiMapCounterIndex()
64+
time_series_index.execute(self.store)
65+
66+
with self.store.open_session() as session:
67+
company = Company()
68+
session.store(company)
69+
70+
session.counters_for_entity(company).increment("heartRate", 3)
71+
session.counters_for_entity(company).increment("heartRate2", 5)
72+
73+
user = User()
74+
session.store(user)
75+
session.counters_for_entity(user).increment("heartRate", 2)
76+
session.save_changes()
77+
78+
self.wait_for_indexing(self.store)
79+
80+
with self.store.open_session() as session:
81+
results = list(session.query_index_type(MyMultiMapCounterIndex, MyMultiMapCounterIndex.Result))
82+
self.assertEqual(3, len(results))

0 commit comments

Comments
 (0)