Skip to content

Commit ed07116

Browse files
committed
Done.
1 parent bfb9ea0 commit ed07116

File tree

5 files changed

+81
-68
lines changed

5 files changed

+81
-68
lines changed

docs/overview/aggregations/elastic_aggregation_ip_range.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ val aggregation: IpRangeAggregation =
2424
)
2525
```
2626

27-
You can create an IpRangeAggregation using the ipRangeAggregation method in the following way:
27+
You can create an `IpRange` aggregation using the `IpRangeAggregation` method this way:
2828
```scala
2929
val aggregation: IpRangeAggregation =
3030
ipRangeAggregation(
@@ -54,6 +54,7 @@ If you want to explicitly set the keyed property:
5454
```scala
5555
val multipleAggregations =
5656
ipRangeAggregation("ip_range_agg", "ipField", Chunk(IpRange.IpRangeBound(to = Some("10.0.0.5"))))
57+
.keyedOn
5758
.withAgg(maxAggregation("maxAgg", "someField"))
5859
```
5960

modules/integration/src/test/scala/zio/elasticsearch/HttpExecutorSpec.scala

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616

1717
package zio.elasticsearch
1818

19-
import zio.Chunk
2019
import zio.elasticsearch.ElasticAggregation._
2120
import zio.elasticsearch.ElasticHighlight.highlight
2221
import zio.elasticsearch.ElasticQuery.{script => _, _}
2322
import zio.elasticsearch.ElasticSort.sortBy
23+
import zio.elasticsearch.aggregation.IpRange.IpRangeBound
2424
import zio.elasticsearch.aggregation.{AggregationOrder, IpRange}
2525
import zio.elasticsearch.data.GeoPoint
2626
import zio.elasticsearch.domain.{PartialTestDocument, TestDocument, TestSubDocument}
@@ -41,6 +41,7 @@ import zio.stream.{Sink, ZSink}
4141
import zio.test.Assertion._
4242
import zio.test.TestAspect._
4343
import zio.test._
44+
import zio.{Chunk, NonEmptyChunk}
4445

4546
import java.time.LocalDate
4647
import scala.util.Random
@@ -467,51 +468,51 @@ object HttpExecutorSpec extends IntegrationSpec {
467468
Executor.execute(ElasticRequest.createIndex(firstSearchIndex)),
468469
Executor.execute(ElasticRequest.deleteIndex(firstSearchIndex)).orDie
469470
),
470-
test("aggregate using ip range aggregation") {
471-
checkOnce(genDocumentId, genTestDocument, genDocumentId, genTestDocument) { (docIdA, docA, docIdB, docB) =>
472-
val updatedA = docA.copy(stringField = "192.168.1.10")
473-
val updatedB = docB.copy(stringField = "192.168.1.200")
471+
test("aggregate using IpRange aggregation") {
472+
checkOnce(genDocumentId, genTestDocument, genDocumentId, genTestDocument) {
473+
(firstDocumentId, firstDocument, secondDocumentId, secondDocument) =>
474+
val updatedA = firstDocument.copy(stringField = "10.0.0.10")
475+
val updatedB = secondDocument.copy(stringField = "10.0.0.200")
474476

475-
for {
476-
_ <- Executor.execute(ElasticRequest.deleteByQuery(firstSearchIndex, matchAll))
477+
for {
478+
_ <- Executor.execute(ElasticRequest.deleteByQuery(firstSearchIndex, matchAll))
477479

478-
_ <- Executor.execute(ElasticRequest.upsert[TestDocument](firstSearchIndex, docIdA, updatedA))
479-
_ <- Executor.execute(
480-
ElasticRequest
481-
.upsert[TestDocument](firstSearchIndex, docIdB, updatedB)
482-
.refreshTrue
483-
)
480+
_ <-
481+
Executor.execute(ElasticRequest.upsert[TestDocument](firstSearchIndex, firstDocumentId, updatedA))
482+
_ <- Executor.execute(
483+
ElasticRequest
484+
.upsert[TestDocument](firstSearchIndex, secondDocumentId, updatedB)
485+
.refreshTrue
486+
)
484487

485-
aggregation = IpRange(
486-
name = "ip_range_agg",
487-
field = "ipField",
488-
ranges = Chunk(
489-
IpRange.IpRangeBound(to = Some("192.168.1.100")),
490-
IpRange.IpRangeBound(
491-
from = Some("192.168.1.100"),
492-
to = Some("192.168.1.255")
493-
)
494-
),
495-
keyed = None,
496-
subAggregations = None
497-
)
488+
aggregation = IpRange(
489+
name = "ip_ranges",
490+
field = "ipField",
491+
ranges = NonEmptyChunk(
492+
IpRangeBound(to = Some("10.0.0.5")),
493+
IpRangeBound(from = Some("10.0.0.5"))
494+
),
495+
keyed = None,
496+
subAggregations = None
497+
)
498498

499-
result <- Executor.execute(ElasticRequest.aggregate(firstSearchIndex, aggregation))
500-
agg <- result.aggregation("ip_range_agg")
501-
} yield assertTrue(agg.nonEmpty)
499+
result <-
500+
Executor
501+
.execute(ElasticRequest.aggregate(firstSearchIndex, aggregation))
502+
.aggregations
503+
} yield assert(result)(isNonEmpty)
502504
}
503505
} @@ around(
504506
Executor.execute(ElasticRequest.createIndex(firstSearchIndex)),
505507
Executor.execute(ElasticRequest.deleteIndex(firstSearchIndex)).orDie
506508
),
507-
test("aggregate using ip range aggregation with CIDR masks") {
509+
test("aggregate using Ip range aggregation with CIDR masks") {
508510
checkOnce(genDocumentId, genTestDocument, genDocumentId, genTestDocument) { (docId1, doc1, docId2, doc2) =>
509511
val updated1 = doc1.copy(stringField = "10.0.0.10")
510512
val updated2 = doc2.copy(stringField = "10.0.0.120")
511513

512514
for {
513515
_ <- Executor.execute(ElasticRequest.deleteByQuery(firstSearchIndex, matchAll))
514-
515516
_ <- Executor.execute(ElasticRequest.upsert[TestDocument](firstSearchIndex, docId1, updated1))
516517
_ <- Executor.execute(
517518
ElasticRequest
@@ -522,17 +523,18 @@ object HttpExecutorSpec extends IntegrationSpec {
522523
aggregation = IpRange(
523524
name = "cidr_agg",
524525
field = "ipField",
525-
ranges = Chunk(
526-
IpRange.IpRangeBound(mask = Some("10.0.0.0/25")),
527-
IpRange.IpRangeBound(mask = Some("10.0.0.128/25"))
526+
ranges = NonEmptyChunk(
527+
IpRangeBound(mask = Some("10.0.0.0/25")),
528+
IpRangeBound(mask = Some("10.0.0.128/25"))
528529
),
529530
keyed = None,
530531
subAggregations = None
531532
)
532533

533-
result <- Executor.execute(ElasticRequest.aggregate(firstSearchIndex, aggregation))
534-
agg <- result.aggregation("cidr_agg")
535-
} yield assertTrue(agg.nonEmpty)
534+
result <- Executor
535+
.execute(ElasticRequest.aggregate(firstSearchIndex, aggregation))
536+
.aggregations
537+
} yield assert(result)(isNonEmpty)
536538
}
537539
} @@ around(
538540
Executor.execute(ElasticRequest.createIndex(firstSearchIndex)),

modules/library/src/main/scala/zio/elasticsearch/ElasticAggregation.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@
1616

1717
package zio.elasticsearch
1818

19-
import zio.Chunk
19+
import zio.elasticsearch.aggregation.IpRange.IpRangeBound
2020
import zio.elasticsearch.aggregation._
2121
import zio.elasticsearch.query.ElasticQuery
2222
import zio.elasticsearch.script.Script
23+
import zio.{Chunk, NonEmptyChunk}
2324

2425
object ElasticAggregation {
2526

@@ -178,7 +179,7 @@ object ElasticAggregation {
178179
def ipRangeAggregation(
179180
name: String,
180181
field: Field[_, String],
181-
ranges: Chunk[IpRange.IpRangeBound]
182+
ranges: NonEmptyChunk[IpRangeBound]
182183
): IpRangeAggregation =
183184
IpRange(name = name, field = field.toString, ranges = ranges, keyed = None, subAggregations = None)
184185

@@ -196,7 +197,7 @@ object ElasticAggregation {
196197
* @return
197198
* An instance of [[IpRangeAggregation]] configured with the provided parameters.
198199
*/
199-
def ipRangeAggregation(name: String, field: String, ranges: Chunk[IpRange.IpRangeBound]): IpRangeAggregation =
200+
def ipRangeAggregation(name: String, field: String, ranges: NonEmptyChunk[IpRangeBound]): IpRangeAggregation =
200201
IpRange(name = name, field = field, ranges = ranges, keyed = None, subAggregations = None)
201202

202203
/**

modules/library/src/main/scala/zio/elasticsearch/aggregation/Aggregations.scala

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@
1616

1717
package zio.elasticsearch.aggregation
1818

19-
import zio.Chunk
2019
import zio.elasticsearch.ElasticAggregation.multipleAggregations
2120
import zio.elasticsearch.ElasticPrimitive.ElasticPrimitiveOps
21+
import zio.elasticsearch.aggregation.IpRange.IpRangeBound
2222
import zio.elasticsearch.aggregation.options._
2323
import zio.elasticsearch.query.ElasticQuery
2424
import zio.elasticsearch.query.sort.Sort
2525
import zio.elasticsearch.script.Script
2626
import zio.json.ast.Json
2727
import zio.json.ast.Json.{Arr, Obj}
28+
import zio.{Chunk, NonEmptyChunk}
2829

2930
sealed trait ElasticAggregation { self =>
3031
private[elasticsearch] def toJson: Json
@@ -207,15 +208,15 @@ private[elasticsearch] final case class Filter(
207208

208209
sealed trait IpRangeAggregation extends SingleElasticAggregation with WithAgg with WithSubAgg[IpRangeAggregation]
209210

210-
final case class IpRange(
211+
private[elasticsearch] final case class IpRange(
211212
name: String,
212213
field: String,
213-
ranges: Chunk[IpRange.IpRangeBound],
214+
ranges: NonEmptyChunk[IpRangeBound],
214215
keyed: Option[Boolean],
215216
subAggregations: Option[Chunk[SingleElasticAggregation]]
216217
) extends IpRangeAggregation { self =>
217218

218-
def keyed(value: Boolean): IpRangeAggregation = self.copy(keyed = Some(value))
219+
def keyedOn: IpRangeAggregation = self.copy(keyed = Some(true))
219220

220221
def withAgg(aggregation: SingleElasticAggregation): MultipleAggregations =
221222
multipleAggregations.aggregations(self, aggregation)
@@ -248,7 +249,16 @@ object IpRange {
248249
to: Option[String] = None,
249250
mask: Option[String] = None,
250251
key: Option[String] = None
251-
) {
252+
) { self =>
253+
254+
def from(value: String): IpRangeBound = self.copy(from = Some(value))
255+
256+
def to(value: String): IpRangeBound = self.copy(to = Some(value))
257+
258+
def mask(value: String): IpRangeBound = self.copy(mask = Some(value))
259+
260+
def key(value: String): IpRangeBound = self.copy(key = Some(value))
261+
252262
def toJson: Json = {
253263
val baseFields = Chunk.empty[(String, Json)] ++
254264
from.map("from" -> _.toJson) ++

modules/library/src/test/scala/zio/elasticsearch/ElasticAggregationSpec.scala

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package zio.elasticsearch
22

3-
import zio.Chunk
43
import zio.elasticsearch.ElasticAggregation._
54
import zio.elasticsearch.ElasticQuery.term
5+
import zio.elasticsearch.aggregation.IpRange.IpRangeBound
66
import zio.elasticsearch.aggregation._
77
import zio.elasticsearch.domain.{TestDocument, TestSubDocument}
88
import zio.elasticsearch.query.sort.SortOrder.{Asc, Desc}
@@ -11,6 +11,7 @@ import zio.elasticsearch.script.Script
1111
import zio.elasticsearch.utils._
1212
import zio.test.Assertion.equalTo
1313
import zio.test._
14+
import zio.{Chunk, NonEmptyChunk}
1415

1516
object ElasticAggregationSpec extends ZIOSpecDefault {
1617
def spec: Spec[TestEnvironment, Any] =
@@ -155,9 +156,9 @@ object ElasticAggregationSpec extends ZIOSpecDefault {
155156
ipRangeAggregation(
156157
name = "ip_range_agg",
157158
field = "ipField",
158-
ranges = Chunk(
159-
IpRange.IpRangeBound(to = Some("10.0.0.5")),
160-
IpRange.IpRangeBound(from = Some("10.0.0.5"))
159+
ranges = NonEmptyChunk(
160+
IpRangeBound(to = Some("10.0.0.5")),
161+
IpRangeBound(from = Some("10.0.0.5"))
161162
)
162163
)
163164

@@ -166,9 +167,9 @@ object ElasticAggregationSpec extends ZIOSpecDefault {
166167
IpRange(
167168
name = "ip_range_agg",
168169
field = "ipField",
169-
ranges = Chunk(
170-
IpRange.IpRangeBound(to = Some("10.0.0.5")),
171-
IpRange.IpRangeBound(from = Some("10.0.0.5"))
170+
ranges = NonEmptyChunk(
171+
IpRangeBound(to = Some("10.0.0.5")),
172+
IpRangeBound(from = Some("10.0.0.5"))
172173
),
173174
keyed = None,
174175
subAggregations = None
@@ -993,19 +994,19 @@ object ElasticAggregationSpec extends ZIOSpecDefault {
993994
assert(aggregationWithSubAggregation.toJson)(equalTo(expectedWithSubAggregation.toJson)) &&
994995
assert(aggregationWithMultipleSubAggregations.toJson)(equalTo(expectedWithMultipleSubAggregations.toJson))
995996
},
996-
test("ip_range aggregation with from/to ") {
997-
val agg = IpRange(
997+
test("ipRange") {
998+
val aggFromTo = IpRange(
998999
name = "ip_range_agg",
9991000
field = "ip",
1000-
ranges = Chunk(
1001-
IpRange.IpRangeBound(to = Some("10.0.0.5")),
1002-
IpRange.IpRangeBound(from = Some("10.0.0.5"))
1001+
ranges = NonEmptyChunk(
1002+
IpRangeBound(to = Some("10.0.0.5")),
1003+
IpRangeBound(from = Some("10.0.0.5"))
10031004
),
10041005
keyed = None,
10051006
subAggregations = None
10061007
)
10071008

1008-
val expectedJson =
1009+
val expectedJsonFromTo =
10091010
"""
10101011
|{
10111012
| "ip_range_agg": {
@@ -1024,21 +1025,18 @@ object ElasticAggregationSpec extends ZIOSpecDefault {
10241025
|}
10251026
|""".stripMargin
10261027

1027-
assert(agg.toJson)(equalTo(expectedJson.toJson))
1028-
},
1029-
test("ip_range aggregation with CIDR masks and keyed = true") {
1030-
val agg = IpRange(
1028+
val aggMaskKeyed = IpRange(
10311029
name = "ip_range_agg",
10321030
field = "ip",
1033-
ranges = Chunk(
1034-
IpRange.IpRangeBound(mask = Some("10.0.0.0/25")),
1035-
IpRange.IpRangeBound(mask = Some("10.0.0.127/25"))
1031+
ranges = NonEmptyChunk(
1032+
IpRangeBound(mask = Some("10.0.0.0/25")),
1033+
IpRangeBound(mask = Some("10.0.0.127/25"))
10361034
),
10371035
keyed = Some(true),
10381036
subAggregations = None
10391037
)
10401038

1041-
val expectedJson =
1039+
val expectedJsonMaskKeyed =
10421040
"""
10431041
|{
10441042
| "ip_range_agg": {
@@ -1058,7 +1056,8 @@ object ElasticAggregationSpec extends ZIOSpecDefault {
10581056
|}
10591057
|""".stripMargin
10601058

1061-
assert(agg.toJson)(equalTo(expectedJson.toJson))
1059+
assert(aggFromTo.toJson)(equalTo(expectedJsonFromTo.toJson)) &&
1060+
assert(aggMaskKeyed.toJson)(equalTo(expectedJsonMaskKeyed.toJson))
10621061
},
10631062
test("max") {
10641063
val aggregation = maxAggregation("aggregation", "testField")

0 commit comments

Comments
 (0)