Skip to content

Commit b46ca16

Browse files
committed
feat: Further filtering conditions
1 parent 751fff1 commit b46ca16

File tree

3 files changed

+137
-39
lines changed

3 files changed

+137
-39
lines changed

src/main/kotlin/com/github/frankfarrell/dynamodsl/Conditions.kt

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,63 @@ interface DynamoComparator {
1010
fun toCondition(): Condition
1111
}
1212

13+
interface SingleValueDynamoCompator: DynamoComparator {
14+
val right: Any
15+
}
16+
1317
interface ComparableBuilder {}
1418

15-
class Equals(val right: Any): DynamoComparator{
19+
class Equals(override val right: Any): SingleValueDynamoCompator{
1620

1721
override fun toCondition(): Condition {
1822
return Condition().withComparisonOperator(ComparisonOperator.EQ).withAttributeValueList(toAttributeValue(right))
1923
}
24+
}
25+
26+
class NotEquals(override val right: Any): SingleValueDynamoCompator{
27+
28+
override fun toCondition(): Condition {
29+
return Condition().withComparisonOperator(ComparisonOperator.NE).withAttributeValueList(toAttributeValue(right))
30+
}
31+
}
32+
33+
class GreaterThan(override val right: Any): SingleValueDynamoCompator{
34+
35+
override fun toCondition(): Condition {
36+
return Condition().withComparisonOperator(ComparisonOperator.GT).withAttributeValueList(toAttributeValue(right))
37+
}
38+
39+
}
40+
41+
class LessThan(override val right: Any): SingleValueDynamoCompator{
42+
43+
override fun toCondition(): Condition {
44+
return Condition().withComparisonOperator(ComparisonOperator.LT).withAttributeValueList(toAttributeValue(right))
45+
}
46+
47+
}
48+
49+
class GreaterThanOrEquals(override val right: Any): SingleValueDynamoCompator{
50+
51+
override fun toCondition(): Condition {
52+
return Condition().withComparisonOperator(ComparisonOperator.GE).withAttributeValueList(toAttributeValue(right))
53+
}
54+
55+
}
2056

21-
val value = ComparisonOperator.EQ
57+
class LessThanOrEquals(override val right: Any): SingleValueDynamoCompator{
58+
59+
override fun toCondition(): Condition {
60+
return Condition().withComparisonOperator(ComparisonOperator.LE).withAttributeValueList(toAttributeValue(right))
61+
}
62+
}
63+
64+
class InList(val right: List<Any>): DynamoComparator{
65+
66+
override fun toCondition(): Condition {
67+
//Is this right?
68+
return Condition().withComparisonOperator(ComparisonOperator.IN).withAttributeValueList(toAttributeValue(right))
69+
}
2270
}
2371

2472
class Between(val left: Any, val right: Any): DynamoComparator{

src/main/kotlin/com/github/frankfarrell/dynamodsl/Filtering.kt

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,39 @@ class ConcreteFilter(val dynamoFunction: DynamoFunction,
8282
filterExpression += expressionAttributeName
8383
expressionAttributeNames.put(expressionAttributeName, dynamoFunction.attributeName)
8484

85+
fun singleValueComparator(operator: String, comparator: SingleValueDynamoCompator){
86+
val expressionAttributeValue = toExpressionAttributeValue(dynamoFunction.attributeName)
87+
filterExpression += " $operator ${expressionAttributeValue}"
88+
expressionAttributeValues.put(expressionAttributeValue, toAttributeValue(comparator.right))
89+
}
90+
8591
when(comparator){
86-
is Equals -> {
87-
val expressionAttributeValue = toExpressionAttributeValue(dynamoFunction.attributeName)
88-
filterExpression += " = ${expressionAttributeValue}"
89-
expressionAttributeValues.put(expressionAttributeValue, toAttributeValue(comparator.right))
90-
}
92+
is Equals -> singleValueComparator("=", comparator)
93+
is NotEquals -> singleValueComparator("<>", comparator)
94+
is GreaterThan -> singleValueComparator(">", comparator)
95+
is GreaterThanOrEquals -> singleValueComparator(">=", comparator)
96+
is LessThan -> singleValueComparator("<", comparator)
97+
is LessThanOrEquals -> singleValueComparator("<=", comparator)
9198
is Between -> {
9299
val leftExpressionAttributeValue = toExpressionAttributeValue(dynamoFunction.attributeName + "left")
93100
val rightExpressionAttributeValue = toExpressionAttributeValue(dynamoFunction.attributeName + "right")
94101
filterExpression += " BETWEEN ${leftExpressionAttributeValue} AND ${rightExpressionAttributeValue} "
95102
expressionAttributeValues.put(leftExpressionAttributeValue, toAttributeValue(comparator.left))
96103
expressionAttributeValues.put(rightExpressionAttributeValue, toAttributeValue(comparator.right))
97104
}
105+
is InList -> {
106+
107+
val listOfAttributeValues = comparator.right
108+
.map({
109+
val expressionAttributeValue = toExpressionAttributeValue(dynamoFunction.attributeName)
110+
expressionAttributeValues.put(expressionAttributeValue, toAttributeValue(it))
111+
expressionAttributeValue
112+
})
113+
.joinToString()
114+
115+
filterExpression += " IN (${listOfAttributeValues})"
116+
117+
}
98118
}
99119

100120
}
@@ -167,6 +187,36 @@ fun ConcreteFilterBuilder.eq(value: Any){
167187
comparator = Equals(value)
168188
}
169189

190+
@DynamoDSLMarker
191+
fun ConcreteFilterBuilder.noteq(value: Any){
192+
comparator = NotEquals(value)
193+
}
194+
195+
@DynamoDSLMarker
196+
fun ConcreteFilterBuilder.gt(value: Any){
197+
comparator = GreaterThan(value)
198+
}
199+
200+
@DynamoDSLMarker
201+
fun ConcreteFilterBuilder.lt(value: Any){
202+
comparator = LessThan(value)
203+
}
204+
205+
@DynamoDSLMarker
206+
fun ConcreteFilterBuilder.gteq(value: Any){
207+
comparator = GreaterThanOrEquals(value)
208+
}
209+
210+
@DynamoDSLMarker
211+
fun ConcreteFilterBuilder.lteq(value: Any){
212+
comparator = LessThanOrEquals(value)
213+
}
214+
215+
@DynamoDSLMarker
216+
fun ConcreteFilterBuilder.inList(value: List<Any>){
217+
comparator = InList(value)
218+
}
219+
170220
@DynamoDSLMarker
171221
class RootFilterBuilder: FilterQueryBuilder{
172222

src/test/kotlin/com/github/frankfarrell/dynamodsl/DynamoDSLTest.kt

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,39 +9,39 @@ import org.junit.Test
99
*/
1010

1111
class DynamoDSLTest {
12-
@Test
12+
//@Test
1313
fun `it should build nested filter queries correctly`(){
14-
// val queryResult = DynamoDSL(AmazonDynamoDBClientBuilder.standard().withRegion(Regions.US_EAST_1).build())
15-
// .query("mytable") {
16-
// hashKey("myHashKey") {
17-
// eq(2)
18-
// }
19-
// sortKey("mysortkey"){
20-
// eq (2)
21-
// between ( 2 AND 3)
22-
// }
23-
// filtering {
24-
// attribute("a") {
25-
// eq(1)
26-
// } and attribute("b"){
27-
// eq(2)
28-
// } or {
29-
// attribute("c"){
30-
// eq(3)
31-
// } and attributeExists("d") or {
32-
// attribute("e"){
33-
// eq(4)
34-
// }
35-
// }
36-
// } or attributeExists("f")
37-
//
38-
// }
39-
// }
40-
41-
42-
//if(queryResult.hasNext()){
43-
// queryResult.next()
44-
//}
14+
val queryResult = DynamoDSL(AmazonDynamoDBClientBuilder.standard().withRegion(Regions.US_EAST_1).build())
15+
.query("mytable") {
16+
hashKey("myHashKey") {
17+
eq(2)
18+
}
19+
sortKey("mysortkey"){
20+
eq (2)
21+
between ( 2 AND 3)
22+
}
23+
filtering {
24+
attribute("a") {
25+
lteq(1)
26+
} and attribute("b"){
27+
gt(2)
28+
} or {
29+
attribute("c"){
30+
eq(3)
31+
} and attributeExists("d") or {
32+
attribute("e"){
33+
noteq(4)
34+
}
35+
}
36+
} or attributeExists("f")
37+
38+
}
39+
}
40+
41+
42+
if(queryResult.hasNext()){
43+
queryResult.next()
44+
}
4545

4646

4747
}

0 commit comments

Comments
 (0)