diff --git a/wow-api/src/main/kotlin/me/ahoo/wow/api/query/Query.kt b/wow-api/src/main/kotlin/me/ahoo/wow/api/query/Query.kt index b81df6d7f03..90276c42b09 100644 --- a/wow-api/src/main/kotlin/me/ahoo/wow/api/query/Query.kt +++ b/wow-api/src/main/kotlin/me/ahoo/wow/api/query/Query.kt @@ -127,7 +127,12 @@ enum class Operator { /** * 匹配字段值在指定值为`false`的所有文档 */ - FALSE + FALSE, + + /** + * 原始操作符,将条件值直接作为原始的数据库查询条件 + */ + RAW } data class Condition( @@ -181,6 +186,7 @@ data class Condition( fun id(value: String) = Condition(field = EMPTY_VALUE, operator = Operator.ID, value = value) fun ids(value: List) = Condition(field = EMPTY_VALUE, operator = Operator.IDS, value = value) fun ids(vararg value: String) = Condition(field = EMPTY_VALUE, operator = Operator.IDS, value = value.toList()) + fun raw(value: Any) = Condition(field = EMPTY_VALUE, operator = Operator.RAW, value = value) } } diff --git a/wow-mongo/src/main/kotlin/me/ahoo/wow/mongo/query/MongoFilterConverter.kt b/wow-mongo/src/main/kotlin/me/ahoo/wow/mongo/query/MongoFilterConverter.kt index ae9297f3027..53da8144190 100644 --- a/wow-mongo/src/main/kotlin/me/ahoo/wow/mongo/query/MongoFilterConverter.kt +++ b/wow-mongo/src/main/kotlin/me/ahoo/wow/mongo/query/MongoFilterConverter.kt @@ -8,6 +8,7 @@ import me.ahoo.wow.api.query.Operator import me.ahoo.wow.api.query.Projection import me.ahoo.wow.api.query.Sort import me.ahoo.wow.mongo.Documents +import org.bson.Document import org.bson.conversions.Bson object MongoFilterConverter { @@ -66,6 +67,14 @@ object MongoFilterConverter { } Filters.or(children.map { it.toMongoFilter() }) } + + Operator.RAW -> { + if (value is Bson) { + value as Bson + } else { + Document.parse(value as String) + } + } } if (!not) return filter return Filters.not(filter) diff --git a/wow-mongo/src/test/kotlin/me/ahoo/wow/mongo/query/MongoFilterConverterTest.kt b/wow-mongo/src/test/kotlin/me/ahoo/wow/mongo/query/MongoFilterConverterTest.kt index 042b1dcd7b0..d1b0aced080 100644 --- a/wow-mongo/src/test/kotlin/me/ahoo/wow/mongo/query/MongoFilterConverterTest.kt +++ b/wow-mongo/src/test/kotlin/me/ahoo/wow/mongo/query/MongoFilterConverterTest.kt @@ -101,6 +101,18 @@ class MongoFilterConverterTest { Condition.or(listOf(Condition.isFalse("id"))), Filters.or(Filters.eq("id", false)) ), + Arguments.of( + Condition.or(listOf(Condition.raw(Filters.eq("id", false)))), + Filters.or(Filters.eq("id", false)) + ), + Arguments.of( + Condition.raw(Filters.eq("id", false)), + Filters.eq("id", false) + ), + Arguments.of( + Condition.raw("{id:false}"), + Filters.eq("id", false) + ) ) } diff --git a/wow-query/src/main/kotlin/me/ahoo/wow/query/ConditionDsl.kt b/wow-query/src/main/kotlin/me/ahoo/wow/query/ConditionDsl.kt index 47846bfde12..bb6352e96e4 100644 --- a/wow-query/src/main/kotlin/me/ahoo/wow/query/ConditionDsl.kt +++ b/wow-query/src/main/kotlin/me/ahoo/wow/query/ConditionDsl.kt @@ -174,6 +174,10 @@ class ConditionDsl { condition(Condition.isFalse(this)) } + fun raw(value: Any) { + condition(Condition.raw(value)) + } + fun build(): Condition { if (conditions.isEmpty()) { return Condition.all() diff --git a/wow-query/src/test/kotlin/me/ahoo/wow/query/ConditionDslTest.kt b/wow-query/src/test/kotlin/me/ahoo/wow/query/ConditionDslTest.kt index f8b7f192b79..353c3694402 100644 --- a/wow-query/src/test/kotlin/me/ahoo/wow/query/ConditionDslTest.kt +++ b/wow-query/src/test/kotlin/me/ahoo/wow/query/ConditionDslTest.kt @@ -48,6 +48,7 @@ class ConditionDslTest { "field3" eq "value3" "field4" eq "value4" } + raw("1=1") } assertThat( condition, @@ -86,7 +87,8 @@ class ConditionDslTest { Condition.eq("field3", "value3"), Condition.eq("field4", "value4") ) - ) + ), + Condition.raw("1=1") ) ) )