From ab831385802c6ddf7cc933dc1f1a36f930ccfde5 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 29 May 2020 01:00:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=86=E9=A1=B5=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gaea/app/query/IQueryGenericApp.kt | 4 +- .../synebula/gaea/app/query/IQueryTypedApp.kt | 4 +- .../gaea/mongo/query/MongoGenericQuery.kt | 58 +++++++++++-------- .../synebula/gaea/mongo/query/MongoQuery.kt | 22 +++---- .../com/synebula/gaea/query/IGenericQuery.kt | 2 +- .../kotlin/com/synebula/gaea/query/IQuery.kt | 2 +- .../com/synebula/gaea/query/IQueryComplex.kt | 2 +- .../gaea/query/{PagingData.kt => Page.kt} | 2 +- .../gaea/query/{PagingParam.kt => Params.kt} | 8 +-- 9 files changed, 57 insertions(+), 47 deletions(-) rename src/gaea/src/main/kotlin/com/synebula/gaea/query/{PagingData.kt => Page.kt} (98%) rename src/gaea/src/main/kotlin/com/synebula/gaea/query/{PagingParam.kt => Params.kt} (82%) diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryGenericApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryGenericApp.kt index d71418a..67d0a5c 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryGenericApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryGenericApp.kt @@ -3,7 +3,7 @@ package com.synebula.gaea.app.query import com.synebula.gaea.app.component.HttpMessage import com.synebula.gaea.data.message.Status import com.synebula.gaea.query.IGenericQuery -import com.synebula.gaea.query.PagingParam +import com.synebula.gaea.query.Params /** * 应用类接口,提供实现Query服务的接口 @@ -51,7 +51,7 @@ interface IQueryGenericApp : IQueryApp { */ override fun doPaging(size: Int, page: Int, params: MutableMap): HttpMessage { return this.doQuery("获取${this.name}分页数据[条数:$size,页码:$page]失败") { - val data = PagingParam(page, size) + val data = Params(page, size) data.parameters = params this.query!!.paging(data) } diff --git a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryTypedApp.kt b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryTypedApp.kt index 37aaf33..9125ee9 100644 --- a/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryTypedApp.kt +++ b/src/gaea.app/src/main/kotlin/com/synebula/gaea/app/query/IQueryTypedApp.kt @@ -3,7 +3,7 @@ package com.synebula.gaea.app.query import com.synebula.gaea.app.component.HttpMessage import com.synebula.gaea.data.message.Status import com.synebula.gaea.query.IQuery -import com.synebula.gaea.query.PagingParam +import com.synebula.gaea.query.Params /** * 应用类接口,提供实现Query服务的接口. @@ -38,7 +38,7 @@ interface IQueryTypedApp : IQueryApp { override fun doPaging(size: Int, page: Int, params: MutableMap): HttpMessage { return this.doQuery("获取${this.name}分页数据[条数:$size,页码:$page]失败") { - val data = PagingParam(page, size) + val data = Params(page, size) data.parameters = params this.query!!.paging(data, clazz) } diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoGenericQuery.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoGenericQuery.kt index ab6b081..9489bee 100644 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoGenericQuery.kt +++ b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoGenericQuery.kt @@ -3,26 +3,32 @@ package com.synebula.gaea.mongo.query import com.synebula.gaea.extension.fieldNames import com.synebula.gaea.extension.firstCharLowerCase import com.synebula.gaea.log.ILogger +import com.synebula.gaea.mongo.Collection import com.synebula.gaea.mongo.order import com.synebula.gaea.mongo.select import com.synebula.gaea.mongo.where import com.synebula.gaea.mongo.whereId import com.synebula.gaea.query.IGenericQuery -import com.synebula.gaea.query.PagingData -import com.synebula.gaea.query.PagingParam +import com.synebula.gaea.query.Page +import com.synebula.gaea.query.Params import org.springframework.data.mongodb.core.MongoTemplate import org.springframework.data.mongodb.core.query.Query /** * 实现IQuery的Mongo查询类 + * @param clazz 查询的对象类 * @param template MongoRepo对象 * @param logger 日志组件 */ -open class MongoGenericQuery(var template: MongoTemplate, var logger: ILogger? = null) : IGenericQuery { +open class MongoGenericQuery( + var template: MongoTemplate, + var clazz: Class? = null, + var logger: ILogger? = null) : IGenericQuery { + /** - * 查询的对象类 + * 使用View解析是collection时是否校验存在,默认不校验 */ - var clazz: Class? = null + var validViewCollection = false private var _collection = "" @@ -36,23 +42,9 @@ open class MongoGenericQuery(var template: MongoTemplate, var logger: ILo get() = if (this._collection.isNotEmpty()) this._collection else { - if (this.clazz != null) - this.clazz!!.simpleName.removeSuffix("View").firstCharLowerCase() - else - "" + this.collection(this.clazz) } - /** - * 构造方法 - * - * @param clazz 视图对象类型 - * @param query MongoRepo对象 - */ - constructor(clazz: Class, query: MongoTemplate) - : this(query) { - this.clazz = clazz - } - /** * 构造方法 * @@ -72,7 +64,7 @@ open class MongoGenericQuery(var template: MongoTemplate, var logger: ILo * @param query MongoRepo对象 */ constructor(collection: String, clazz: Class, query: MongoTemplate) - : this(clazz, query) { + : this(query, clazz) { this.collection = collection } @@ -96,12 +88,12 @@ open class MongoGenericQuery(var template: MongoTemplate, var logger: ILo } else 0 } - override fun paging(param: PagingParam): PagingData { + override fun paging(param: Params): Page { this.check() return if (this.clazz != null) { val query = Query() val fields = this.clazz!!.fieldNames() - val result = PagingData(param.page, param.size) + val result = Page(param.page, param.size) result.total = this.count(param.parameters) //如果总数和索引相同,说明该页没有数据,直接跳到上一页 if (result.total == result.index) { @@ -114,7 +106,7 @@ open class MongoGenericQuery(var template: MongoTemplate, var logger: ILo query.skip(param.index).limit(param.size) result.data = this.template.find(query, this.clazz!!, this.collection) result - } else PagingData(1, 10) + } else Page(1, 10) } override fun get(key: String): TView? { @@ -132,4 +124,22 @@ open class MongoGenericQuery(var template: MongoTemplate, var logger: ILo this.logger?.warn(this, "查询集合参数[collection]值为空, 尝试使用View<${this.clazz?.name}>名称解析集合") } + /** + * 获取collection + */ + protected fun collection(clazz: Class?): String { + if (clazz == null) throw java.lang.RuntimeException("[${this.javaClass}]没有指定查询实体类型[clazz]") + val collection: Collection? = clazz.getDeclaredAnnotation(Collection::class.java) + return if (collection != null) + return collection.name + else { + this.logger?.info(this, "视图类没有标记[Collection]注解,无法获取Collection名称。尝试使用View<${clazz.name}>名称解析集合") + val name = clazz.simpleName.removeSuffix("View").firstCharLowerCase() + if (!validViewCollection || this.template.collectionExists(name)) + name + else { + throw RuntimeException("找不到名为[$collection]的集合") + } + } + } } diff --git a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt index eeb0e1f..4767d72 100644 --- a/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt +++ b/src/gaea.mongo/src/main/kotlin/com/synebula/gaea/mongo/query/MongoQuery.kt @@ -6,17 +6,17 @@ import com.synebula.gaea.log.ILogger import com.synebula.gaea.mongo.* import com.synebula.gaea.mongo.Collection import com.synebula.gaea.query.IQuery -import com.synebula.gaea.query.PagingData -import com.synebula.gaea.query.PagingParam +import com.synebula.gaea.query.Page +import com.synebula.gaea.query.Params import org.springframework.data.mongodb.core.MongoTemplate import org.springframework.data.mongodb.core.query.Query /** * 实现IQuery的Mongo查询类 - * @param repo MongoRepo对象 + * @param template MongoRepo对象 */ -open class MongoQuery(var repo: MongoTemplate, var logger: ILogger? = null) : IQuery { +open class MongoQuery(var template: MongoTemplate, var logger: ILogger? = null) : IQuery { /** * 使用View解析是collection时是否校验存在,默认不校验 @@ -28,18 +28,18 @@ open class MongoQuery(var repo: MongoTemplate, var logger: ILogger? = null) : IQ val query = Query() query.where(params, clazz) query.select(fields.toTypedArray()) - return this.repo.find(query, clazz, this.collection(clazz)) + return this.template.find(query, clazz, this.collection(clazz)) } override fun count(params: Map?, clazz: Class): Int { val query = Query() - return this.repo.count(query.where(params, clazz), this.collection(clazz)).toInt() + return this.template.count(query.where(params, clazz), this.collection(clazz)).toInt() } - override fun paging(param: PagingParam, clazz: Class): PagingData { + override fun paging(param: Params, clazz: Class): Page { val query = Query() val fields = clazz.fieldNames() - val result = PagingData(param.page, param.size) + val result = Page(param.page, param.size) result.total = this.count(param.parameters, clazz) //如果总数和索引相同,说明该页没有数据,直接跳到上一页 if (result.total == result.index) { @@ -50,12 +50,12 @@ open class MongoQuery(var repo: MongoTemplate, var logger: ILogger? = null) : IQ query.where(param.parameters, clazz) query.with(order(param.orderBy)) query.skip(param.index).limit(param.size) - result.data = this.repo.find(query, clazz, this.collection(clazz)) + result.data = this.template.find(query, clazz, this.collection(clazz)) return result } override fun get(key: TKey, clazz: Class): TView? { - return this.repo.findOne(whereId(key), clazz, this.collection(clazz)) + return this.template.findOne(whereId(key), clazz, this.collection(clazz)) } /** @@ -68,7 +68,7 @@ open class MongoQuery(var repo: MongoTemplate, var logger: ILogger? = null) : IQ else { this.logger?.info(this, "视图类没有标记[Collection]注解,无法获取Collection名称。尝试使用View<${clazz.name}>名称解析集合") val name = clazz.simpleName.removeSuffix("View").firstCharLowerCase() - if (!validViewCollection || this.repo.collectionExists(name)) + if (!validViewCollection || this.template.collectionExists(name)) name else { throw RuntimeException("找不到名为[$collection]的集合") diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/query/IGenericQuery.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/query/IGenericQuery.kt index 83b4abb..7211c81 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/query/IGenericQuery.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/query/IGenericQuery.kt @@ -38,5 +38,5 @@ interface IGenericQuery { * @param param 分页条件 * @return 分页数据 */ - fun paging(param: PagingParam): PagingData + fun paging(param: Params): Page } diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQuery.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQuery.kt index 42d7a88..e74f9cb 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQuery.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQuery.kt @@ -36,5 +36,5 @@ interface IQuery { * @param param 分页条件 * @return 分页数据 */ - fun paging(param: PagingParam, clazz: Class): PagingData + fun paging(param: Params, clazz: Class): Page } diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQueryComplex.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQueryComplex.kt index f01e28d..68cbaf6 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQueryComplex.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/query/IQueryComplex.kt @@ -38,5 +38,5 @@ interface IQueryComplex { * @param param 分页条件 * @return */ - fun paging(param: PagingParam): PagingData + fun paging(param: Params): Page } diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/query/PagingData.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/query/Page.kt similarity index 98% rename from src/gaea/src/main/kotlin/com/synebula/gaea/query/PagingData.kt rename to src/gaea/src/main/kotlin/com/synebula/gaea/query/Page.kt index 8997da9..0555ce3 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/query/PagingData.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/query/Page.kt @@ -6,7 +6,7 @@ package com.synebula.gaea.query * * @author alex */ -class PagingData { +class Page { /** * 页码,从1开始。 */ diff --git a/src/gaea/src/main/kotlin/com/synebula/gaea/query/PagingParam.kt b/src/gaea/src/main/kotlin/com/synebula/gaea/query/Params.kt similarity index 82% rename from src/gaea/src/main/kotlin/com/synebula/gaea/query/PagingParam.kt rename to src/gaea/src/main/kotlin/com/synebula/gaea/query/Params.kt index 234fc91..ffd94b3 100644 --- a/src/gaea/src/main/kotlin/com/synebula/gaea/query/PagingParam.kt +++ b/src/gaea/src/main/kotlin/com/synebula/gaea/query/Params.kt @@ -1,13 +1,13 @@ package com.synebula.gaea.query /** - * class PagingParam + * class 分页参数信息 * * @author alex * @version 0.1 * @since 2020-05-15 */ -data class PagingParam(var page: Int = 1, var size: Int = 10) { +data class Params(var page: Int = 1, var size: Int = 10) { /** * 数据索引,从0开始。表示数据在总量的第几条。(index = (page - 1) * size) @@ -29,7 +29,7 @@ data class PagingParam(var page: Int = 1, var size: Int = 10) { /** * 添加查询条件 */ - fun addParameter(field: String, value: Any): PagingParam { + fun addParameter(field: String, value: Any): Params { parameters[field] = value return this } @@ -37,7 +37,7 @@ data class PagingParam(var page: Int = 1, var size: Int = 10) { /** * 添加排序条件 */ - fun addOrderBy(field: String, type: OrderType = OrderType.ASC): PagingParam { + fun addOrderBy(field: String, type: OrderType = OrderType.ASC): Params { orderBy[field] = type return this }