@ -0,0 +1,970 @@
package io.dataease.provider.redshift ;
import com.google.gson.Gson ;
import io.dataease.base.domain.ChartViewWithBLOBs ;
import io.dataease.base.domain.DatasetTableField ;
import io.dataease.base.domain.DatasetTableFieldExample ;
import io.dataease.base.domain.Datasource ;
import io.dataease.base.mapper.DatasetTableFieldMapper ;
import io.dataease.commons.constants.DeTypeConstants ;
import io.dataease.controller.request.chart.ChartExtFilterRequest ;
import io.dataease.datasource.dto.JdbcConfiguration ;
import io.dataease.dto.chart.ChartCustomFilterDTO ;
import io.dataease.dto.chart.ChartViewFieldDTO ;
import io.dataease.dto.sqlObj.SQLObj ;
import io.dataease.provider.QueryProvider ;
import io.dataease.provider.SQLConstants ;
import io.dataease.provider.pg.PgConstants ;
import io.dataease.provider.sqlserver.SqlServerSQLConstants ;
import org.apache.commons.collections4.CollectionUtils ;
import org.apache.commons.lang3.ObjectUtils ;
import org.apache.commons.lang3.StringUtils ;
import org.springframework.stereotype.Service ;
import org.stringtemplate.v4.ST ;
import org.stringtemplate.v4.STGroup ;
import org.stringtemplate.v4.STGroupFile ;
import javax.annotation.Resource ;
import java.text.MessageFormat ;
import java.text.SimpleDateFormat ;
import java.util.* ;
import java.util.regex.Matcher ;
import java.util.regex.Pattern ;
import static io.dataease.provider.SQLConstants.TABLE_ALIAS_PREFIX ;
/ * *
* Redshift 查询器
*
* @className : RedshiftConstants
* @description : Redshift 查询器
* @author : Jiantao Yan
* @date : 2021 / 10 / 11 17 : 12
* * /
@Service ( " redshiftQuery " )
public class RedshiftQueryProvider extends QueryProvider {
@Resource
private DatasetTableFieldMapper datasetTableFieldMapper ;
@Override
public Integer transFieldType ( String field ) {
field = field . toLowerCase ( ) ;
switch ( field ) {
case " bpchar " :
case " varchar " :
case " text " :
case " tsquery " :
case " tsvector " :
case " uuid " :
case " xml " :
case " json " :
case " bit " :
case " jsonb " :
case " cidr " :
case " inet " :
case " macaddr " :
case " txid_snapshot " :
case " box " :
case " circle " :
case " line " :
case " lseg " :
case " path " :
case " point " :
case " polygon " :
case " bool " :
case " interval " :
return DeTypeConstants . DE_STRING ; / / 文本
case " date " :
case " time " :
case " timestamp " :
case " timestamptz " :
return DeTypeConstants . DE_TIME ; / / 时间
case " int2 " :
case " int4 " :
case " int8 " :
case " INTEGER " :
case " BIGINT " :
return DeTypeConstants . DE_INT ; / / 整型
case " numeric " :
case " float4 " :
case " float8 " :
case " money " :
return DeTypeConstants . DE_FLOAT ; / / 浮点
/ / case " bool " :
case " TINYINT " :
return DeTypeConstants . DE_BOOL ; / / 布尔
case " bytea " :
return DeTypeConstants . DE_BINARY ; / / 二进制
default :
return DeTypeConstants . DE_STRING ;
}
}
@Override
public String createSQLPreview ( String sql , String orderBy ) {
return " SELECT * FROM ( " + sqlFix ( sql ) + " ) AS tmp " + " LIMIT 1000 offset 0 " ;
}
@Override
public String createQuerySQL ( String table , List < DatasetTableField > fields , boolean isGroup , Datasource ds ) {
SQLObj tableObj = SQLObj . builder ( )
. tableName ( ( table . startsWith ( " ( " ) & & table . endsWith ( " ) " ) ) ? table : String . format ( PgConstants . KEYWORD_TABLE , table ) )
. tableAlias ( String . format ( TABLE_ALIAS_PREFIX , 0 ) )
. build ( ) ;
setSchema ( tableObj , ds ) ;
List < SQLObj > xFields = new ArrayList < > ( ) ;
if ( CollectionUtils . isNotEmpty ( fields ) ) {
for ( int i = 0 ; i < fields . size ( ) ; i + + ) {
DatasetTableField f = fields . get ( i ) ;
String originField ;
if ( ObjectUtils . isNotEmpty ( f . getExtField ( ) ) & & f . getExtField ( ) = = 2 ) {
/ / 解析origin name中有关联的字段生成sql表达式
originField = calcFieldRegex ( f . getOriginName ( ) , tableObj ) ;
} else if ( ObjectUtils . isNotEmpty ( f . getExtField ( ) ) & & f . getExtField ( ) = = 1 ) {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , f . getOriginName ( ) ) ;
} else {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , f . getOriginName ( ) ) ;
}
String fieldAlias = String . format ( SQLConstants . FIELD_ALIAS_X_PREFIX , i ) ;
String fieldName = " " ;
/ / 处理横轴字段
if ( f . getDeExtractType ( ) = = DeTypeConstants . DE_TIME ) {
if ( f . getDeType ( ) = = DeTypeConstants . DE_INT | | f . getDeType ( ) = = DeTypeConstants . DE_FLOAT ) {
fieldName = String . format ( PgConstants . UNIX_TIMESTAMP , originField ) ;
} else {
fieldName = originField ;
}
} else if ( f . getDeExtractType ( ) = = DeTypeConstants . DE_STRING ) {
if ( f . getDeType ( ) = = DeTypeConstants . DE_INT ) {
fieldName = String . format ( PgConstants . CAST , originField , PgConstants . DEFAULT_INT_FORMAT ) ;
} else if ( f . getDeType ( ) = = DeTypeConstants . DE_FLOAT ) {
fieldName = String . format ( PgConstants . CAST , originField , PgConstants . DEFAULT_FLOAT_FORMAT ) ;
} else if ( f . getDeType ( ) = = DeTypeConstants . DE_TIME ) {
fieldName = String . format ( PgConstants . CAST , originField , " timestamp " ) ;
} else {
fieldName = originField ;
}
} else {
if ( f . getDeType ( ) = = DeTypeConstants . DE_TIME ) {
String cast = String . format ( PgConstants . CAST , originField , " bigint " ) ;
fieldName = String . format ( PgConstants . FROM_UNIXTIME , cast ) ;
} else if ( f . getDeType ( ) = = DeTypeConstants . DE_INT ) {
fieldName = String . format ( PgConstants . CAST , originField , PgConstants . DEFAULT_INT_FORMAT ) ;
} else {
fieldName = originField ;
}
}
xFields . add ( SQLObj . builder ( )
. fieldName ( fieldName )
. fieldAlias ( fieldAlias )
. build ( ) ) ;
}
}
STGroup stg = new STGroupFile ( SQLConstants . SQL_TEMPLATE ) ;
ST st_sql = stg . getInstanceOf ( " previewSql " ) ;
st_sql . add ( " isGroup " , isGroup ) ;
if ( CollectionUtils . isNotEmpty ( xFields ) ) st_sql . add ( " groups " , xFields ) ;
if ( ObjectUtils . isNotEmpty ( tableObj ) ) st_sql . add ( " table " , tableObj ) ;
return st_sql . render ( ) ;
}
@Override
public String createQuerySQLAsTmp ( String sql , List < DatasetTableField > fields , boolean isGroup ) {
return createQuerySQL ( " ( " + sqlFix ( sql ) + " ) " , fields , isGroup , null ) ;
}
@Override
public String createQueryTableWithPage ( String table , List < DatasetTableField > fields , Integer page , Integer pageSize , Integer realSize , boolean isGroup , Datasource ds ) {
return createQuerySQL ( table , fields , isGroup , ds ) + " LIMIT " + realSize + " offset " + ( page - 1 ) * pageSize ;
}
@Override
public String createQuerySQLWithPage ( String sql , List < DatasetTableField > fields , Integer page , Integer pageSize , Integer realSize , boolean isGroup ) {
return createQuerySQL ( sql , fields , isGroup , null ) + " LIMIT " + realSize + " offset " + ( page - 1 ) * pageSize ;
}
@Override
public String createQueryTableWithLimit ( String table , List < DatasetTableField > fields , Integer limit , boolean isGroup , Datasource ds ) {
return createQuerySQL ( table , fields , isGroup , null ) + " LIMIT " + limit + " offset 0 " ;
}
@Override
public String createQuerySqlWithLimit ( String sql , List < DatasetTableField > fields , Integer limit , boolean isGroup ) {
return createQuerySQLAsTmp ( sql , fields , isGroup ) + " LIMIT " + limit + " offset 0 " ;
}
@Override
public String getSQL ( String table , List < ChartViewFieldDTO > xAxis , List < ChartViewFieldDTO > yAxis , List < ChartCustomFilterDTO > customFilter , List < ChartExtFilterRequest > extFilterRequestList , Datasource ds , ChartViewWithBLOBs view ) {
SQLObj tableObj = SQLObj . builder ( )
. tableName ( ( table . startsWith ( " ( " ) & & table . endsWith ( " ) " ) ) ? table : String . format ( PgConstants . KEYWORD_TABLE , table ) )
. tableAlias ( String . format ( TABLE_ALIAS_PREFIX , 0 ) )
. build ( ) ;
setSchema ( tableObj , ds ) ;
List < SQLObj > xFields = new ArrayList < > ( ) ;
List < SQLObj > xWheres = new ArrayList < > ( ) ;
List < SQLObj > xOrders = new ArrayList < > ( ) ;
if ( CollectionUtils . isNotEmpty ( xAxis ) ) {
for ( int i = 0 ; i < xAxis . size ( ) ; i + + ) {
ChartViewFieldDTO x = xAxis . get ( i ) ;
String originField ;
if ( ObjectUtils . isNotEmpty ( x . getExtField ( ) ) & & x . getExtField ( ) = = 2 ) {
/ / 解析origin name中有关联的字段生成sql表达式
originField = calcFieldRegex ( x . getOriginName ( ) , tableObj ) ;
} else if ( ObjectUtils . isNotEmpty ( x . getExtField ( ) ) & & x . getExtField ( ) = = 1 ) {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , x . getOriginName ( ) ) ;
} else {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , x . getOriginName ( ) ) ;
}
String fieldAlias = String . format ( SQLConstants . FIELD_ALIAS_X_PREFIX , i ) ;
/ / 处理横轴字段
xFields . add ( getXFields ( x , originField , fieldAlias ) ) ;
/ / 处理横轴过滤
/ / xWheres . addAll ( getXWheres ( x , originField , fieldAlias ) ) ;
/ / 处理横轴排序
if ( StringUtils . isNotEmpty ( x . getSort ( ) ) & & ! StringUtils . equalsIgnoreCase ( x . getSort ( ) , " none " ) ) {
xOrders . add ( SQLObj . builder ( )
. orderField ( originField )
. orderAlias ( fieldAlias )
. orderDirection ( x . getSort ( ) )
. build ( ) ) ;
}
}
}
List < SQLObj > yFields = new ArrayList < > ( ) ;
List < SQLObj > yWheres = new ArrayList < > ( ) ;
List < SQLObj > yOrders = new ArrayList < > ( ) ;
if ( CollectionUtils . isNotEmpty ( yAxis ) ) {
for ( int i = 0 ; i < yAxis . size ( ) ; i + + ) {
ChartViewFieldDTO y = yAxis . get ( i ) ;
String originField ;
if ( ObjectUtils . isNotEmpty ( y . getExtField ( ) ) & & y . getExtField ( ) = = 2 ) {
/ / 解析origin name中有关联的字段生成sql表达式
originField = calcFieldRegex ( y . getOriginName ( ) , tableObj ) ;
} else if ( ObjectUtils . isNotEmpty ( y . getExtField ( ) ) & & y . getExtField ( ) = = 1 ) {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , y . getOriginName ( ) ) ;
} else {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , y . getOriginName ( ) ) ;
}
String fieldAlias = String . format ( SQLConstants . FIELD_ALIAS_Y_PREFIX , i ) ;
/ / 处理纵轴字段
yFields . add ( getYFields ( y , originField , fieldAlias ) ) ;
/ / 处理纵轴过滤
yWheres . addAll ( getYWheres ( y , originField , fieldAlias ) ) ;
/ / 处理纵轴排序
if ( StringUtils . isNotEmpty ( y . getSort ( ) ) & & ! StringUtils . equalsIgnoreCase ( y . getSort ( ) , " none " ) ) {
yOrders . add ( SQLObj . builder ( )
. orderField ( originField )
. orderAlias ( fieldAlias )
. orderDirection ( y . getSort ( ) )
. build ( ) ) ;
}
}
}
/ / 处理视图中字段过滤
List < SQLObj > customWheres = transCustomFilterList ( tableObj , customFilter ) ;
/ / 处理仪表板字段过滤
List < SQLObj > extWheres = transExtFilterList ( tableObj , extFilterRequestList ) ;
/ / 构建sql所有参数
List < SQLObj > fields = new ArrayList < > ( ) ;
fields . addAll ( xFields ) ;
fields . addAll ( yFields ) ;
List < SQLObj > wheres = new ArrayList < > ( ) ;
wheres . addAll ( xWheres ) ;
if ( customWheres ! = null ) wheres . addAll ( customWheres ) ;
if ( extWheres ! = null ) wheres . addAll ( extWheres ) ;
List < SQLObj > groups = new ArrayList < > ( ) ;
groups . addAll ( xFields ) ;
/ / 外层再次套sql
List < SQLObj > orders = new ArrayList < > ( ) ;
orders . addAll ( xOrders ) ;
orders . addAll ( yOrders ) ;
List < SQLObj > aggWheres = new ArrayList < > ( ) ;
aggWheres . addAll ( yWheres ) ;
STGroup stg = new STGroupFile ( SQLConstants . SQL_TEMPLATE ) ;
ST st_sql = stg . getInstanceOf ( " querySql " ) ;
if ( CollectionUtils . isNotEmpty ( xFields ) ) st_sql . add ( " groups " , xFields ) ;
if ( CollectionUtils . isNotEmpty ( yFields ) ) st_sql . add ( " aggregators " , yFields ) ;
if ( CollectionUtils . isNotEmpty ( wheres ) ) st_sql . add ( " filters " , wheres ) ;
if ( ObjectUtils . isNotEmpty ( tableObj ) ) st_sql . add ( " table " , tableObj ) ;
String sql = st_sql . render ( ) ;
ST st = stg . getInstanceOf ( " querySql " ) ;
SQLObj tableSQL = SQLObj . builder ( )
. tableName ( String . format ( PgConstants . BRACKETS , sql ) )
. tableAlias ( String . format ( TABLE_ALIAS_PREFIX , 1 ) )
. build ( ) ;
if ( CollectionUtils . isNotEmpty ( aggWheres ) ) st . add ( " filters " , aggWheres ) ;
if ( CollectionUtils . isNotEmpty ( orders ) ) st . add ( " orders " , orders ) ;
if ( ObjectUtils . isNotEmpty ( tableSQL ) ) st . add ( " table " , tableSQL ) ;
return sqlLimit ( st . render ( ) , view ) ;
}
@Override
public String getSQLAsTmp ( String sql , List < ChartViewFieldDTO > xAxis , List < ChartViewFieldDTO > yAxis , List < ChartCustomFilterDTO > customFilter , List < ChartExtFilterRequest > extFilterRequestList , ChartViewWithBLOBs view ) {
return getSQL ( " ( " + sqlFix ( sql ) + " ) " , xAxis , yAxis , customFilter , extFilterRequestList , null , view ) ;
}
@Override
public String getSQLTableInfo ( String table , List < ChartViewFieldDTO > xAxis , List < ChartCustomFilterDTO > customFilter , List < ChartExtFilterRequest > extFilterRequestList , Datasource ds , ChartViewWithBLOBs view ) {
return null ;
}
@Override
public String getSQLAsTmpTableInfo ( String sql , List < ChartViewFieldDTO > xAxis , List < ChartCustomFilterDTO > customFilter , List < ChartExtFilterRequest > extFilterRequestList , Datasource ds , ChartViewWithBLOBs view ) {
return null ;
}
@Override
public String getSQLStack ( String table , List < ChartViewFieldDTO > xAxis , List < ChartViewFieldDTO > yAxis , List < ChartCustomFilterDTO > customFilter , List < ChartExtFilterRequest > extFilterRequestList , List < ChartViewFieldDTO > extStack , Datasource ds , ChartViewWithBLOBs view ) {
SQLObj tableObj = SQLObj . builder ( )
. tableName ( ( table . startsWith ( " ( " ) & & table . endsWith ( " ) " ) ) ? table : String . format ( PgConstants . KEYWORD_TABLE , table ) )
. tableAlias ( String . format ( TABLE_ALIAS_PREFIX , 0 ) )
. build ( ) ;
setSchema ( tableObj , ds ) ;
List < SQLObj > xFields = new ArrayList < > ( ) ;
List < SQLObj > xWheres = new ArrayList < > ( ) ;
List < SQLObj > xOrders = new ArrayList < > ( ) ;
List < ChartViewFieldDTO > xList = new ArrayList < > ( ) ;
xList . addAll ( xAxis ) ;
xList . addAll ( extStack ) ;
if ( CollectionUtils . isNotEmpty ( xList ) ) {
for ( int i = 0 ; i < xList . size ( ) ; i + + ) {
ChartViewFieldDTO x = xList . get ( i ) ;
String originField ;
if ( ObjectUtils . isNotEmpty ( x . getExtField ( ) ) & & x . getExtField ( ) = = 2 ) {
/ / 解析origin name中有关联的字段生成sql表达式
originField = calcFieldRegex ( x . getOriginName ( ) , tableObj ) ;
} else if ( ObjectUtils . isNotEmpty ( x . getExtField ( ) ) & & x . getExtField ( ) = = 1 ) {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , x . getOriginName ( ) ) ;
} else {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , x . getOriginName ( ) ) ;
}
String fieldAlias = String . format ( SQLConstants . FIELD_ALIAS_X_PREFIX , i ) ;
/ / 处理横轴字段
xFields . add ( getXFields ( x , originField , fieldAlias ) ) ;
/ / 处理横轴过滤
/ / xWheres . addAll ( getXWheres ( x , originField , fieldAlias ) ) ;
/ / 处理横轴排序
if ( StringUtils . isNotEmpty ( x . getSort ( ) ) & & ! StringUtils . equalsIgnoreCase ( x . getSort ( ) , " none " ) ) {
xOrders . add ( SQLObj . builder ( )
. orderField ( originField )
. orderAlias ( fieldAlias )
. orderDirection ( x . getSort ( ) )
. build ( ) ) ;
}
}
}
List < SQLObj > yFields = new ArrayList < > ( ) ;
List < SQLObj > yWheres = new ArrayList < > ( ) ;
List < SQLObj > yOrders = new ArrayList < > ( ) ;
if ( CollectionUtils . isNotEmpty ( yAxis ) ) {
for ( int i = 0 ; i < yAxis . size ( ) ; i + + ) {
ChartViewFieldDTO y = yAxis . get ( i ) ;
String originField ;
if ( ObjectUtils . isNotEmpty ( y . getExtField ( ) ) & & y . getExtField ( ) = = 2 ) {
/ / 解析origin name中有关联的字段生成sql表达式
originField = calcFieldRegex ( y . getOriginName ( ) , tableObj ) ;
} else if ( ObjectUtils . isNotEmpty ( y . getExtField ( ) ) & & y . getExtField ( ) = = 1 ) {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , y . getOriginName ( ) ) ;
} else {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , y . getOriginName ( ) ) ;
}
String fieldAlias = String . format ( SQLConstants . FIELD_ALIAS_Y_PREFIX , i ) ;
/ / 处理纵轴字段
yFields . add ( getYFields ( y , originField , fieldAlias ) ) ;
/ / 处理纵轴过滤
yWheres . addAll ( getYWheres ( y , originField , fieldAlias ) ) ;
/ / 处理纵轴排序
if ( StringUtils . isNotEmpty ( y . getSort ( ) ) & & ! StringUtils . equalsIgnoreCase ( y . getSort ( ) , " none " ) ) {
yOrders . add ( SQLObj . builder ( )
. orderField ( originField )
. orderAlias ( fieldAlias )
. orderDirection ( y . getSort ( ) )
. build ( ) ) ;
}
}
}
/ / 处理视图中字段过滤
List < SQLObj > customWheres = transCustomFilterList ( tableObj , customFilter ) ;
/ / 处理仪表板字段过滤
List < SQLObj > extWheres = transExtFilterList ( tableObj , extFilterRequestList ) ;
/ / 构建sql所有参数
List < SQLObj > fields = new ArrayList < > ( ) ;
fields . addAll ( xFields ) ;
fields . addAll ( yFields ) ;
List < SQLObj > wheres = new ArrayList < > ( ) ;
wheres . addAll ( xWheres ) ;
if ( customWheres ! = null ) wheres . addAll ( customWheres ) ;
if ( extWheres ! = null ) wheres . addAll ( extWheres ) ;
List < SQLObj > groups = new ArrayList < > ( ) ;
groups . addAll ( xFields ) ;
/ / 外层再次套sql
List < SQLObj > orders = new ArrayList < > ( ) ;
orders . addAll ( xOrders ) ;
orders . addAll ( yOrders ) ;
List < SQLObj > aggWheres = new ArrayList < > ( ) ;
aggWheres . addAll ( yWheres ) ;
STGroup stg = new STGroupFile ( SQLConstants . SQL_TEMPLATE ) ;
ST st_sql = stg . getInstanceOf ( " querySql " ) ;
if ( CollectionUtils . isNotEmpty ( xFields ) ) st_sql . add ( " groups " , xFields ) ;
if ( CollectionUtils . isNotEmpty ( yFields ) ) st_sql . add ( " aggregators " , yFields ) ;
if ( CollectionUtils . isNotEmpty ( wheres ) ) st_sql . add ( " filters " , wheres ) ;
if ( ObjectUtils . isNotEmpty ( tableObj ) ) st_sql . add ( " table " , tableObj ) ;
String sql = st_sql . render ( ) ;
ST st = stg . getInstanceOf ( " querySql " ) ;
SQLObj tableSQL = SQLObj . builder ( )
. tableName ( String . format ( PgConstants . BRACKETS , sql ) )
. tableAlias ( String . format ( TABLE_ALIAS_PREFIX , 1 ) )
. build ( ) ;
if ( CollectionUtils . isNotEmpty ( aggWheres ) ) st . add ( " filters " , aggWheres ) ;
if ( CollectionUtils . isNotEmpty ( orders ) ) st . add ( " orders " , orders ) ;
if ( ObjectUtils . isNotEmpty ( tableSQL ) ) st . add ( " table " , tableSQL ) ;
return sqlLimit ( st . render ( ) , view ) ;
}
@Override
public String getSQLAsTmpStack ( String table , List < ChartViewFieldDTO > xAxis , List < ChartViewFieldDTO > yAxis , List < ChartCustomFilterDTO > customFilter , List < ChartExtFilterRequest > extFilterRequestList , List < ChartViewFieldDTO > extStack , ChartViewWithBLOBs view ) {
return getSQLStack ( " ( " + sqlFix ( table ) + " ) " , xAxis , yAxis , customFilter , extFilterRequestList , extStack , null , view ) ;
}
@Override
public String getSQLScatter ( String table , List < ChartViewFieldDTO > xAxis , List < ChartViewFieldDTO > yAxis , List < ChartCustomFilterDTO > customFilter , List < ChartExtFilterRequest > extFilterRequestList , List < ChartViewFieldDTO > extBubble , Datasource ds , ChartViewWithBLOBs view ) {
SQLObj tableObj = SQLObj . builder ( )
. tableName ( ( table . startsWith ( " ( " ) & & table . endsWith ( " ) " ) ) ? table : String . format ( PgConstants . KEYWORD_TABLE , table ) )
. tableAlias ( String . format ( TABLE_ALIAS_PREFIX , 0 ) )
. build ( ) ;
setSchema ( tableObj , ds ) ;
List < SQLObj > xFields = new ArrayList < > ( ) ;
List < SQLObj > xWheres = new ArrayList < > ( ) ;
List < SQLObj > xOrders = new ArrayList < > ( ) ;
if ( CollectionUtils . isNotEmpty ( xAxis ) ) {
for ( int i = 0 ; i < xAxis . size ( ) ; i + + ) {
ChartViewFieldDTO x = xAxis . get ( i ) ;
String originField ;
if ( ObjectUtils . isNotEmpty ( x . getExtField ( ) ) & & x . getExtField ( ) = = 2 ) {
/ / 解析origin name中有关联的字段生成sql表达式
originField = calcFieldRegex ( x . getOriginName ( ) , tableObj ) ;
} else if ( ObjectUtils . isNotEmpty ( x . getExtField ( ) ) & & x . getExtField ( ) = = 1 ) {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , x . getOriginName ( ) ) ;
} else {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , x . getOriginName ( ) ) ;
}
String fieldAlias = String . format ( SQLConstants . FIELD_ALIAS_X_PREFIX , i ) ;
/ / 处理横轴字段
xFields . add ( getXFields ( x , originField , fieldAlias ) ) ;
/ / 处理横轴过滤
/ / xWheres . addAll ( getXWheres ( x , originField , fieldAlias ) ) ;
/ / 处理横轴排序
if ( StringUtils . isNotEmpty ( x . getSort ( ) ) & & ! StringUtils . equalsIgnoreCase ( x . getSort ( ) , " none " ) ) {
xOrders . add ( SQLObj . builder ( )
. orderField ( originField )
. orderAlias ( fieldAlias )
. orderDirection ( x . getSort ( ) )
. build ( ) ) ;
}
}
}
List < SQLObj > yFields = new ArrayList < > ( ) ;
List < SQLObj > yWheres = new ArrayList < > ( ) ;
List < SQLObj > yOrders = new ArrayList < > ( ) ;
List < ChartViewFieldDTO > yList = new ArrayList < > ( ) ;
yList . addAll ( yAxis ) ;
yList . addAll ( extBubble ) ;
if ( CollectionUtils . isNotEmpty ( yList ) ) {
for ( int i = 0 ; i < yList . size ( ) ; i + + ) {
ChartViewFieldDTO y = yList . get ( i ) ;
String originField ;
if ( ObjectUtils . isNotEmpty ( y . getExtField ( ) ) & & y . getExtField ( ) = = 2 ) {
/ / 解析origin name中有关联的字段生成sql表达式
originField = calcFieldRegex ( y . getOriginName ( ) , tableObj ) ;
} else if ( ObjectUtils . isNotEmpty ( y . getExtField ( ) ) & & y . getExtField ( ) = = 1 ) {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , y . getOriginName ( ) ) ;
} else {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , y . getOriginName ( ) ) ;
}
String fieldAlias = String . format ( SQLConstants . FIELD_ALIAS_Y_PREFIX , i ) ;
/ / 处理纵轴字段
yFields . add ( getYFields ( y , originField , fieldAlias ) ) ;
/ / 处理纵轴过滤
yWheres . addAll ( getYWheres ( y , originField , fieldAlias ) ) ;
/ / 处理纵轴排序
if ( StringUtils . isNotEmpty ( y . getSort ( ) ) & & ! StringUtils . equalsIgnoreCase ( y . getSort ( ) , " none " ) ) {
yOrders . add ( SQLObj . builder ( )
. orderField ( originField )
. orderAlias ( fieldAlias )
. orderDirection ( y . getSort ( ) )
. build ( ) ) ;
}
}
}
/ / 处理视图中字段过滤
List < SQLObj > customWheres = transCustomFilterList ( tableObj , customFilter ) ;
/ / 处理仪表板字段过滤
List < SQLObj > extWheres = transExtFilterList ( tableObj , extFilterRequestList ) ;
/ / 构建sql所有参数
List < SQLObj > fields = new ArrayList < > ( ) ;
fields . addAll ( xFields ) ;
fields . addAll ( yFields ) ;
List < SQLObj > wheres = new ArrayList < > ( ) ;
wheres . addAll ( xWheres ) ;
if ( customWheres ! = null ) wheres . addAll ( customWheres ) ;
if ( extWheres ! = null ) wheres . addAll ( extWheres ) ;
List < SQLObj > groups = new ArrayList < > ( ) ;
groups . addAll ( xFields ) ;
/ / 外层再次套sql
List < SQLObj > orders = new ArrayList < > ( ) ;
orders . addAll ( xOrders ) ;
orders . addAll ( yOrders ) ;
List < SQLObj > aggWheres = new ArrayList < > ( ) ;
aggWheres . addAll ( yWheres ) ;
STGroup stg = new STGroupFile ( SQLConstants . SQL_TEMPLATE ) ;
ST st_sql = stg . getInstanceOf ( " querySql " ) ;
if ( CollectionUtils . isNotEmpty ( xFields ) ) st_sql . add ( " groups " , xFields ) ;
if ( CollectionUtils . isNotEmpty ( yFields ) ) st_sql . add ( " aggregators " , yFields ) ;
if ( CollectionUtils . isNotEmpty ( wheres ) ) st_sql . add ( " filters " , wheres ) ;
if ( ObjectUtils . isNotEmpty ( tableObj ) ) st_sql . add ( " table " , tableObj ) ;
String sql = st_sql . render ( ) ;
ST st = stg . getInstanceOf ( " querySql " ) ;
SQLObj tableSQL = SQLObj . builder ( )
. tableName ( String . format ( PgConstants . BRACKETS , sql ) )
. tableAlias ( String . format ( TABLE_ALIAS_PREFIX , 1 ) )
. build ( ) ;
if ( CollectionUtils . isNotEmpty ( aggWheres ) ) st . add ( " filters " , aggWheres ) ;
if ( CollectionUtils . isNotEmpty ( orders ) ) st . add ( " orders " , orders ) ;
if ( ObjectUtils . isNotEmpty ( tableSQL ) ) st . add ( " table " , tableSQL ) ;
return sqlLimit ( st . render ( ) , view ) ;
}
@Override
public String getSQLAsTmpScatter ( String table , List < ChartViewFieldDTO > xAxis , List < ChartViewFieldDTO > yAxis , List < ChartCustomFilterDTO > customFilter , List < ChartExtFilterRequest > extFilterRequestList , List < ChartViewFieldDTO > extBubble , ChartViewWithBLOBs view ) {
return getSQLScatter ( " ( " + sqlFix ( table ) + " ) " , xAxis , yAxis , customFilter , extFilterRequestList , extBubble , null , view ) ;
}
@Override
public String searchTable ( String table ) {
return " SELECT table_name FROM information_schema.TABLES WHERE table_name =' " + table + " ' " ;
}
@Override
public String getSQLSummary ( String table , List < ChartViewFieldDTO > yAxis , List < ChartCustomFilterDTO > customFilter , List < ChartExtFilterRequest > extFilterRequestList , ChartViewWithBLOBs view ) {
/ / 字段汇总 排序等
SQLObj tableObj = SQLObj . builder ( )
. tableName ( ( table . startsWith ( " ( " ) & & table . endsWith ( " ) " ) ) ? table : String . format ( PgConstants . KEYWORD_TABLE , table ) )
. tableAlias ( String . format ( TABLE_ALIAS_PREFIX , 0 ) )
. build ( ) ;
List < SQLObj > yFields = new ArrayList < > ( ) ;
List < SQLObj > yWheres = new ArrayList < > ( ) ;
List < SQLObj > yOrders = new ArrayList < > ( ) ;
if ( CollectionUtils . isNotEmpty ( yAxis ) ) {
for ( int i = 0 ; i < yAxis . size ( ) ; i + + ) {
ChartViewFieldDTO y = yAxis . get ( i ) ;
String originField ;
if ( ObjectUtils . isNotEmpty ( y . getExtField ( ) ) & & y . getExtField ( ) = = 2 ) {
/ / 解析origin name中有关联的字段生成sql表达式
originField = calcFieldRegex ( y . getOriginName ( ) , tableObj ) ;
} else if ( ObjectUtils . isNotEmpty ( y . getExtField ( ) ) & & y . getExtField ( ) = = 1 ) {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , y . getOriginName ( ) ) ;
} else {
originField = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , y . getOriginName ( ) ) ;
}
String fieldAlias = String . format ( SQLConstants . FIELD_ALIAS_Y_PREFIX , i ) ;
/ / 处理纵轴字段
yFields . add ( getYFields ( y , originField , fieldAlias ) ) ;
/ / 处理纵轴过滤
yWheres . addAll ( getYWheres ( y , originField , fieldAlias ) ) ;
/ / 处理纵轴排序
if ( StringUtils . isNotEmpty ( y . getSort ( ) ) & & ! StringUtils . equalsIgnoreCase ( y . getSort ( ) , " none " ) ) {
yOrders . add ( SQLObj . builder ( )
. orderField ( originField )
. orderAlias ( fieldAlias )
. orderDirection ( y . getSort ( ) )
. build ( ) ) ;
}
}
}
/ / 处理视图中字段过滤
List < SQLObj > customWheres = transCustomFilterList ( tableObj , customFilter ) ;
/ / 处理仪表板字段过滤
List < SQLObj > extWheres = transExtFilterList ( tableObj , extFilterRequestList ) ;
/ / 构建sql所有参数
List < SQLObj > fields = new ArrayList < > ( ) ;
fields . addAll ( yFields ) ;
List < SQLObj > wheres = new ArrayList < > ( ) ;
if ( customWheres ! = null ) wheres . addAll ( customWheres ) ;
if ( extWheres ! = null ) wheres . addAll ( extWheres ) ;
List < SQLObj > groups = new ArrayList < > ( ) ;
/ / 外层再次套sql
List < SQLObj > orders = new ArrayList < > ( ) ;
orders . addAll ( yOrders ) ;
List < SQLObj > aggWheres = new ArrayList < > ( ) ;
aggWheres . addAll ( yWheres ) ;
STGroup stg = new STGroupFile ( SQLConstants . SQL_TEMPLATE ) ;
ST st_sql = stg . getInstanceOf ( " querySql " ) ;
if ( CollectionUtils . isNotEmpty ( yFields ) ) st_sql . add ( " aggregators " , yFields ) ;
if ( CollectionUtils . isNotEmpty ( wheres ) ) st_sql . add ( " filters " , wheres ) ;
if ( ObjectUtils . isNotEmpty ( tableObj ) ) st_sql . add ( " table " , tableObj ) ;
String sql = st_sql . render ( ) ;
ST st = stg . getInstanceOf ( " querySql " ) ;
SQLObj tableSQL = SQLObj . builder ( )
. tableName ( String . format ( PgConstants . BRACKETS , sql ) )
. tableAlias ( String . format ( TABLE_ALIAS_PREFIX , 1 ) )
. build ( ) ;
if ( CollectionUtils . isNotEmpty ( aggWheres ) ) st . add ( " filters " , aggWheres ) ;
if ( CollectionUtils . isNotEmpty ( orders ) ) st . add ( " orders " , orders ) ;
if ( ObjectUtils . isNotEmpty ( tableSQL ) ) st . add ( " table " , tableSQL ) ;
return sqlLimit ( st . render ( ) , view ) ;
}
@Override
public String getSQLSummaryAsTmp ( String sql , List < ChartViewFieldDTO > yAxis , List < ChartCustomFilterDTO > customFilter , List < ChartExtFilterRequest > extFilterRequestList , ChartViewWithBLOBs view ) {
return getSQLSummary ( " ( " + sqlFix ( sql ) + " ) " , yAxis , customFilter , extFilterRequestList , view ) ;
}
@Override
public String wrapSql ( String sql ) {
sql = sql . trim ( ) ;
if ( sql . lastIndexOf ( " ; " ) = = ( sql . length ( ) - 1 ) ) {
sql = sql . substring ( 0 , sql . length ( ) - 1 ) ;
}
String tmpSql = " SELECT * FROM ( " + sql + " ) AS tmp " + " LIMIT 0 " ;
return tmpSql ;
}
@Override
public String createRawQuerySQL ( String table , List < DatasetTableField > fields , Datasource ds ) {
String [ ] array = fields . stream ( ) . map ( f - > {
StringBuilder stringBuilder = new StringBuilder ( ) ;
stringBuilder . append ( " \" " ) . append ( f . getOriginName ( ) ) . append ( " \" AS " ) . append ( f . getDataeaseName ( ) ) ;
return stringBuilder . toString ( ) ;
} ) . toArray ( String [ ] : : new ) ;
if ( ds ! = null ) {
String schema = new Gson ( ) . fromJson ( ds . getConfiguration ( ) , JdbcConfiguration . class ) . getSchema ( ) ;
String tableWithSchema = String . format ( SqlServerSQLConstants . KEYWORD_TABLE , schema ) + " . " + String . format ( SqlServerSQLConstants . KEYWORD_TABLE , table ) ;
return MessageFormat . format ( " SELECT {0} FROM {1} " , StringUtils . join ( array , " , " ) , tableWithSchema ) ;
} else {
return MessageFormat . format ( " SELECT {0} FROM {1} " , StringUtils . join ( array , " , " ) , table ) ;
}
}
@Override
public String createRawQuerySQLAsTmp ( String sql , List < DatasetTableField > fields ) {
return createRawQuerySQL ( " ( " + sqlFix ( sql ) + " ) AS tmp " , fields , null ) ;
}
@Override
public String convertTableToSql ( String tableName , Datasource ds ) {
String schema = new Gson ( ) . fromJson ( ds . getConfiguration ( ) , JdbcConfiguration . class ) . getSchema ( ) ;
schema = String . format ( RedshiftConstants . KEYWORD_TABLE , schema ) ;
return createSQLPreview ( " SELECT * FROM " + schema + " . " + String . format ( RedshiftConstants . KEYWORD_TABLE , tableName ) , null ) ;
}
public String transMysqlFilterTerm ( String term ) {
switch ( term ) {
case " eq " :
return " = " ;
case " not_eq " :
return " <> " ;
case " lt " :
return " < " ;
case " le " :
return " <= " ;
case " gt " :
return " > " ;
case " ge " :
return " >= " ;
case " in " :
return " IN " ;
case " not in " :
return " NOT IN " ;
case " like " :
return " LIKE " ;
case " not like " :
return " NOT LIKE " ;
case " null " :
return " IN " ;
case " not_null " :
return " IS NOT NULL AND %s <> '' " ;
case " between " :
return " BETWEEN " ;
default :
return " " ;
}
}
public List < SQLObj > transCustomFilterList ( SQLObj tableObj , List < ChartCustomFilterDTO > requestList ) {
if ( CollectionUtils . isEmpty ( requestList ) ) {
return null ;
}
List < SQLObj > list = new ArrayList < > ( ) ;
for ( ChartCustomFilterDTO request : requestList ) {
DatasetTableField field = request . getField ( ) ;
if ( ObjectUtils . isEmpty ( field ) ) {
continue ;
}
String value = request . getValue ( ) ;
String whereName = " " ;
String whereTerm = transMysqlFilterTerm ( request . getTerm ( ) ) ;
String whereValue = " " ;
String originName ;
if ( ObjectUtils . isNotEmpty ( field . getExtField ( ) ) & & field . getExtField ( ) = = 2 ) {
/ / 解析origin name中有关联的字段生成sql表达式
originName = calcFieldRegex ( field . getOriginName ( ) , tableObj ) ;
} else if ( ObjectUtils . isNotEmpty ( field . getExtField ( ) ) & & field . getExtField ( ) = = 1 ) {
originName = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , field . getOriginName ( ) ) ;
} else {
originName = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , field . getOriginName ( ) ) ;
}
if ( field . getDeType ( ) = = 1 ) {
if ( field . getDeExtractType ( ) = = 0 | | field . getDeExtractType ( ) = = 5 ) {
whereName = String . format ( PgConstants . TO_DATE , originName , PgConstants . DEFAULT_DATE_FORMAT ) ;
}
if ( field . getDeExtractType ( ) = = 2 | | field . getDeExtractType ( ) = = 3 | | field . getDeExtractType ( ) = = 4 ) {
String cast = String . format ( PgConstants . CAST , originName , " bigint " ) ;
whereName = String . format ( PgConstants . FROM_UNIXTIME , cast ) ;
}
if ( field . getDeExtractType ( ) = = 1 ) {
whereName = originName ;
}
} else {
whereName = originName ;
}
if ( StringUtils . equalsIgnoreCase ( request . getTerm ( ) , " null " ) ) {
whereValue = PgConstants . WHERE_VALUE_NULL ;
} else if ( StringUtils . equalsIgnoreCase ( request . getTerm ( ) , " not_null " ) ) {
whereTerm = String . format ( whereTerm , originName ) ;
} else if ( StringUtils . containsIgnoreCase ( request . getTerm ( ) , " in " ) ) {
whereValue = " (' " + StringUtils . join ( value , " ',' " ) + " ') " ;
} else if ( StringUtils . containsIgnoreCase ( request . getTerm ( ) , " like " ) ) {
whereValue = " '% " + value + " %' " ;
} else {
whereValue = String . format ( PgConstants . WHERE_VALUE_VALUE , value ) ;
}
list . add ( SQLObj . builder ( )
. whereField ( whereName )
. whereTermAndValue ( whereTerm + whereValue )
. build ( ) ) ;
}
return list ;
}
public List < SQLObj > transExtFilterList ( SQLObj tableObj , List < ChartExtFilterRequest > requestList ) {
if ( CollectionUtils . isEmpty ( requestList ) ) {
return null ;
}
List < SQLObj > list = new ArrayList < > ( ) ;
for ( ChartExtFilterRequest request : requestList ) {
List < String > value = request . getValue ( ) ;
DatasetTableField field = request . getDatasetTableField ( ) ;
if ( CollectionUtils . isEmpty ( value ) | | ObjectUtils . isEmpty ( field ) ) {
continue ;
}
String whereName = " " ;
String whereTerm = transMysqlFilterTerm ( request . getOperator ( ) ) ;
String whereValue = " " ;
String originName ;
if ( ObjectUtils . isNotEmpty ( field . getExtField ( ) ) & & field . getExtField ( ) = = 2 ) {
/ / 解析origin name中有关联的字段生成sql表达式
originName = calcFieldRegex ( field . getOriginName ( ) , tableObj ) ;
} else if ( ObjectUtils . isNotEmpty ( field . getExtField ( ) ) & & field . getExtField ( ) = = 1 ) {
originName = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , field . getOriginName ( ) ) ;
} else {
originName = String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , field . getOriginName ( ) ) ;
}
if ( field . getDeType ( ) = = 1 ) {
if ( field . getDeExtractType ( ) = = 0 | | field . getDeExtractType ( ) = = 5 ) {
whereName = String . format ( PgConstants . TO_DATE , originName , PgConstants . DEFAULT_DATE_FORMAT ) ;
}
if ( field . getDeExtractType ( ) = = 2 | | field . getDeExtractType ( ) = = 3 | | field . getDeExtractType ( ) = = 4 ) {
String cast = String . format ( PgConstants . CAST , originName , " bigint " ) ;
whereName = String . format ( PgConstants . FROM_UNIXTIME , cast ) ;
}
if ( field . getDeExtractType ( ) = = 1 ) {
whereName = originName ;
}
} else {
whereName = originName ;
}
if ( StringUtils . containsIgnoreCase ( request . getOperator ( ) , " in " ) ) {
whereValue = " (' " + StringUtils . join ( value , " ',' " ) + " ') " ;
} else if ( StringUtils . containsIgnoreCase ( request . getOperator ( ) , " like " ) ) {
whereValue = " '% " + value . get ( 0 ) + " %' " ;
} else if ( StringUtils . containsIgnoreCase ( request . getOperator ( ) , " between " ) ) {
if ( request . getDatasetTableField ( ) . getDeType ( ) = = 1 ) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat ( " yyyy-MM-dd HH:mm:ss " ) ;
String startTime = simpleDateFormat . format ( new Date ( Long . parseLong ( value . get ( 0 ) ) ) ) ;
String endTime = simpleDateFormat . format ( new Date ( Long . parseLong ( value . get ( 1 ) ) ) ) ;
whereValue = String . format ( PgConstants . WHERE_BETWEEN , startTime , endTime ) ;
} else {
whereValue = String . format ( PgConstants . WHERE_BETWEEN , value . get ( 0 ) , value . get ( 1 ) ) ;
}
} else {
whereValue = String . format ( PgConstants . WHERE_VALUE_VALUE , value . get ( 0 ) ) ;
}
list . add ( SQLObj . builder ( )
. whereField ( whereName )
. whereTermAndValue ( whereTerm + whereValue )
. build ( ) ) ;
}
return list ;
}
private String sqlFix ( String sql ) {
if ( sql . lastIndexOf ( " ; " ) = = ( sql . length ( ) - 1 ) ) {
sql = sql . substring ( 0 , sql . length ( ) - 1 ) ;
}
return sql ;
}
private String transDateFormat ( String dateStyle , String datePattern ) {
String split = " - " ;
if ( StringUtils . equalsIgnoreCase ( datePattern , " date_sub " ) ) {
split = " - " ;
} else if ( StringUtils . equalsIgnoreCase ( datePattern , " date_split " ) ) {
split = " / " ;
}
switch ( dateStyle ) {
case " y " :
return " 'YYYY " ;
case " y_M " :
return " YYYY " + split + " MM " ;
case " y_M_d " :
return " YYYY " + split + " MM " + split + " DD " ;
case " H_m_s " :
return " HH24:MI:SS' " ;
case " y_M_d_H_m " :
return " YYYY " + split + " MM " + split + " DD " + " HH24:MI " ;
case " y_M_d_H_m_s " :
return " YYYY " + split + " MM " + split + " DD " + " HH24:MI:SS " ;
default :
return " YYYY-MM-DD HH24:MI:SS " ;
}
}
private SQLObj getXFields ( ChartViewFieldDTO x , String originField , String fieldAlias ) {
String fieldName = " " ;
if ( x . getDeExtractType ( ) = = DeTypeConstants . DE_TIME ) {
if ( x . getDeType ( ) = = 2 | | x . getDeType ( ) = = 3 ) {
fieldName = String . format ( PgConstants . UNIX_TIMESTAMP , originField ) ;
} else if ( x . getDeType ( ) = = DeTypeConstants . DE_TIME ) {
String format = transDateFormat ( x . getDateStyle ( ) , x . getDatePattern ( ) ) ;
fieldName = String . format ( PgConstants . DATE_FORMAT , originField , format ) ;
} else {
fieldName = originField ;
}
} else {
if ( x . getDeType ( ) = = DeTypeConstants . DE_TIME ) {
String format = transDateFormat ( x . getDateStyle ( ) , x . getDatePattern ( ) ) ;
if ( x . getDeExtractType ( ) = = DeTypeConstants . DE_STRING ) {
fieldName = String . format ( PgConstants . DATE_FORMAT , originField , format ) ;
} else {
String cast = String . format ( PgConstants . CAST , originField , " bigint " ) ;
String from_unixtime = String . format ( PgConstants . FROM_UNIXTIME , cast ) ;
fieldName = String . format ( PgConstants . DATE_FORMAT , from_unixtime , format ) ;
}
} else {
fieldName = originField ;
}
}
return SQLObj . builder ( )
. fieldName ( fieldName )
. fieldAlias ( fieldAlias )
. build ( ) ;
}
private SQLObj getYFields ( ChartViewFieldDTO y , String originField , String fieldAlias ) {
String fieldName = " " ;
if ( StringUtils . equalsIgnoreCase ( y . getOriginName ( ) , " * " ) ) {
fieldName = PgConstants . AGG_COUNT ;
} else if ( SQLConstants . DIMENSION_TYPE . contains ( y . getDeType ( ) ) ) {
fieldName = String . format ( PgConstants . AGG_FIELD , y . getSummary ( ) , originField ) ;
} else {
if ( StringUtils . equalsIgnoreCase ( y . getSummary ( ) , " avg " ) | | StringUtils . containsIgnoreCase ( y . getSummary ( ) , " pop " ) ) {
String cast = String . format ( PgConstants . CAST , originField , y . getDeType ( ) = = DeTypeConstants . DE_INT ? PgConstants . DEFAULT_INT_FORMAT : PgConstants . DEFAULT_FLOAT_FORMAT ) ;
String agg = String . format ( PgConstants . AGG_FIELD , y . getSummary ( ) , cast ) ;
fieldName = String . format ( PgConstants . CAST , agg , PgConstants . DEFAULT_FLOAT_FORMAT ) ;
} else {
String cast = String . format ( PgConstants . CAST , originField , y . getDeType ( ) = = DeTypeConstants . DE_INT ? PgConstants . DEFAULT_INT_FORMAT : PgConstants . DEFAULT_FLOAT_FORMAT ) ;
fieldName = String . format ( PgConstants . AGG_FIELD , y . getSummary ( ) , cast ) ;
}
}
return SQLObj . builder ( )
. fieldName ( fieldName )
. fieldAlias ( fieldAlias )
. build ( ) ;
}
private List < SQLObj > getYWheres ( ChartViewFieldDTO y , String originField , String fieldAlias ) {
List < SQLObj > list = new ArrayList < > ( ) ;
if ( CollectionUtils . isNotEmpty ( y . getFilter ( ) ) & & y . getFilter ( ) . size ( ) > 0 ) {
y . getFilter ( ) . forEach ( f - > {
String whereTerm = transMysqlFilterTerm ( f . getTerm ( ) ) ;
String whereValue = " " ;
/ / 原始类型不是时间 , 在de中被转成时间的字段做处理
if ( StringUtils . equalsIgnoreCase ( f . getTerm ( ) , " null " ) ) {
whereValue = PgConstants . WHERE_VALUE_NULL ;
} else if ( StringUtils . equalsIgnoreCase ( f . getTerm ( ) , " not_null " ) ) {
whereTerm = String . format ( whereTerm , originField ) ;
} else if ( StringUtils . containsIgnoreCase ( f . getTerm ( ) , " in " ) ) {
whereValue = " (' " + StringUtils . join ( f . getValue ( ) , " ',' " ) + " ') " ;
} else if ( StringUtils . containsIgnoreCase ( f . getTerm ( ) , " like " ) ) {
whereValue = " '% " + f . getValue ( ) + " %' " ;
} else {
whereValue = String . format ( PgConstants . WHERE_VALUE_VALUE , f . getValue ( ) ) ;
}
list . add ( SQLObj . builder ( )
. whereField ( fieldAlias )
. whereAlias ( fieldAlias )
. whereTermAndValue ( whereTerm + whereValue )
. build ( ) ) ;
} ) ;
}
return list ;
}
private String calcFieldRegex ( String originField , SQLObj tableObj ) {
originField = originField . replaceAll ( " [ \\ t \\ n \\ r]] " , " " ) ;
/ / 正则提取 [ xxx ]
String regex = " \\ [(.*?)] " ;
Pattern pattern = Pattern . compile ( regex ) ;
Matcher matcher = pattern . matcher ( originField ) ;
Set < String > ids = new HashSet < > ( ) ;
while ( matcher . find ( ) ) {
String id = matcher . group ( 1 ) ;
ids . add ( id ) ;
}
if ( CollectionUtils . isEmpty ( ids ) ) {
return originField ;
}
DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample ( ) ;
datasetTableFieldExample . createCriteria ( ) . andIdIn ( new ArrayList < > ( ids ) ) ;
List < DatasetTableField > calcFields = datasetTableFieldMapper . selectByExample ( datasetTableFieldExample ) ;
for ( DatasetTableField ele : calcFields ) {
originField = originField . replaceAll ( " \\ [ " + ele . getId ( ) + " ] " ,
String . format ( PgConstants . KEYWORD_FIX , tableObj . getTableAlias ( ) , ele . getOriginName ( ) ) ) ;
}
return originField ;
}
private String sqlLimit ( String sql , ChartViewWithBLOBs view ) {
if ( StringUtils . equalsIgnoreCase ( view . getResultMode ( ) , " custom " ) ) {
return sql + " LIMIT " + view . getResultCount ( ) + " offset 0 " ;
} else {
return sql ;
}
}
}