All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.ibizsys.model.engine.querydsl.database.sql.QuerydslSQLGenEngine Maven / Gradle / Ivy

The newest version!
package net.ibizsys.model.engine.querydsl.database.sql;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.querydsl.core.types.Expression;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.sql.Configuration;
import com.querydsl.sql.DB2Templates;
import com.querydsl.sql.MySQLTemplates;
import com.querydsl.sql.OracleTemplates;
import com.querydsl.sql.PostgreSQLTemplates;
import com.querydsl.sql.SQLBindings;
import com.querydsl.sql.SQLQuery;
import com.querydsl.sql.SQLServer2012Templates;
import com.querydsl.sql.SQLiteTemplates;

import net.ibizsys.model.PSModelEnums.DBType;
import net.ibizsys.model.dataentity.ds.IPSDEDataQuery;
import net.ibizsys.model.engine.IPSModelEngine;
import net.ibizsys.model.engine.database.sql.SQLGenEngineBase;

public class QuerydslSQLGenEngine extends SQLGenEngineBase> {

	@Override
	public String getName() {
		return this.getDBType();
	}
	
	@Override
	public String getFullName() {
		return String.format("QuerydslSQL代码生成器[%1$s]", this.getName());
	}
	
	protected SQLQuery createSQLQuery() throws Exception{
		
		if(DBType.MYSQL5.value.equalsIgnoreCase(this.getDBType())) {
			Configuration configuration = new Configuration(MySQLTemplates.DEFAULT);
			configuration.setUseLiterals(true);
			return new SQLQuery(configuration);
		}
		
		if(DBType.ORACLE.value.equalsIgnoreCase(this.getDBType())) {
			Configuration configuration = new Configuration(OracleTemplates.DEFAULT);
			configuration.setUseLiterals(true);
			return new SQLQuery(configuration);
		}
		
		if(DBType.SQLSERVER.value.equalsIgnoreCase(this.getDBType())) {
			Configuration configuration = new Configuration(SQLServer2012Templates.DEFAULT);
			configuration.setUseLiterals(true);
			return new SQLQuery(configuration);
		}
		
		if(DBType.DB2.value.equalsIgnoreCase(this.getDBType())) {
			Configuration configuration = new Configuration(DB2Templates.DEFAULT);
			configuration.setUseLiterals(true);
			return new SQLQuery(configuration);
		}
		

		if(DBType.POSTGRESQL.value.equalsIgnoreCase(this.getDBType())) {
			Configuration configuration = new Configuration(PostgreSQLTemplates.DEFAULT);
			configuration.setUseLiterals(true);
			return new SQLQuery(configuration);
		}
		
		if(DBType.SQLITE.value.equalsIgnoreCase(this.getDBType())) {
			Configuration configuration = new Configuration(SQLiteTemplates.DEFAULT);
			configuration.setUseLiterals(true);
			return new SQLQuery(configuration);
		}
		
		if(DBType.PPAS.value.equalsIgnoreCase(this.getDBType())) {
			Configuration configuration = new Configuration(OracleTemplates.DEFAULT);
			configuration.setUseLiterals(true);
			return new SQLQuery(configuration);
		}
		
		
		throw new Exception(String.format("未支持的数据库类型[%1$s]", this.getDBType()));
	}
	
	
	@Override
	protected String onGenerate(IPSDEDataQuery iPSDEDataQuery, Map params) throws Throwable {
		
		QuerydslDEDataQuery querydslDEDataQuery = new QuerydslDEDataQuery(new QuerydslSession(params), iPSDEDataQuery);
		
		SQLQuery sqlQuery = createSQLQuery();
		
		List> expressions = new ArrayList>();
		for(String name : querydslDEDataQuery.getExpressionNames()) {
			expressions.add(Expressions.as(querydslDEDataQuery.getExpression(name, false), name));
		}
		
		sqlQuery.select(expressions.toArray(new Expression[expressions.size()]));
		sqlQuery.from(querydslDEDataQuery.getQuerydslDataEntity());
		join(sqlQuery, querydslDEDataQuery.getQuerydslDataEntity());
		
		
		where(sqlQuery, querydslDEDataQuery.getQuerydslDataEntity());
		
		SQLBindings sqlBindings = sqlQuery.getSQL();
		
		return sqlBindings.getSQL();
	}
	
