@@ -6,6 +6,7 @@ defmodule ExlasticSearch.RepoTest do
6
6
alias ExlasticSearch.Repo
7
7
alias ExlasticSearch.TypelessMultiVersionTestModel , as: TypelessMVTestModel
8
8
alias ExlasticSearch.TypelessTestModel
9
+ alias ExlasticSearch.TypelessTestModel2
9
10
10
11
require Logger
11
12
@@ -14,6 +15,10 @@ defmodule ExlasticSearch.RepoTest do
14
15
Repo . create_index ( TypelessTestModel , :es8 )
15
16
{ :ok , % { status_code: 200 } } = Repo . create_mapping ( TypelessTestModel , :es8 )
16
17
18
+ Repo . delete_index ( TypelessTestModel2 , :es8 )
19
+ Repo . create_index ( TypelessTestModel2 , :es8 )
20
+ { :ok , % { status_code: 200 } } = Repo . create_mapping ( TypelessTestModel2 , :es8 )
21
+
17
22
Repo . delete_index ( TypelessMVTestModel , :es8 )
18
23
Repo . create_index ( TypelessMVTestModel , :es8 )
19
24
{ :ok , % { status_code: 200 } } = Repo . create_mapping ( TypelessMVTestModel , :es8 )
@@ -44,6 +49,62 @@ defmodule ExlasticSearch.RepoTest do
44
49
end
45
50
46
51
describe "#bulk" do
52
+ test "It will bulk update from es" do
53
+ model1 = % ExlasticSearch.TypelessTestModel { id: Ecto.UUID . generate ( ) , name: "test 1" }
54
+ model2 = % ExlasticSearch.TypelessTestModel { id: Ecto.UUID . generate ( ) , name: "test 2" }
55
+
56
+ Repo . index ( model1 )
57
+ Repo . index ( model2 )
58
+
59
+ { :ok , _ } =
60
+ Repo . bulk ( [
61
+ { :update , ExlasticSearch.TypelessTestModel , model1 . id , % { doc: % { name: "test 1 edited" } } } ,
62
+ { :update , ExlasticSearch.TypelessTestModel , model2 . id , % { doc: % { name: "test 2 edited" } } }
63
+ ] )
64
+
65
+ { :ok , % { _source: data1 } } = Repo . get ( model1 )
66
+ { :ok , % { _source: data2 } } = Repo . get ( model2 )
67
+
68
+ assert data1 . name == "test 1 edited"
69
+ assert data2 . name == "test 2 edited"
70
+ end
71
+
72
+ test "It will bulk update nested from es" do
73
+ model1 = % ExlasticSearch.TypelessTestModel {
74
+ id: Ecto.UUID . generate ( ) ,
75
+ teams: [ % { name: "arsenal" , rating: 100 } ]
76
+ }
77
+
78
+ model2 = % ExlasticSearch.TypelessTestModel {
79
+ id: Ecto.UUID . generate ( ) ,
80
+ teams: [ % { name: "tottenham" , rating: 0 } ]
81
+ }
82
+
83
+ Repo . index ( model1 )
84
+ Repo . index ( model2 )
85
+
86
+ source =
87
+ "ctx._source.teams.find(cf -> cf.name == params.data.name).rating = params.data.rating"
88
+
89
+ data1 = % { script: % { source: source , params: % { data: % { name: "arsenal" , rating: 1000 } } } }
90
+ data2 = % { script: % { source: source , params: % { data: % { name: "tottenham" , rating: - 1 } } } }
91
+
92
+ { :ok , _ } =
93
+ Repo . bulk ( [
94
+ { :update , ExlasticSearch.TypelessTestModel , model1 . id , data1 } ,
95
+ { :update , ExlasticSearch.TypelessTestModel , model2 . id , data2 }
96
+ ] )
97
+
98
+ { :ok , % { _source: % { teams: [ team1 ] } } } = Repo . get ( model1 )
99
+ { :ok , % { _source: % { teams: [ team2 ] } } } = Repo . get ( model2 )
100
+
101
+ assert team1 . name == "arsenal"
102
+ assert team1 . rating == 1000
103
+
104
+ assert team2 . name == "tottenham"
105
+ assert team2 . rating == - 1
106
+ end
107
+
47
108
test "It will bulk index/delete from es 8+" do
48
109
model = % ExlasticSearch.TypelessTestModel { id: Ecto.UUID . generate ( ) }
49
110
{ :ok , _ } = Repo . bulk ( [ { :index , model , :es8 } ] , :es8 )
@@ -213,6 +274,44 @@ defmodule ExlasticSearch.RepoTest do
213
274
assert Enum . find ( results , & ( & 1 . _id == id1 ) )
214
275
assert Enum . find ( results , & ( & 1 . _id == id2 ) )
215
276
end
277
+
278
+ test "It will search in multiple indexes" do
279
+ id1 = Ecto.UUID . generate ( )
280
+ id2 = Ecto.UUID . generate ( )
281
+ id3 = Ecto.UUID . generate ( )
282
+ id4 = Ecto.UUID . generate ( )
283
+
284
+ rand_name = String . replace ( Ecto.UUID . generate ( ) , "-" , "" )
285
+
286
+ model1 = % TypelessTestModel { id: id1 , name: rand_name }
287
+ model2 = % TypelessTestModel { id: id2 , name: rand_name }
288
+ model3 = % TypelessTestModel { id: id3 , name: "something else" }
289
+
290
+ model4 = % TypelessTestModel2 { id: id4 , name: rand_name }
291
+
292
+ Repo . index ( model1 )
293
+ Repo . index ( model2 )
294
+ Repo . index ( model3 )
295
+
296
+ Repo . index ( model4 )
297
+
298
+ Repo . refresh ( TypelessTestModel )
299
+ Repo . refresh ( TypelessTestModel2 )
300
+
301
+ query = % ExlasticSearch.Query {
302
+ queryable: [ TypelessTestModel , TypelessTestModel2 ] ,
303
+ filter: [
304
+ % { term: % { name: rand_name } }
305
+ ]
306
+ }
307
+
308
+ { :ok , % { hits: % { hits: results } } } = Repo . search ( query , [ ] )
309
+
310
+ assert length ( results ) == 3
311
+ assert Enum . find ( results , & ( & 1 . _id == id1 ) )
312
+ assert Enum . find ( results , & ( & 1 . _id == id2 ) )
313
+ assert Enum . find ( results , & ( & 1 . _id == id4 ) )
314
+ end
216
315
end
217
316
218
317
defp exists? ( model , index ) do
0 commit comments