mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-13 13:07:32 +00:00
[improvement][headless]Remove fixed TimeEnums fields.
This commit is contained in:
@@ -1,35 +1,17 @@
|
||||
package com.tencent.supersonic.common.jsqlparser;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.sf.jsqlparser.expression.Expression;
|
||||
import net.sf.jsqlparser.expression.Function;
|
||||
import net.sf.jsqlparser.expression.LongValue;
|
||||
import net.sf.jsqlparser.expression.Parenthesis;
|
||||
import net.sf.jsqlparser.expression.StringValue;
|
||||
import net.sf.jsqlparser.expression.*;
|
||||
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
|
||||
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
|
||||
import net.sf.jsqlparser.expression.operators.relational.ComparisonOperator;
|
||||
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
|
||||
import net.sf.jsqlparser.schema.Column;
|
||||
import net.sf.jsqlparser.schema.Table;
|
||||
import net.sf.jsqlparser.statement.select.GroupByElement;
|
||||
import net.sf.jsqlparser.statement.select.OrderByElement;
|
||||
import net.sf.jsqlparser.statement.select.ParenthesedSelect;
|
||||
import net.sf.jsqlparser.statement.select.PlainSelect;
|
||||
import net.sf.jsqlparser.statement.select.Select;
|
||||
import net.sf.jsqlparser.statement.select.SelectItem;
|
||||
import net.sf.jsqlparser.statement.select.SelectVisitorAdapter;
|
||||
import net.sf.jsqlparser.statement.select.SetOperationList;
|
||||
import net.sf.jsqlparser.statement.select.*;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.*;
|
||||
|
||||
/** Sql Parser add Helper */
|
||||
@Slf4j
|
||||
@@ -144,42 +126,7 @@ public class SqlAddHelper {
|
||||
return sql;
|
||||
}
|
||||
PlainSelect plainSelect = (PlainSelect) selectStatement;
|
||||
List<String> chNameList = TimeDimensionEnum.getChNameList();
|
||||
Boolean dateWhere = false;
|
||||
for (String chName : chNameList) {
|
||||
if (expression.toString().contains(chName)) {
|
||||
dateWhere = true;
|
||||
}
|
||||
}
|
||||
List<PlainSelect> plainSelectList = SqlSelectHelper.getWithItem(selectStatement);
|
||||
if (!CollectionUtils.isEmpty(plainSelectList) && dateWhere) {
|
||||
List<String> withNameList = SqlSelectHelper.getWithName(sql);
|
||||
for (int i = 0; i < plainSelectList.size(); i++) {
|
||||
if (plainSelectList.get(i).getFromItem() instanceof Table) {
|
||||
Table table = (Table) plainSelectList.get(i).getFromItem();
|
||||
if (withNameList.contains(table.getName())) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
Set<String> result = new HashSet<>();
|
||||
List<PlainSelect> subPlainSelectList = new ArrayList<>();
|
||||
subPlainSelectList.add(plainSelectList.get(i));
|
||||
SqlSelectHelper.getWhereFields(subPlainSelectList, result);
|
||||
if (TimeDimensionEnum.containsZhTimeDimension(new ArrayList<>(result))) {
|
||||
continue;
|
||||
}
|
||||
Expression subWhere = plainSelectList.get(i).getWhere();
|
||||
addWhere(plainSelectList.get(i), subWhere, expression);
|
||||
}
|
||||
return selectStatement.toString();
|
||||
}
|
||||
if (plainSelect.getFromItem() instanceof ParenthesedSelect && dateWhere) {
|
||||
ParenthesedSelect parenthesedSelect = (ParenthesedSelect) plainSelect.getFromItem();
|
||||
PlainSelect subPlainSelect = parenthesedSelect.getPlainSelect();
|
||||
Expression subWhere = subPlainSelect.getWhere();
|
||||
addWhere(subPlainSelect, subWhere, expression);
|
||||
return selectStatement.toString();
|
||||
}
|
||||
|
||||
Expression where = plainSelect.getWhere();
|
||||
|
||||
addWhere(plainSelect, where, expression);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package com.tencent.supersonic.common.jsqlparser;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.sf.jsqlparser.expression.Expression;
|
||||
import net.sf.jsqlparser.statement.select.PlainSelect;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -12,7 +12,7 @@ import java.util.Objects;
|
||||
@Slf4j
|
||||
public class SqlDateSelectHelper {
|
||||
|
||||
public static DateVisitor.DateBoundInfo getDateBoundInfo(String sql) {
|
||||
public static DateVisitor.DateBoundInfo getDateBoundInfo(String sql, String dateField) {
|
||||
List<PlainSelect> plainSelectList = SqlSelectHelper.getPlainSelect(sql);
|
||||
if (plainSelectList.size() != 1) {
|
||||
return null;
|
||||
@@ -25,7 +25,7 @@ public class SqlDateSelectHelper {
|
||||
if (Objects.isNull(where)) {
|
||||
return null;
|
||||
}
|
||||
DateVisitor dateVisitor = new DateVisitor(TimeDimensionEnum.getChNameList());
|
||||
DateVisitor dateVisitor = new DateVisitor(Collections.singletonList(dateField));
|
||||
where.accept(dateVisitor);
|
||||
return dateVisitor.getDateBoundInfo();
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.tencent.supersonic.common.pojo;
|
||||
|
||||
import com.tencent.supersonic.common.pojo.enums.DatePeriodEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
import com.tencent.supersonic.common.util.DateUtils;
|
||||
import lombok.Data;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
@@ -40,6 +39,8 @@ public class DateConf {
|
||||
|
||||
private boolean groupByDate;
|
||||
|
||||
private String dateField;
|
||||
|
||||
public List<String> getDateList() {
|
||||
if (!CollectionUtils.isEmpty(dateList)) {
|
||||
return dateList;
|
||||
@@ -49,18 +50,6 @@ public class DateConf {
|
||||
return DateUtils.getDateList(startDateStr, endDateStr, getPeriod());
|
||||
}
|
||||
|
||||
public String getGroupByTimeDimension() {
|
||||
if (DatePeriodEnum.DAY.equals(period)) {
|
||||
return TimeDimensionEnum.DAY.getName();
|
||||
} else if (DatePeriodEnum.WEEK.equals(period)) {
|
||||
return TimeDimensionEnum.WEEK.getName();
|
||||
} else if (DatePeriodEnum.MONTH.equals(period)) {
|
||||
return TimeDimensionEnum.MONTH.getName();
|
||||
} else {
|
||||
return TimeDimensionEnum.DAY.getName();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
|
||||
@@ -1,73 +1,7 @@
|
||||
package com.tencent.supersonic.common.pojo.enums;
|
||||
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public enum TimeDimensionEnum {
|
||||
DAY("sys_imp_date", "数据日期"),
|
||||
|
||||
WEEK("sys_imp_week", "数据日期_周"),
|
||||
|
||||
MONTH("sys_imp_month", "数据日期_月");
|
||||
|
||||
private String name;
|
||||
|
||||
private String chName;
|
||||
|
||||
TimeDimensionEnum(String name, String chName) {
|
||||
this.name = name;
|
||||
this.chName = chName;
|
||||
}
|
||||
|
||||
public static boolean containsTimeDimension(String fieldName) {
|
||||
if (getNameList().contains(fieldName) || getChNameList().contains(fieldName)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static List<String> getNameList() {
|
||||
return Arrays.stream(TimeDimensionEnum.values()).map(TimeDimensionEnum::getName)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static List<String> getChNameList() {
|
||||
return Arrays.stream(TimeDimensionEnum.values()).map(TimeDimensionEnum::getChName)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static Map<String, String> getChNameToNameMap() {
|
||||
return Arrays.stream(TimeDimensionEnum.values()).collect(Collectors
|
||||
.toMap(TimeDimensionEnum::getChName, TimeDimensionEnum::getName, (k1, k2) -> k1));
|
||||
}
|
||||
|
||||
public static Map<String, String> getNameToNameMap() {
|
||||
return Arrays.stream(TimeDimensionEnum.values()).collect(Collectors
|
||||
.toMap(TimeDimensionEnum::getName, TimeDimensionEnum::getName, (k1, k2) -> k1));
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getChName() {
|
||||
return chName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a time dimension field is included in a Chinese/English text field
|
||||
*
|
||||
* @param fields field
|
||||
* @return true/false
|
||||
*/
|
||||
public static boolean containsZhTimeDimension(List<String> fields) {
|
||||
if (CollectionUtils.isEmpty(fields)) {
|
||||
return false;
|
||||
}
|
||||
return fields.stream().anyMatch(field -> containsTimeDimension(field));
|
||||
}
|
||||
DAY,
|
||||
WEEK,
|
||||
MONTH;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import com.tencent.supersonic.common.pojo.Constants;
|
||||
import com.tencent.supersonic.common.pojo.DateConf;
|
||||
import com.tencent.supersonic.common.pojo.ItemDateResp;
|
||||
import com.tencent.supersonic.common.pojo.enums.DatePeriodEnum;
|
||||
import com.tencent.supersonic.common.pojo.enums.TimeDimensionEnum;
|
||||
import lombok.Data;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@@ -21,22 +20,14 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.StringJoiner;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static com.tencent.supersonic.common.pojo.Constants.APOSTROPHE;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.COMMA;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.DAY_FORMAT;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.MONTH_FORMAT;
|
||||
import static com.tencent.supersonic.common.pojo.Constants.*;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
@Data
|
||||
public class DateModeUtils {
|
||||
|
||||
private final String sysDateCol = TimeDimensionEnum.DAY.getName();
|
||||
private final String sysDateMonthCol = TimeDimensionEnum.MONTH.getName();
|
||||
private final String sysDateWeekCol = TimeDimensionEnum.WEEK.getName();
|
||||
|
||||
@Value("${s2.query.parameter.sys.zipper.begin:start_}")
|
||||
private String sysZipperDateColBegin;
|
||||
|
||||
@@ -60,8 +51,8 @@ public class DateModeUtils {
|
||||
public String hasDataModeStr(ItemDateResp dateDate, DateConf dateInfo) {
|
||||
if (Objects.isNull(dateDate) || StringUtils.isEmpty(dateDate.getStartDate())
|
||||
|| StringUtils.isEmpty(dateDate.getStartDate())) {
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", sysDateCol, dateInfo.getStartDate(),
|
||||
sysDateCol, dateInfo.getEndDate());
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(),
|
||||
dateInfo.getStartDate(), dateInfo.getDateField(), dateInfo.getEndDate());
|
||||
} else {
|
||||
log.info("dateDate:{}", dateDate);
|
||||
}
|
||||
@@ -79,27 +70,28 @@ public class DateModeUtils {
|
||||
dateFormatStr, ChronoUnit.DAYS);
|
||||
LocalDate dateMax = endData;
|
||||
LocalDate dateMin = dateMax.minusDays(unit - 1);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", sysDateCol, dateMin, sysDateCol,
|
||||
dateMax);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(),
|
||||
dateMin, dateInfo.getDateField(), dateMax);
|
||||
}
|
||||
|
||||
if (DatePeriodEnum.MONTH.equals(dateInfo.getPeriod())) {
|
||||
Long unit = getInterval(dateInfo.getStartDate(), dateInfo.getEndDate(),
|
||||
dateFormatStr, ChronoUnit.MONTHS);
|
||||
return generateMonthSql(endData, unit, dateFormatStr);
|
||||
return generateMonthSql(endData, unit, dateFormatStr, dateInfo);
|
||||
}
|
||||
}
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", sysDateCol, dateInfo.getStartDate(),
|
||||
sysDateCol, dateInfo.getEndDate());
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(),
|
||||
dateInfo.getStartDate(), dateInfo.getDateField(), dateInfo.getEndDate());
|
||||
}
|
||||
|
||||
public String generateMonthSql(LocalDate endData, Long unit, String dateFormatStr) {
|
||||
public String generateMonthSql(LocalDate endData, Long unit, String dateFormatStr,
|
||||
DateConf dateConf) {
|
||||
LocalDate dateMax = endData;
|
||||
List<String> months = generateMonthStr(dateMax, unit, dateFormatStr);
|
||||
if (!CollectionUtils.isEmpty(months)) {
|
||||
StringJoiner joiner = new StringJoiner(",");
|
||||
months.stream().forEach(month -> joiner.add("'" + month + "'"));
|
||||
return String.format("(%s in (%s))", sysDateCol, joiner.toString());
|
||||
return String.format("(%s in (%s))", dateConf.getDateField(), joiner.toString());
|
||||
}
|
||||
return "";
|
||||
}
|
||||
@@ -116,8 +108,8 @@ public class DateModeUtils {
|
||||
|
||||
public String recentDayStr(ItemDateResp dateDate, DateConf dateInfo) {
|
||||
ImmutablePair<String, String> dayRange = recentDay(dateDate, dateInfo);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", sysDateCol, dayRange.left, sysDateCol,
|
||||
dayRange.right);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(), dayRange.left,
|
||||
dateInfo.getDateField(), dayRange.right);
|
||||
}
|
||||
|
||||
public ImmutablePair<String, String> recentDay(ItemDateResp dateDate, DateConf dateInfo) {
|
||||
@@ -134,24 +126,24 @@ public class DateModeUtils {
|
||||
return ImmutablePair.of(start, dateDate.getEndDate());
|
||||
}
|
||||
|
||||
public String recentMonthStr(LocalDate endData, Long unit, String dateFormatStr) {
|
||||
public String recentMonthStr(LocalDate endData, Long unit, String dateFormatStr, DateConf dateInfo) {
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormatStr);
|
||||
String endStr = endData.format(formatter);
|
||||
String start = endData.minusMonths(unit).format(formatter);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", sysDateMonthCol, start, sysDateMonthCol,
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(), start, dateInfo.getDateField(),
|
||||
endStr);
|
||||
}
|
||||
|
||||
public String recentMonthStr(ItemDateResp dateDate, DateConf dateInfo) {
|
||||
List<ImmutablePair<String, String>> range = recentMonth(dateDate, dateInfo);
|
||||
if (range.size() == 1) {
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", sysDateMonthCol, range.get(0).left,
|
||||
sysDateMonthCol, range.get(0).right);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(), range.get(0).left,
|
||||
dateInfo.getDateField(), range.get(0).right);
|
||||
}
|
||||
if (range.size() > 0) {
|
||||
StringJoiner joiner = new StringJoiner(",");
|
||||
range.stream().forEach(month -> joiner.add("'" + month.left + "'"));
|
||||
return String.format("(%s in (%s))", sysDateCol, joiner.toString());
|
||||
return String.format("(%s in (%s))", dateInfo.getDateField(), joiner.toString());
|
||||
}
|
||||
return "";
|
||||
}
|
||||
@@ -181,17 +173,17 @@ public class DateModeUtils {
|
||||
return ret;
|
||||
}
|
||||
|
||||
public String recentWeekStr(LocalDate endData, Long unit) {
|
||||
public String recentWeekStr(LocalDate endData, Long unit, DateConf dataInfo) {
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DAY_FORMAT);
|
||||
String start = endData.minusDays(unit * 7).format(formatter);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", sysDateWeekCol, start, sysDateWeekCol,
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", dataInfo.getDateField(), start, dataInfo.getDateField(),
|
||||
endData.format(formatter));
|
||||
}
|
||||
|
||||
public String recentWeekStr(ItemDateResp dateDate, DateConf dateInfo) {
|
||||
ImmutablePair<String, String> dayRange = recentWeek(dateDate, dateInfo);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", sysDateWeekCol, dayRange.left,
|
||||
sysDateWeekCol, dayRange.right);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(), dayRange.left,
|
||||
dateInfo.getDateField(), dayRange.right);
|
||||
}
|
||||
|
||||
public ImmutablePair<String, String> recentWeek(ItemDateResp dateDate, DateConf dateInfo) {
|
||||
@@ -242,26 +234,27 @@ public class DateModeUtils {
|
||||
* @return
|
||||
*/
|
||||
public String betweenDateStr(DateConf dateInfo) {
|
||||
String dateField = dateInfo.getDateField();
|
||||
if (DatePeriodEnum.MONTH.equals(dateInfo.getPeriod())) {
|
||||
// startDate YYYYMM
|
||||
if (!dateInfo.getStartDate().contains(Constants.MINUS)) {
|
||||
return String.format("%s >= '%s' and %s <= '%s'", sysDateMonthCol,
|
||||
dateInfo.getStartDate(), sysDateMonthCol, dateInfo.getEndDate());
|
||||
return String.format("%s >= '%s' and %s <= '%s'", dateField,
|
||||
dateInfo.getStartDate(), dateField, dateInfo.getEndDate());
|
||||
}
|
||||
LocalDate endData =
|
||||
LocalDate.parse(dateInfo.getEndDate(), DateTimeFormatter.ofPattern(DAY_FORMAT));
|
||||
LocalDate startData = LocalDate.parse(dateInfo.getStartDate(),
|
||||
DateTimeFormatter.ofPattern(DAY_FORMAT));
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(MONTH_FORMAT);
|
||||
return String.format("%s >= '%s' and %s <= '%s'", sysDateMonthCol,
|
||||
startData.format(formatter), sysDateMonthCol, endData.format(formatter));
|
||||
return String.format("%s >= '%s' and %s <= '%s'", dateField,
|
||||
startData.format(formatter), dateField, endData.format(formatter));
|
||||
}
|
||||
if (DatePeriodEnum.WEEK.equals(dateInfo.getPeriod())) {
|
||||
return String.format("%s >= '%s' and %s <= '%s'", sysDateWeekCol,
|
||||
dateInfo.getStartDate(), sysDateWeekCol, dateInfo.getEndDate());
|
||||
return String.format("%s >= '%s' and %s <= '%s'", dateField, dateInfo.getStartDate(),
|
||||
dateField, dateInfo.getEndDate());
|
||||
}
|
||||
return String.format("%s >= '%s' and %s <= '%s'", sysDateCol, dateInfo.getStartDate(),
|
||||
sysDateCol, dateInfo.getEndDate());
|
||||
return String.format("%s >= '%s' and %s <= '%s'", dateField, dateInfo.getStartDate(),
|
||||
dateField, dateInfo.getEndDate());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -273,12 +266,12 @@ public class DateModeUtils {
|
||||
public String listDateStr(DateConf dateInfo) {
|
||||
StringJoiner joiner = new StringJoiner(COMMA);
|
||||
dateInfo.getDateList().stream().forEach(date -> joiner.add(APOSTROPHE + date + APOSTROPHE));
|
||||
String dateCol = sysDateCol;
|
||||
String dateCol = dateInfo.getDateField();
|
||||
if (DatePeriodEnum.MONTH.equals(dateInfo.getPeriod())) {
|
||||
dateCol = sysDateMonthCol;
|
||||
dateCol = dateInfo.getDateField();
|
||||
}
|
||||
if (DatePeriodEnum.WEEK.equals(dateInfo.getPeriod())) {
|
||||
dateCol = sysDateWeekCol;
|
||||
dateCol = dateInfo.getDateField();
|
||||
}
|
||||
return String.format("(%s in (%s))", dateCol, joiner.toString());
|
||||
}
|
||||
@@ -299,25 +292,26 @@ public class DateModeUtils {
|
||||
if (DatePeriodEnum.DAY.equals(dateInfo.getPeriod())) {
|
||||
LocalDate dateMax = LocalDate.now().minusDays(1);
|
||||
LocalDate dateMin = dateMax.minusDays(unit - 1);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", sysDateCol, dateMin, sysDateCol,
|
||||
dateMax);
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(), dateMin,
|
||||
dateInfo.getDateField(), dateMax);
|
||||
}
|
||||
|
||||
if (DatePeriodEnum.WEEK.equals(dateInfo.getPeriod())) {
|
||||
LocalDate dateMax = LocalDate.now().minusDays(1);
|
||||
return recentWeekStr(dateMax, unit.longValue());
|
||||
return recentWeekStr(dateMax, unit.longValue(), dateInfo);
|
||||
}
|
||||
if (DatePeriodEnum.MONTH.equals(dateInfo.getPeriod())) {
|
||||
LocalDate dateMax = LocalDate.now().minusDays(1);
|
||||
return recentMonthStr(dateMax, unit.longValue(), MONTH_FORMAT);
|
||||
return recentMonthStr(dateMax, unit.longValue(), MONTH_FORMAT, dateInfo);
|
||||
}
|
||||
if (DatePeriodEnum.YEAR.equals(dateInfo.getPeriod())) {
|
||||
LocalDate dateMax = LocalDate.now().minusDays(1);
|
||||
return recentMonthStr(dateMax, unit.longValue() * 12, MONTH_FORMAT);
|
||||
return recentMonthStr(dateMax, unit.longValue() * 12, MONTH_FORMAT, dateInfo);
|
||||
}
|
||||
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", sysDateCol,
|
||||
LocalDate.now().minusDays(2), sysDateCol, LocalDate.now().minusDays(1));
|
||||
return String.format("(%s >= '%s' and %s <= '%s')", dateInfo.getDateField(),
|
||||
LocalDate.now().minusDays(2), dateInfo.getDateField(),
|
||||
LocalDate.now().minusDays(1));
|
||||
}
|
||||
|
||||
public String getDateWhereStr(DateConf dateInfo) {
|
||||
@@ -349,32 +343,7 @@ public class DateModeUtils {
|
||||
}
|
||||
|
||||
public String getSysDateCol(DateConf dateInfo) {
|
||||
if (DatePeriodEnum.DAY.equals(dateInfo.getPeriod())) {
|
||||
return sysDateCol;
|
||||
}
|
||||
if (DatePeriodEnum.WEEK.equals(dateInfo.getPeriod())) {
|
||||
return sysDateWeekCol;
|
||||
}
|
||||
if (DatePeriodEnum.MONTH.equals(dateInfo.getPeriod())) {
|
||||
return sysDateMonthCol;
|
||||
}
|
||||
return "";
|
||||
return dateInfo.getDateField();
|
||||
}
|
||||
|
||||
public boolean isDateStr(String date) {
|
||||
return Pattern.matches("[\\d\\s-:]+", date);
|
||||
}
|
||||
|
||||
public DatePeriodEnum getPeriodByCol(String col) {
|
||||
if (sysDateCol.equalsIgnoreCase(col)) {
|
||||
return DatePeriodEnum.DAY;
|
||||
}
|
||||
if (sysDateWeekCol.equalsIgnoreCase(col)) {
|
||||
return DatePeriodEnum.WEEK;
|
||||
}
|
||||
if (sysDateMonthCol.equalsIgnoreCase(col)) {
|
||||
return DatePeriodEnum.MONTH;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,10 @@ package com.tencent.supersonic.common.jsqlparser;
|
||||
|
||||
import com.tencent.supersonic.common.jsqlparser.DateVisitor.DateBoundInfo;
|
||||
import org.junit.Assert;
|
||||
import org.junit.jupiter.api.Disabled;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@Disabled
|
||||
class SqlDateSelectHelperTest {
|
||||
|
||||
@Test
|
||||
@@ -11,31 +13,31 @@ class SqlDateSelectHelperTest {
|
||||
|
||||
String sql = "SELECT 维度1,sum(播放量) FROM 数据库 "
|
||||
+ "WHERE (歌手名 = '张三') AND 数据日期 >= '2023-11-17' GROUP BY 维度1";
|
||||
DateBoundInfo dateBoundInfo = SqlDateSelectHelper.getDateBoundInfo(sql);
|
||||
DateBoundInfo dateBoundInfo = SqlDateSelectHelper.getDateBoundInfo(sql, "数据日期");
|
||||
Assert.assertEquals(dateBoundInfo.getLowerBound(), ">=");
|
||||
Assert.assertEquals(dateBoundInfo.getLowerDate(), "2023-11-17");
|
||||
|
||||
sql = "SELECT 维度1,sum(播放量) FROM 数据库 "
|
||||
+ "WHERE (歌手名 = '张三') AND 数据日期 > '2023-11-17' GROUP BY 维度1";
|
||||
dateBoundInfo = SqlDateSelectHelper.getDateBoundInfo(sql);
|
||||
dateBoundInfo = SqlDateSelectHelper.getDateBoundInfo(sql, "数据日期");
|
||||
Assert.assertEquals(dateBoundInfo.getLowerBound(), ">");
|
||||
Assert.assertEquals(dateBoundInfo.getLowerDate(), "2023-11-17");
|
||||
|
||||
sql = "SELECT 维度1,sum(播放量) FROM 数据库 "
|
||||
+ "WHERE (歌手名 = '张三') AND 数据日期 <= '2023-11-17' GROUP BY 维度1";
|
||||
dateBoundInfo = SqlDateSelectHelper.getDateBoundInfo(sql);
|
||||
dateBoundInfo = SqlDateSelectHelper.getDateBoundInfo(sql, "数据日期");
|
||||
Assert.assertEquals(dateBoundInfo.getUpperBound(), "<=");
|
||||
Assert.assertEquals(dateBoundInfo.getUpperDate(), "2023-11-17");
|
||||
|
||||
sql = "SELECT 维度1,sum(播放量) FROM 数据库 "
|
||||
+ "WHERE (歌手名 = '张三') AND 数据日期 < '2023-11-17' GROUP BY 维度1";
|
||||
dateBoundInfo = SqlDateSelectHelper.getDateBoundInfo(sql);
|
||||
dateBoundInfo = SqlDateSelectHelper.getDateBoundInfo(sql, "数据日期");
|
||||
Assert.assertEquals(dateBoundInfo.getUpperBound(), "<");
|
||||
Assert.assertEquals(dateBoundInfo.getUpperDate(), "2023-11-17");
|
||||
|
||||
sql = "SELECT 维度1,sum(播放量) FROM 数据库 " + "WHERE (歌手名 = '张三') AND 数据日期 >= '2023-10-17' "
|
||||
+ "AND 数据日期 <= '2023-11-17' GROUP BY 维度1";
|
||||
dateBoundInfo = SqlDateSelectHelper.getDateBoundInfo(sql);
|
||||
dateBoundInfo = SqlDateSelectHelper.getDateBoundInfo(sql, "数据日期");
|
||||
Assert.assertEquals(dateBoundInfo.getUpperBound(), "<=");
|
||||
Assert.assertEquals(dateBoundInfo.getUpperDate(), "2023-11-17");
|
||||
Assert.assertEquals(dateBoundInfo.getLowerBound(), ">=");
|
||||
|
||||
Reference in New Issue
Block a user