
com.github.freegeese.easymybatis.mapper.provider.TreeableSqlProvider Maven / Gradle / Ivy
The newest version!
package com.github.freegeese.easymybatis.mapper.provider;
import com.github.freegeese.easymybatis.domain.Treeable;
import com.github.freegeese.easymybatis.meta.MetaCache;
import com.github.freegeese.easymybatis.meta.MetaEntityClass;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 提供基础层级结构 SQL
*
* @author zhangguangyong
* @since 1.0
*/
public class TreeableSqlProvider {
private static final String EMPTY_SQL = "";
/**
* 交换位置
*
* @param source
* @param target
* @return
*/
public String exchange(@Param("source") Object source, @Param("target") Object target) {
Treeable sourceNode = (Treeable) source;
Treeable targetNode = (Treeable) target;
if (sourceNode.getId() != targetNode.getId() && sourceNode.getParentId() == targetNode.getParentId()) {
MetaEntityClass meta = MetaCache.getMetaEntityClass(source.getClass());
Map getMethodAndThisMap = meta.getGetMethodAndThisMap();
MetaEntityClass.TreeableGetMethod treeableGetMethod = MetaEntityClass.getTreeableGetMethod();
MetaEntityClass.ResultMapping idProp = getMethodAndThisMap.get(treeableGetMethod.getGetId());
MetaEntityClass.ResultMapping sortProp = getMethodAndThisMap.get(treeableGetMethod.getGetSort());
String table = meta.getTable();
return Stream.of(
new SQL().UPDATE(table).SET(sortProp.eq("target")).WHERE(idProp.eq("source")).toString(),
new SQL().UPDATE(table).SET(sortProp.eq("source")).WHERE(idProp.eq("target")).toString()
).collect(Collectors.joining(";"));
}
return EMPTY_SQL;
}
/**
* 从 from 移动到 to
*
* @param from
* @param to
* @return
*/
public String move(@Param("from") Object from, @Param("to") Object to) {
Treeable fromNode = (Treeable) from;
Treeable toNode = (Treeable) to;
if (fromNode.getId() != toNode.getId() && fromNode.getParentId() == toNode.getParentId()) {
MetaEntityClass meta = MetaCache.getMetaEntityClass(from.getClass());
Map getMethodAndThisMap = meta.getGetMethodAndThisMap();
MetaEntityClass.TreeableGetMethod treeableGetMethod = MetaEntityClass.getTreeableGetMethod();
MetaEntityClass.ResultMapping idProp = getMethodAndThisMap.get(treeableGetMethod.getGetId());
MetaEntityClass.ResultMapping parentIdProp = getMethodAndThisMap.get(treeableGetMethod.getGetParentId());
MetaEntityClass.ResultMapping sortProp = getMethodAndThisMap.get(treeableGetMethod.getGetSort());
String table = meta.getTable();
if (fromNode.getSort() > toNode.getSort()) {
return String.join(";",
new SQL().UPDATE(table).SET(sortProp.getColumn() + " = " + sortProp.getColumn() + " + 1")
.WHERE(sortProp.ge("to")).AND()
.WHERE(parentIdProp.ge("from")).AND()
.WHERE(sortProp.lt("from")).toString(),
new SQL().UPDATE(table).SET(sortProp.eq("to")).WHERE(idProp.eq("from")).toString()
);
}
if (fromNode.getSort() < toNode.getSort()) {
return String.join(";",
new SQL().UPDATE(table).SET(sortProp.getColumn() + " = " + sortProp.getColumn() + " - 1")
.WHERE(sortProp.gt("from")).AND()
.WHERE(parentIdProp.eq("from")).AND()
.WHERE(sortProp.le("to")).toString(),
new SQL().UPDATE(table).SET(sortProp.eq("to")).WHERE(idProp.eq("from")).toString()
);
}
}
return EMPTY_SQL;
}
/**
* 查询上一个兄弟节点
*
* @param target
* @return
*/
public String selectPreviousSibling(Object target) {
MetaEntityClass meta = MetaCache.getMetaEntityClass(target.getClass());
Map getMethodAndThisMap = meta.getGetMethodAndThisMap();
MetaEntityClass.TreeableGetMethod treeableGetMethod = MetaEntityClass.getTreeableGetMethod();
String table = meta.getTable();
MetaEntityClass.ResultMapping parentIdProp = getMethodAndThisMap.get(treeableGetMethod.getGetParentId());
MetaEntityClass.ResultMapping sortProp = getMethodAndThisMap.get(treeableGetMethod.getGetSort());
return new SQL().SELECT(meta.getColumns()).FROM(table)
.WHERE(parentIdProp.eq()).AND()
.WHERE(sortProp.getColumn() + " = (select max (" + sortProp.getColumn() + ") from table where " + parentIdProp.getColumn() + " = #{" + parentIdProp.getProperty() + "}) and " + sortProp.getColumn() + " < #{" + sortProp.getProperty() + "}").toString();
}
/**
* 查询下一个兄弟节点
*
* @param target
* @return
*/
public String selectNextSibling(Object target) {
MetaEntityClass meta = MetaCache.getMetaEntityClass(target.getClass());
Map getMethodAndThisMap = meta.getGetMethodAndThisMap();
MetaEntityClass.TreeableGetMethod treeableGetMethod = MetaEntityClass.getTreeableGetMethod();
String table = meta.getTable();
MetaEntityClass.ResultMapping parentIdProp = getMethodAndThisMap.get(treeableGetMethod.getGetParentId());
MetaEntityClass.ResultMapping sortProp = getMethodAndThisMap.get(treeableGetMethod.getGetSort());
return new SQL().SELECT(meta.getColumns()).FROM(table)
.WHERE(parentIdProp.eq()).AND()
.WHERE(sortProp.getColumn() + " = (select min (" + sortProp.getColumn() + ") from " + table + " where " + parentIdProp.getColumn() + " = #{" + parentIdProp.getProperty() + "}) and " + sortProp.getColumn() + " > #{" + sortProp.getProperty() + "}").toString();
}
/**
* 查询第一个兄弟节点
*
* @param target
* @return
*/
public String selectFirstSibling(Object target) {
MetaEntityClass meta = MetaCache.getMetaEntityClass(target.getClass());
Map getMethodAndThisMap = meta.getGetMethodAndThisMap();
MetaEntityClass.TreeableGetMethod treeableGetMethod = MetaEntityClass.getTreeableGetMethod();
String table = meta.getTable();
MetaEntityClass.ResultMapping parentIdProp = getMethodAndThisMap.get(treeableGetMethod.getGetParentId());
MetaEntityClass.ResultMapping sortProp = getMethodAndThisMap.get(treeableGetMethod.getGetSort());
return new SQL().SELECT(meta.getColumns()).FROM(table)
.WHERE(parentIdProp.eq()).AND()
.WHERE(sortProp.getColumn() + " = (select min (" + sortProp.getColumn() + ") from " + table + " where " + parentIdProp.getColumn() + " = #{" + parentIdProp.getProperty() + "}").toString();
}
/**
* 查询最后一个兄弟节点
*
* @param target
* @return
*/
public String selectLastSibling(Object target) {
MetaEntityClass meta = MetaCache.getMetaEntityClass(target.getClass());
Map getMethodAndThisMap = meta.getGetMethodAndThisMap();
MetaEntityClass.TreeableGetMethod treeableGetMethod = MetaEntityClass.getTreeableGetMethod();
String table = meta.getTable();
MetaEntityClass.ResultMapping parentIdProp = getMethodAndThisMap.get(treeableGetMethod.getGetParentId());
MetaEntityClass.ResultMapping sortProp = getMethodAndThisMap.get(treeableGetMethod.getGetSort());
return new SQL().SELECT(meta.getColumns()).FROM(table)
.WHERE(parentIdProp.eq()).AND()
.WHERE(sortProp.getColumn() + " = (select max (" + sortProp.getColumn() + ") from " + table + " where " + parentIdProp.getColumn() + " = #{" + parentIdProp.getProperty() + "}").toString();
}
/**
* 查询所有父节点
*
* @param entityClass
* @return
*/
public String selectParents(Class> entityClass) {
MetaEntityClass meta = MetaCache.getMetaEntityClass(entityClass);
Map getMethodAndThisMap = meta.getGetMethodAndThisMap();
MetaEntityClass.TreeableGetMethod treeableGetMethod = MetaEntityClass.getTreeableGetMethod();
String table = meta.getTable();
MetaEntityClass.ResultMapping parentIdProp = getMethodAndThisMap.get(treeableGetMethod.getGetParentId());
MetaEntityClass.ResultMapping sortProp = getMethodAndThisMap.get(treeableGetMethod.getGetSort());
MetaEntityClass.ResultMapping idProp = getMethodAndThisMap.get(treeableGetMethod.getGetId());
return new SQL().SELECT(meta.getColumns()).FROM(table)
.WHERE(idProp.getColumn() + " in (select distinct " + parentIdProp.getColumn() + " from " + table + ") order by " + String.join(",", parentIdProp.getColumn(), sortProp.getColumn())).toString();
}
/**
* 查询子节点
*
* @param target
* @param deep
* @return
*/
public String selectChildren(@Param("target") Objects target, @Param("deep") boolean deep) {
MetaEntityClass meta = MetaCache.getMetaEntityClass(target.getClass());
Map getMethodAndThisMap = meta.getGetMethodAndThisMap();
MetaEntityClass.TreeableGetMethod treeableGetMethod = MetaEntityClass.getTreeableGetMethod();
String table = meta.getTable();
MetaEntityClass.ResultMapping parentIdProp = getMethodAndThisMap.get(treeableGetMethod.getGetParentId().toString());
MetaEntityClass.ResultMapping sortProp = getMethodAndThisMap.get(treeableGetMethod.getGetSort());
MetaEntityClass.ResultMapping idProp = getMethodAndThisMap.get(treeableGetMethod.getGetId());
MetaEntityClass.ResultMapping pathProp = getMethodAndThisMap.get(treeableGetMethod.getGetPath());
SQL sql = new SQL().SELECT(meta.getColumns()).FROM(table);
if (deep) {
return sql.WHERE(pathProp.getColumn() + " like concat(#{target." + pathProp.getProperty() + "},'%')").AND().WHERE(idProp.eq("target")).ORDER_BY(parentIdProp.getColumn(), sortProp.getColumn()).toString();
}
return sql.WHERE(parentIdProp.getColumn() + " = #{target." + idProp.getProperty() + "}").ORDER_BY(parentIdProp.getColumn(), sortProp.getColumn()).toString();
}
/**
* 更新子节点路径
*
* @param target
* @param oldPath
* @return
*/
public String updateChildrenPath(@Param("target") Object target, @Param("oldPath") String oldPath) {
MetaEntityClass meta = MetaCache.getMetaEntityClass(target.getClass());
Map getMethodAndThisMap = meta.getGetMethodAndThisMap();
MetaEntityClass.TreeableGetMethod treeableGetMethod = MetaEntityClass.getTreeableGetMethod();
String table = meta.getTable();
MetaEntityClass.ResultMapping parentIdProp = getMethodAndThisMap.get(treeableGetMethod.getGetParentId());
MetaEntityClass.ResultMapping idProp = getMethodAndThisMap.get(treeableGetMethod.getGetId());
MetaEntityClass.ResultMapping pathProp = getMethodAndThisMap.get(treeableGetMethod.getGetPath());
return new SQL().UPDATE(table).
SET(parentIdProp.getColumn() + " = concat(#{target." + pathProp.getProperty() + "},substr(" + pathProp.getColumn() + ",length(#{oldPath}) + 1, length(" + pathProp.getColumn() + ")))")
.WHERE(parentIdProp.getColumn() + " = #{target." + idProp.getProperty() + "}").toString();
}
/**
* 查询根节点
*
* @param entityClass
* @return
*/
public String selectRoot(Class> entityClass) {
MetaEntityClass meta = MetaCache.getMetaEntityClass(entityClass);
Map getMethodAndThisMap = meta.getGetMethodAndThisMap();
MetaEntityClass.TreeableGetMethod treeableGetMethod = MetaEntityClass.getTreeableGetMethod();
String table = meta.getTable();
MetaEntityClass.ResultMapping pathProp = getMethodAndThisMap.get(treeableGetMethod.getGetPath());
return new SQL().SELECT(meta.getColumns()).FROM(table)
.WHERE(pathProp.getColumn() + " = '/'").toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy