Skip to content

Commit 3fe5d4e

Browse files
Add State Query API
Signed-off-by: Xavier Geerinck <[email protected]>
1 parent c005d80 commit 3fe5d4e

File tree

6 files changed

+149
-3
lines changed

6 files changed

+149
-3
lines changed

documentation/development.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ Tests are written per protocol layer: http or grpc. This is done because Dapr re
3636
# Ports: 1883 = TCP MQTT Port | 8081 = HTTP API | 8083 = MQTT/SSL Port | 8883 = MQTT/Websocket/SSL Port | 8084 = MQTT/Websocket Port | 18083 = Dashboard
3737
docker run -d --rm --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx
3838

39+
# Start MongoDB for State Query
40+
docker run -d --rm --name mongodb -p 27017:27017 mongo
41+
3942
# Run Unit Tests
4043
npm run test:unit:main
4144
npm run test:unit:actors

src/implementation/Client/HTTPClient/state.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export default class HTTPClientState implements IClientState {
7171
"Content-Type": "application/json"
7272
},
7373
body: JSON.stringify({
74-
query
74+
...query
7575
})
7676
});
7777

src/implementation/Server/DaprServer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export default class DaprServer {
100100
}
101101

102102
async stopServer(): Promise<void> {
103-
await this.daprServer.stopServer();
103+
await this.daprServer.stop();
104104
}
105105

106106
getDaprClient(): IServer {

src/types/StateQuery.type.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Enumerable } from "./Enumerable.type"
33
export type StateQueryType = {
44
filter: StateQueryFilter;
55
sort: StateQuerySort[];
6-
pagination: StateQueryPagination;
6+
page: StateQueryPagination;
77
}
88

99
type StateQuerySort = {

test/components/state-mongodb.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
apiVersion: dapr.io/v1alpha1
2+
kind: Component
3+
metadata:
4+
name: state-mongodb
5+
spec:
6+
type: state.mongodb
7+
version: v1
8+
metadata:
9+
- name: host
10+
value: localhost:27017

test/e2e/main.http.test.ts

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,139 @@ describe('http/main', () => {
341341
expect(resTransactionDelete).toEqual('');
342342
expect(resTransactionUpsert).toEqual('my-new-data-1');
343343
});
344+
345+
it('should be able to query state', async () => {
346+
// First save our data
347+
await client.state.save("state-mongodb", [
348+
{
349+
key: 'key-1',
350+
value: {
351+
person: {
352+
id: 1036,
353+
org: "Dev Ops"
354+
},
355+
city: "Seattle",
356+
state: "WA"
357+
}
358+
},
359+
{
360+
key: 'key-2',
361+
value: {
362+
person: {
363+
id: 1037,
364+
org: "Developers"
365+
},
366+
city: "Seattle",
367+
state: "WA"
368+
},
369+
},
370+
{
371+
key: 'key-3',
372+
value: {
373+
person: {
374+
id: 1038,
375+
org: "Developers"
376+
},
377+
city: "Seattle",
378+
state: "WA"
379+
},
380+
},
381+
{
382+
key: 'key-4',
383+
value: {
384+
person: {
385+
id: 1039,
386+
org: "Dev Ops"
387+
},
388+
city: "Spokane",
389+
state: "WA"
390+
},
391+
},
392+
{
393+
key: 'key-5',
394+
value: {
395+
person: {
396+
id: 1040,
397+
org: "Developers"
398+
},
399+
city: "Seattle",
400+
state: "WA"
401+
},
402+
},
403+
{
404+
key: 'key-6',
405+
value: {
406+
person: {
407+
id: 1041,
408+
org: "Dev Ops"
409+
},
410+
city: "Seattle",
411+
state: "WA"
412+
},
413+
},
414+
{
415+
key: 'key-7',
416+
value: {
417+
person: {
418+
id: 1042,
419+
org: "Finance"
420+
},
421+
city: "Brussels",
422+
state: "Flemish-Brabant"
423+
},
424+
},
425+
{
426+
key: 'key-8',
427+
value: {
428+
person: {
429+
id: 1043,
430+
org: "Finance"
431+
},
432+
city: "San Francisco",
433+
state: "CA"
434+
},
435+
}
436+
]);
437+
438+
const res = await client.state.query("state-mongodb", {
439+
filter: {
440+
OR: [
441+
{
442+
EQ: { "value.person.org": "Dev Ops" }
443+
},
444+
{
445+
"AND": [
446+
{
447+
"EQ": { "value.person.org": "Finance" }
448+
},
449+
{
450+
"IN": { "value.state": ["CA", "WA"] }
451+
}
452+
]
453+
}
454+
]
455+
},
456+
sort: [
457+
{
458+
key: "value.state",
459+
order: "DESC"
460+
}
461+
],
462+
page: {
463+
limit: 10
464+
}
465+
});
466+
467+
expect(res.results.length).toEqual(4);
468+
expect(res.results.map(i => i.key).indexOf("key-1")).toBeGreaterThan(-1);
469+
expect(res.results.map(i => i.key).indexOf("key-4")).toBeGreaterThan(-1);
470+
expect(res.results.map(i => i.key).indexOf("key-6")).toBeGreaterThan(-1);
471+
expect(res.results.map(i => i.key).indexOf("key-8")).toBeGreaterThan(-1);
472+
473+
for (let i = 1; i <= 8; i++) {
474+
await client.state.delete("state-mongodb", `key-${i}`)
475+
}
476+
});
344477
});
345478
});
346479
});

0 commit comments

Comments
 (0)