	protected void join(SQLQuery sqlQuery, IQuerydslDataEntity iQuerydslDataEntity) throws Exception{
		java.util.Collection querydslDEJoinList = iQuerydslDataEntity.getQuerydslDEJoins();
		if(querydslDEJoinList!=null) {
			for(IQuerydslDEJoin iQuerydslDEJoin : querydslDEJoinList) {
				switch(iQuerydslDEJoin.getJoinType()) {
				case IQuerydslDEJoin.JOINTYPE_LEFTJOIN:
					sqlQuery.leftJoin(iQuerydslDEJoin.getForeignKey(), iQuerydslDEJoin.getJoinQuerydslDataEntity());
					break;
				case IQuerydslDEJoin.JOINTYPE_INNERJOIN:
					sqlQuery.innerJoin(iQuerydslDEJoin.getForeignKey(), iQuerydslDEJoin.getJoinQuerydslDataEntity());
					break;
				case IQuerydslDEJoin.JOINTYPE_RIGHTJOIN:
					sqlQuery.rightJoin(iQuerydslDEJoin.getForeignKey(), iQuerydslDEJoin.getJoinQuerydslDataEntity());
					break;
				case IQuerydslDEJoin.JOINTYPE_EXISTS:
				case IQuerydslDEJoin.JOINTYPE_NOTEXISTS:
					break;
				default:
					throw new Exception(String.format("无法识别的连接类型[%1$s]", iQuerydslDEJoin.getJoinType()));
				}
			}
		}
		
	}
	
	protected void where(SQLQuery sqlQuery, IQuerydslDataEntity iQuerydslDataEntity) throws Exception{
		
		List predicateList = new ArrayList();
		
		fillPredicates(predicateList, iQuerydslDataEntity);
		
		if(predicateList.size() > 0) {
			sqlQuery.where(predicateList.toArray(new Predicate[predicateList.size()]));
		}
	}

	
	
	protected void fillPredicates(List predicateList, IQuerydslDataEntity iQuerydslDataEntity) throws Exception{
		
		java.util.Collection	list = iQuerydslDataEntity.getPredicates();
		if(list != null) {
			predicateList.addAll(list);
		}
		
		java.util.Collection querydslDEJoinList = iQuerydslDataEntity.getQuerydslDEJoins();
		if(querydslDEJoinList!=null) {
			for(IQuerydslDEJoin iQuerydslDEJoin : querydslDEJoinList) {
				switch(iQuerydslDEJoin.getJoinType()) {
				case IQuerydslDEJoin.JOINTYPE_EXISTS:
				case IQuerydslDEJoin.JOINTYPE_NOTEXISTS:
					
					//构建子条件
					SQLQuery sqlQuery = createSQLQuery();
					sqlQuery.from(iQuerydslDEJoin.getJoinQuerydslDataEntity());
					join(sqlQuery, iQuerydslDEJoin.getJoinQuerydslDataEntity());
					where(sqlQuery, iQuerydslDEJoin.getJoinQuerydslDataEntity());
					
					
					if(IQuerydslDEJoin.JOINTYPE_EXISTS.equals(iQuerydslDEJoin.getJoinType())) {
						predicateList.add(sqlQuery.exists());
					}
					else {
						predicateList.add(sqlQuery.notExists());
					}
					
					break;
				default:
					fillPredicates(predicateList, iQuerydslDEJoin.getJoinQuerydslDataEntity());
				}
			}
		}
	}
	
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy