Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
bde48836c8
@ -40,6 +40,7 @@ import javax.annotation.Resource;
|
|||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -108,13 +109,14 @@ public class DorisQueryProvider extends QueryProvider {
|
|||||||
.build();
|
.build();
|
||||||
List<SQLObj> xFields = new ArrayList<>();
|
List<SQLObj> xFields = new ArrayList<>();
|
||||||
List<String> fieldList = fields.stream().map(DatasetTableField::getId).collect(Collectors.toList());
|
List<String> fieldList = fields.stream().map(DatasetTableField::getId).collect(Collectors.toList());
|
||||||
|
AtomicInteger sortIndex = new AtomicInteger(-1);
|
||||||
if (CollectionUtils.isNotEmpty(sortFields)) {
|
if (CollectionUtils.isNotEmpty(sortFields)) {
|
||||||
sortFields.forEach(item -> {
|
sortFields.forEach(item -> {
|
||||||
int indexOf = fieldList.indexOf(item.getId());
|
sortIndex.set(fieldList.indexOf(item.getId()));
|
||||||
if (indexOf == -1) {
|
if (sortIndex.get() == -1) {
|
||||||
fields.add(item);
|
fields.add(item);
|
||||||
} else {
|
} else {
|
||||||
fields.set(indexOf, item);
|
fields.set(sortIndex.get(), item);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -218,6 +220,19 @@ public class DorisQueryProvider extends QueryProvider {
|
|||||||
if (CollectionUtils.isNotEmpty(xOrders)) {
|
if (CollectionUtils.isNotEmpty(xOrders)) {
|
||||||
st.add("orders", xOrders);
|
st.add("orders", xOrders);
|
||||||
}
|
}
|
||||||
|
if (CollectionUtils.isNotEmpty(xFields)) {
|
||||||
|
List<SQLObj> finallyFields = new ArrayList<>();
|
||||||
|
for (int i = 0; i < xFields.size(); i++) {
|
||||||
|
if (CollectionUtils.isNotEmpty(xOrders) && sortIndex.get() == -1 && i == xFields.size() - 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
SQLObj f = xFields.get(i);
|
||||||
|
String prefix = finallyFields.isEmpty() ? " DISTINCT " : "";
|
||||||
|
f.setFieldName(prefix + String.format(MySQLConstants.KEYWORD_FIX, tableSQL.getTableAlias(), f.getFieldAlias()));
|
||||||
|
finallyFields.add(f);
|
||||||
|
}
|
||||||
|
st.add("groups", finallyFields);
|
||||||
|
}
|
||||||
if (ObjectUtils.isNotEmpty(limit)) {
|
if (ObjectUtils.isNotEmpty(limit)) {
|
||||||
return st.render() + " LIMIT 0," + limit;
|
return st.render() + " LIMIT 0," + limit;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -163,7 +163,6 @@ public class Db2QueryProvider extends QueryProvider {
|
|||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
|
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
|
||||||
ST st_sql = stg.getInstanceOf("previewSql");
|
ST st_sql = stg.getInstanceOf("previewSql");
|
||||||
st_sql.add("isGroup", isGroup);
|
st_sql.add("isGroup", isGroup);
|
||||||
@ -193,6 +192,17 @@ public class Db2QueryProvider extends QueryProvider {
|
|||||||
}
|
}
|
||||||
if (ObjectUtils.isNotEmpty(xOrders)) {
|
if (ObjectUtils.isNotEmpty(xOrders)) {
|
||||||
st_sql.add("orders", xOrders);
|
st_sql.add("orders", xOrders);
|
||||||
|
if (needDistinct(sortFields, limit)) {
|
||||||
|
st_sql.remove("groups");
|
||||||
|
xOrders.forEach(f -> {
|
||||||
|
if (xFields.stream().noneMatch(x -> x.getFieldName().equals(f.getOrderField()))) {
|
||||||
|
String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, xFields.size());
|
||||||
|
SQLObj tField = SQLObj.builder().fieldName(f.getOrderField()).fieldAlias(fieldAlias).build();
|
||||||
|
xFields.add(tField);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
st_sql.add("groups", xFields);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ObjectUtils.isNotEmpty(limit)) {
|
if (ObjectUtils.isNotEmpty(limit)) {
|
||||||
ChartViewWithBLOBs view = new ChartViewWithBLOBs();
|
ChartViewWithBLOBs view = new ChartViewWithBLOBs();
|
||||||
|
|||||||
@ -39,6 +39,7 @@ import javax.annotation.Resource;
|
|||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -168,13 +169,14 @@ public class MysqlQueryProvider extends QueryProvider {
|
|||||||
.build();
|
.build();
|
||||||
List<SQLObj> xFields = new ArrayList<>();
|
List<SQLObj> xFields = new ArrayList<>();
|
||||||
List<String> fieldList = fields.stream().map(DatasetTableField::getId).collect(Collectors.toList());
|
List<String> fieldList = fields.stream().map(DatasetTableField::getId).collect(Collectors.toList());
|
||||||
|
AtomicInteger sortIndex = new AtomicInteger(-1);
|
||||||
if (CollectionUtils.isNotEmpty(sortFields)) {
|
if (CollectionUtils.isNotEmpty(sortFields)) {
|
||||||
sortFields.forEach(item -> {
|
sortFields.forEach(item -> {
|
||||||
int indexOf = fieldList.indexOf(item.getId());
|
sortIndex.set(fieldList.indexOf(item.getId()));
|
||||||
if (indexOf == -1) {
|
if (sortIndex.get() == -1) {
|
||||||
fields.add(item);
|
fields.add(item);
|
||||||
} else {
|
} else {
|
||||||
fields.set(indexOf, item);
|
fields.set(sortIndex.get(), item);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -273,6 +275,19 @@ public class MysqlQueryProvider extends QueryProvider {
|
|||||||
if (CollectionUtils.isNotEmpty(xOrders)) {
|
if (CollectionUtils.isNotEmpty(xOrders)) {
|
||||||
st.add("orders", xOrders);
|
st.add("orders", xOrders);
|
||||||
}
|
}
|
||||||
|
if (CollectionUtils.isNotEmpty(xFields)) {
|
||||||
|
List<SQLObj> finallyFields = new ArrayList<>();
|
||||||
|
for (int i = 0; i < xFields.size(); i++) {
|
||||||
|
if (CollectionUtils.isNotEmpty(xOrders) && sortIndex.get() == -1 && i == xFields.size() - 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
SQLObj f = xFields.get(i);
|
||||||
|
String prefix = finallyFields.isEmpty() ? " DISTINCT " : "";
|
||||||
|
f.setFieldName(prefix + String.format(MySQLConstants.KEYWORD_FIX, tableSQL.getTableAlias(), f.getFieldAlias()));
|
||||||
|
finallyFields.add(f);
|
||||||
|
}
|
||||||
|
st.add("groups", finallyFields);
|
||||||
|
}
|
||||||
if (ObjectUtils.isNotEmpty(limit)) {
|
if (ObjectUtils.isNotEmpty(limit)) {
|
||||||
ChartViewWithBLOBs view = new ChartViewWithBLOBs();
|
ChartViewWithBLOBs view = new ChartViewWithBLOBs();
|
||||||
view.setResultMode("custom");
|
view.setResultMode("custom");
|
||||||
|
|||||||
@ -121,8 +121,6 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
|
|
||||||
setSchema(tableObj, ds);
|
setSchema(tableObj, ds);
|
||||||
List<SQLObj> xFields = xFields(table, fields);
|
List<SQLObj> xFields = xFields(table, fields);
|
||||||
|
|
||||||
|
|
||||||
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
|
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
|
||||||
ST st_sql = stg.getInstanceOf("previewSql");
|
ST st_sql = stg.getInstanceOf("previewSql");
|
||||||
st_sql.add("isGroup", isGroup);
|
st_sql.add("isGroup", isGroup);
|
||||||
@ -151,6 +149,17 @@ public class OracleQueryProvider extends QueryProvider {
|
|||||||
}
|
}
|
||||||
if (ObjectUtils.isNotEmpty(xOrders)) {
|
if (ObjectUtils.isNotEmpty(xOrders)) {
|
||||||
st_sql.add("orders", xOrders);
|
st_sql.add("orders", xOrders);
|
||||||
|
if (needDistinct(sortFields, limit)) {
|
||||||
|
st_sql.remove("groups");
|
||||||
|
xOrders.forEach(f -> {
|
||||||
|
if (xFields.stream().noneMatch(x -> x.getFieldName().equals(f.getOrderField()))) {
|
||||||
|
String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, xFields.size());
|
||||||
|
SQLObj tField = SQLObj.builder().fieldName(f.getOrderField()).fieldAlias(fieldAlias).build();
|
||||||
|
xFields.add(tField);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
st_sql.add("groups", xFields);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ObjectUtils.isNotEmpty(limit)) {
|
if (ObjectUtils.isNotEmpty(limit)) {
|
||||||
ChartViewWithBLOBs view = new ChartViewWithBLOBs();
|
ChartViewWithBLOBs view = new ChartViewWithBLOBs();
|
||||||
|
|||||||
@ -170,10 +170,10 @@ public class PgQueryProvider extends QueryProvider {
|
|||||||
.fieldOriginName(originField)
|
.fieldOriginName(originField)
|
||||||
.fieldName(fieldName)
|
.fieldName(fieldName)
|
||||||
.fieldAlias(fieldAlias)
|
.fieldAlias(fieldAlias)
|
||||||
|
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
|
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
|
||||||
ST st_sql = stg.getInstanceOf("previewSql");
|
ST st_sql = stg.getInstanceOf("previewSql");
|
||||||
st_sql.add("isGroup", isGroup);
|
st_sql.add("isGroup", isGroup);
|
||||||
@ -207,6 +207,17 @@ public class PgQueryProvider extends QueryProvider {
|
|||||||
}
|
}
|
||||||
if (ObjectUtils.isNotEmpty(xOrders)) {
|
if (ObjectUtils.isNotEmpty(xOrders)) {
|
||||||
st_sql.add("orders", xOrders);
|
st_sql.add("orders", xOrders);
|
||||||
|
if (needDistinct(sortFields, limit)) {
|
||||||
|
st_sql.remove("groups");
|
||||||
|
xOrders.forEach(f -> {
|
||||||
|
if (xFields.stream().noneMatch(x -> x.getFieldName().equals(f.getOrderField()))) {
|
||||||
|
String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, xFields.size());
|
||||||
|
SQLObj tField = SQLObj.builder().fieldName(f.getOrderField()).fieldAlias(fieldAlias).build();
|
||||||
|
xFields.add(tField);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
st_sql.add("groups", xFields);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ObjectUtils.isNotEmpty(limit)) {
|
if (ObjectUtils.isNotEmpty(limit)) {
|
||||||
if (ObjectUtils.isNotEmpty(limit)) {
|
if (ObjectUtils.isNotEmpty(limit)) {
|
||||||
|
|||||||
@ -250,7 +250,20 @@ public class SqlserverQueryProvider extends QueryProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ObjectUtils.isNotEmpty(limit)) {
|
if (ObjectUtils.isNotEmpty(limit)) {
|
||||||
SQLObj limitFiled = SQLObj.builder().limitFiled(" top " + limit + " ").build();
|
String topKeyWord = " top ";
|
||||||
|
if (needDistinct(sortFields, limit)) {
|
||||||
|
topKeyWord = " distinct top ";
|
||||||
|
st_sql.remove("groups");
|
||||||
|
xOrders.forEach(f -> {
|
||||||
|
if (xFields.stream().noneMatch(x -> x.getFieldName().equals(f.getOrderField()))) {
|
||||||
|
String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, xFields.size());
|
||||||
|
SQLObj tField = SQLObj.builder().fieldName(f.getOrderField()).fieldAlias(fieldAlias).build();
|
||||||
|
xFields.add(tField);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
st_sql.add("groups", xFields);
|
||||||
|
}
|
||||||
|
SQLObj limitFiled = SQLObj.builder().limitFiled(topKeyWord + limit + " ").build();
|
||||||
st_sql.add("limitFiled", limitFiled);
|
st_sql.add("limitFiled", limitFiled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@
|
|||||||
<el-radio
|
<el-radio
|
||||||
:key="item.id + 'radio'"
|
:key="item.id + 'radio'"
|
||||||
:label="item.text"
|
:label="item.text"
|
||||||
|
class="is-custom-select"
|
||||||
:value="item.id"
|
:value="item.id"
|
||||||
v-if="radioStyle.showStyle === 'single'"
|
v-if="radioStyle.showStyle === 'single'"
|
||||||
:disabled="itemDisabled"
|
:disabled="itemDisabled"
|
||||||
@ -16,6 +17,7 @@
|
|||||||
v-else
|
v-else
|
||||||
:disabled="itemDisabled"
|
:disabled="itemDisabled"
|
||||||
:key="item.id + 'tab'"
|
:key="item.id + 'tab'"
|
||||||
|
class="is-custom-select"
|
||||||
:label="item.text"
|
:label="item.text"
|
||||||
:value="item.id"
|
:value="item.id"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -2890,7 +2890,7 @@ export default {
|
|||||||
chart_data: 'View data',
|
chart_data: 'View data',
|
||||||
panel_preview: 'Preview report',
|
panel_preview: 'Preview report',
|
||||||
preview: 'Preview',
|
preview: 'Preview',
|
||||||
emial_preview: 'Report preview',
|
email_preview: 'Report preview',
|
||||||
chart_data_range: 'View data range',
|
chart_data_range: 'View data range',
|
||||||
panel_format: 'Panel format',
|
panel_format: 'Panel format',
|
||||||
simple_repeat: 'Simple repeat',
|
simple_repeat: 'Simple repeat',
|
||||||
|
|||||||
@ -2883,7 +2883,7 @@ export default {
|
|||||||
chart_data: '視圖數據',
|
chart_data: '視圖數據',
|
||||||
panel_preview: '預覽報告',
|
panel_preview: '預覽報告',
|
||||||
preview: '預覽',
|
preview: '預覽',
|
||||||
emial_preview: '報告預覽',
|
email_preview: '報告預覽',
|
||||||
chart_data_range: '視圖數據範圍',
|
chart_data_range: '視圖數據範圍',
|
||||||
panel_format: '儀表板格式',
|
panel_format: '儀表板格式',
|
||||||
simple_repeat: '簡單重複',
|
simple_repeat: '簡單重複',
|
||||||
|
|||||||
@ -2885,7 +2885,7 @@ export default {
|
|||||||
chart_data: '视图数据',
|
chart_data: '视图数据',
|
||||||
panel_preview: '预览报告',
|
panel_preview: '预览报告',
|
||||||
preview: '预览',
|
preview: '预览',
|
||||||
emial_preview: '报告预览',
|
email_preview: '报告预览',
|
||||||
chart_data_range: '视图数据范围',
|
chart_data_range: '视图数据范围',
|
||||||
panel_format: '仪表板格式',
|
panel_format: '仪表板格式',
|
||||||
simple_repeat: '简单重复',
|
simple_repeat: '简单重复',
|
||||||
|
|||||||
@ -833,7 +833,7 @@ div:focus {
|
|||||||
color: #1F2329 !important;
|
color: #1F2329 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-radio__input.is-checked:not(.is-disabled)+.el-radio__label {
|
.el-radio:not(.is-custom-select) .el-radio__input.is-checked:not(.is-disabled)+.el-radio__label {
|
||||||
color: var(--deTextPrimary, #1F2329) !important;
|
color: var(--deTextPrimary, #1F2329) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -10,13 +10,15 @@
|
|||||||
v-for="ele in intervalTypeList"
|
v-for="ele in intervalTypeList"
|
||||||
:key="ele.value"
|
:key="ele.value"
|
||||||
:label="ele.value"
|
:label="ele.value"
|
||||||
>{{ $t(`time.${ele.label}`) }}</el-radio
|
>{{ $t(`time.${ele.label}`) }}</el-radio>
|
||||||
>
|
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="list-item" v-if="timeRange.intervalType !== 'none'">
|
<div
|
||||||
|
v-if="timeRange.intervalType !== 'none'"
|
||||||
|
class="list-item"
|
||||||
|
>
|
||||||
<div class="label">{{ $t(`time.${regularOrTrendsTitle}`) }}</div>
|
<div class="label">{{ $t(`time.${regularOrTrendsTitle}`) }}</div>
|
||||||
<div class="setting-content">
|
<div class="setting-content">
|
||||||
<div class="setting">
|
<div class="setting">
|
||||||
@ -33,7 +35,10 @@
|
|||||||
{{ $t("time.relative_to_current") }}
|
{{ $t("time.relative_to_current") }}
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value select">
|
<div class="setting-value select">
|
||||||
<el-select size="small" v-model="timeRange.relativeToCurrent">
|
<el-select
|
||||||
|
v-model="timeRange.relativeToCurrent"
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in relativeToCurrentList"
|
v-for="item in relativeToCurrentList"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
@ -43,7 +48,10 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting" v-if="timeRange.relativeToCurrent === 'custom'">
|
<div
|
||||||
|
v-if="timeRange.relativeToCurrent === 'custom'"
|
||||||
|
class="setting"
|
||||||
|
>
|
||||||
<div class="setting-input">
|
<div class="setting-input">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="timeRange.timeNum"
|
v-model="timeRange.timeNum"
|
||||||
@ -51,7 +59,10 @@
|
|||||||
:min="0"
|
:min="0"
|
||||||
controls-position="right"
|
controls-position="right"
|
||||||
/>
|
/>
|
||||||
<el-select size="small" v-model="timeRange.relativeToCurrentType">
|
<el-select
|
||||||
|
v-model="timeRange.relativeToCurrentType"
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in relativeToCurrentTypeList"
|
v-for="item in relativeToCurrentTypeList"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
@ -59,7 +70,10 @@
|
|||||||
:value="item.value"
|
:value="item.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-select size="small" v-model="timeRange.around">
|
<el-select
|
||||||
|
v-model="timeRange.around"
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in aroundList"
|
v-for="item in aroundList"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
@ -82,7 +96,10 @@
|
|||||||
:min="0"
|
:min="0"
|
||||||
controls-position="right"
|
controls-position="right"
|
||||||
/>
|
/>
|
||||||
<el-select size="small" v-model="timeRange.relativeToCurrentType">
|
<el-select
|
||||||
|
v-model="timeRange.relativeToCurrentType"
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in relativeToCurrentTypeList"
|
v-for="item in relativeToCurrentTypeList"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
@ -90,7 +107,10 @@
|
|||||||
:value="item.value"
|
:value="item.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-select size="small" v-model="timeRange.around">
|
<el-select
|
||||||
|
v-model="timeRange.around"
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in aroundList"
|
v-for="item in aroundList"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
@ -109,7 +129,10 @@
|
|||||||
:min="0"
|
:min="0"
|
||||||
controls-position="right"
|
controls-position="right"
|
||||||
/>
|
/>
|
||||||
<el-select size="small" v-model="timeRange.relativeToCurrentTypeRange">
|
<el-select
|
||||||
|
v-model="timeRange.relativeToCurrentTypeRange"
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in relativeToCurrentTypeList"
|
v-for="item in relativeToCurrentTypeList"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
@ -117,7 +140,10 @@
|
|||||||
:value="item.value"
|
:value="item.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-select size="small" v-model="timeRange.aroundRange">
|
<el-select
|
||||||
|
v-model="timeRange.aroundRange"
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in aroundList"
|
v-for="item in aroundList"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
@ -129,15 +155,21 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div class="parameters" :class="dynamicTime && 'setting'">
|
<div
|
||||||
<div class="setting-label" v-if="dynamicTime">
|
class="parameters"
|
||||||
|
:class="dynamicTime && 'setting'"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="dynamicTime"
|
||||||
|
class="setting-label"
|
||||||
|
>
|
||||||
{{ $t("time.preview") }}
|
{{ $t("time.preview") }}
|
||||||
</div>
|
</div>
|
||||||
<div :class="dynamicTime ? 'setting-value' : 'w100'">
|
<div :class="dynamicTime ? 'setting-value' : 'w100'">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
:disabled="timeRange.regularOrTrends !== 'fixed'"
|
|
||||||
v-model="timeRange.regularOrTrendsValue"
|
|
||||||
:key="timeInterval"
|
:key="timeInterval"
|
||||||
|
v-model="timeRange.regularOrTrendsValue"
|
||||||
|
:disabled="timeRange.regularOrTrends !== 'fixed'"
|
||||||
:type="timeInterval"
|
:type="timeInterval"
|
||||||
size="small"
|
size="small"
|
||||||
:start-placeholder="$t('dataset.start_time')"
|
:start-placeholder="$t('dataset.start_time')"
|
||||||
@ -169,103 +201,108 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="popover-foot">
|
<div class="popover-foot">
|
||||||
<de-btn secondary @click="closeFilter">{{ $t("chart.cancel") }} </de-btn>
|
<de-btn
|
||||||
<de-btn type="primary" @click="changeFilter"
|
secondary
|
||||||
>{{ $t("chart.confirm") }}
|
@click="closeFilter"
|
||||||
|
>{{ $t("chart.cancel") }} </de-btn>
|
||||||
|
<de-btn
|
||||||
|
type="primary"
|
||||||
|
@click="changeFilter"
|
||||||
|
>{{ $t("chart.confirm") }}
|
||||||
</de-btn>
|
</de-btn>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getThisStart, getLastStart, getAround } from "./time-format-dayjs";
|
import { getThisStart, getLastStart, getAround } from './time-format-dayjs'
|
||||||
import { cloneDeep } from "lodash-es";
|
import { cloneDeep } from 'lodash-es'
|
||||||
const intervalTypeList = [
|
const intervalTypeList = [
|
||||||
{
|
{
|
||||||
label: "nothing",
|
label: 'nothing',
|
||||||
value: "none",
|
value: 'none'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "starting_from",
|
label: 'starting_from',
|
||||||
value: "start",
|
value: 'start'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "end_at",
|
label: 'end_at',
|
||||||
value: "end",
|
value: 'end'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "time_interval",
|
label: 'time_interval',
|
||||||
value: "timeInterval",
|
value: 'timeInterval'
|
||||||
},
|
}
|
||||||
];
|
]
|
||||||
const aroundList = [
|
const aroundList = [
|
||||||
{
|
{
|
||||||
label: "ago",
|
label: 'ago',
|
||||||
value: "f",
|
value: 'f'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "after",
|
label: 'after',
|
||||||
value: "b",
|
value: 'b'
|
||||||
},
|
}
|
||||||
];
|
]
|
||||||
const relativeToCurrentTypeList = [
|
const relativeToCurrentTypeList = [
|
||||||
{
|
{
|
||||||
label: "year",
|
label: 'year',
|
||||||
value: "year",
|
value: 'year'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "month",
|
label: 'month',
|
||||||
value: "month",
|
value: 'month'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "day",
|
label: 'day',
|
||||||
value: "day",
|
value: 'day'
|
||||||
},
|
}
|
||||||
];
|
]
|
||||||
|
|
||||||
const relativeToCurrentList = [
|
const relativeToCurrentList = [
|
||||||
{
|
{
|
||||||
label: "today",
|
label: 'today',
|
||||||
value: "today",
|
value: 'today'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "yesterday",
|
label: 'yesterday',
|
||||||
value: "yesterday",
|
value: 'yesterday'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "at_the_beginning_of_the_month",
|
label: 'at_the_beginning_of_the_month',
|
||||||
value: "monthBeginning",
|
value: 'monthBeginning'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "at_the_beginning_of_the_year",
|
label: 'at_the_beginning_of_the_year',
|
||||||
value: "yearBeginning",
|
value: 'yearBeginning'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "custom",
|
label: 'custom',
|
||||||
value: "custom",
|
value: 'custom'
|
||||||
},
|
}
|
||||||
];
|
]
|
||||||
|
|
||||||
const defaultObj = {
|
const defaultObj = {
|
||||||
intervalType: "none",
|
intervalType: 'none',
|
||||||
dynamicWindow: false,
|
dynamicWindow: false,
|
||||||
maximumSingleQuery: 0,
|
maximumSingleQuery: 0,
|
||||||
regularOrTrends: "fixed",
|
regularOrTrends: 'fixed',
|
||||||
regularOrTrendsValue: "",
|
regularOrTrendsValue: '',
|
||||||
relativeToCurrent: "custom",
|
relativeToCurrent: 'custom',
|
||||||
timeNum: 0,
|
timeNum: 0,
|
||||||
relativeToCurrentType: "year",
|
relativeToCurrentType: 'year',
|
||||||
around: "f",
|
around: 'f',
|
||||||
timeNumRange: 0,
|
timeNumRange: 0,
|
||||||
relativeToCurrentTypeRange: "year",
|
relativeToCurrentTypeRange: 'year',
|
||||||
aroundRange: "f",
|
aroundRange: 'f'
|
||||||
};
|
}
|
||||||
export default {
|
export default {
|
||||||
props: {
|
props: {
|
||||||
timeRangeData: {
|
timeRangeData: {
|
||||||
type: Object,
|
type: Object,
|
||||||
defalut: () => defaultObj,
|
default: () => defaultObj
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@ -274,24 +311,20 @@ export default {
|
|||||||
aroundList,
|
aroundList,
|
||||||
relativeToCurrentList,
|
relativeToCurrentList,
|
||||||
timeRange: {
|
timeRange: {
|
||||||
intervalType: "none",
|
intervalType: 'none',
|
||||||
dynamicWindow: false,
|
dynamicWindow: false,
|
||||||
maximumSingleQuery: 0,
|
maximumSingleQuery: 0,
|
||||||
regularOrTrends: "fixed",
|
regularOrTrends: 'fixed',
|
||||||
regularOrTrendsValue: "",
|
regularOrTrendsValue: '',
|
||||||
relativeToCurrent: "custom",
|
relativeToCurrent: 'custom',
|
||||||
timeNum: 0,
|
timeNum: 0,
|
||||||
relativeToCurrentType: "year",
|
relativeToCurrentType: 'year',
|
||||||
around: "f",
|
around: 'f',
|
||||||
timeNumRange: 0,
|
timeNumRange: 0,
|
||||||
relativeToCurrentTypeRange: "year",
|
relativeToCurrentTypeRange: 'year',
|
||||||
aroundRange: "f",
|
aroundRange: 'f'
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.timeRange = cloneDeep(this.timeRangeData);
|
|
||||||
this.init();
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
timeConfig() {
|
timeConfig() {
|
||||||
@ -303,8 +336,8 @@ export default {
|
|||||||
relativeToCurrent,
|
relativeToCurrent,
|
||||||
timeNumRange,
|
timeNumRange,
|
||||||
relativeToCurrentTypeRange,
|
relativeToCurrentTypeRange,
|
||||||
aroundRange,
|
aroundRange
|
||||||
} = this.timeRange;
|
} = this.timeRange
|
||||||
return {
|
return {
|
||||||
timeNum,
|
timeNum,
|
||||||
relativeToCurrentType,
|
relativeToCurrentType,
|
||||||
@ -313,30 +346,34 @@ export default {
|
|||||||
intervalType,
|
intervalType,
|
||||||
timeNumRange,
|
timeNumRange,
|
||||||
relativeToCurrentTypeRange,
|
relativeToCurrentTypeRange,
|
||||||
aroundRange,
|
aroundRange
|
||||||
};
|
}
|
||||||
},
|
},
|
||||||
regularOrTrendsTitle() {
|
regularOrTrendsTitle() {
|
||||||
return intervalTypeList.find(
|
return intervalTypeList.find(
|
||||||
(ele) => ele.value === this.timeRange.intervalType,
|
(ele) => ele.value === this.timeRange.intervalType
|
||||||
).label;
|
).label
|
||||||
},
|
},
|
||||||
dynamicTime() {
|
dynamicTime() {
|
||||||
return this.timeRange.regularOrTrends !== "fixed";
|
return this.timeRange.regularOrTrends !== 'fixed'
|
||||||
},
|
},
|
||||||
timeInterval() {
|
timeInterval() {
|
||||||
return this.timeRange.intervalType === "timeInterval"
|
return this.timeRange.intervalType === 'timeInterval'
|
||||||
? "daterange"
|
? 'daterange'
|
||||||
: "date";
|
: 'date'
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
timeConfig: {
|
timeConfig: {
|
||||||
handler() {
|
handler() {
|
||||||
this.init();
|
this.init()
|
||||||
},
|
},
|
||||||
deep: true,
|
deep: true
|
||||||
},
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.timeRange = cloneDeep(this.timeRangeData)
|
||||||
|
this.init()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
init() {
|
init() {
|
||||||
@ -350,81 +387,79 @@ export default {
|
|||||||
timeNumRange,
|
timeNumRange,
|
||||||
relativeToCurrentTypeRange,
|
relativeToCurrentTypeRange,
|
||||||
aroundRange,
|
aroundRange,
|
||||||
regularOrTrends,
|
regularOrTrends
|
||||||
} = this.timeRange;
|
} = this.timeRange
|
||||||
if (regularOrTrends === "fixed") {
|
if (regularOrTrends === 'fixed') {
|
||||||
if (intervalType === "timeInterval") {
|
if (intervalType === 'timeInterval') {
|
||||||
if (
|
if (
|
||||||
Array.isArray(regularOrTrendsValue) &&
|
Array.isArray(regularOrTrendsValue) &&
|
||||||
!!regularOrTrendsValue.length
|
!!regularOrTrendsValue.length
|
||||||
)
|
) { return }
|
||||||
return;
|
|
||||||
this.timeRange.regularOrTrendsValue = [
|
this.timeRange.regularOrTrendsValue = [
|
||||||
getAround(relativeToCurrentType, "add", 0),
|
getAround(relativeToCurrentType, 'add', 0),
|
||||||
getAround(relativeToCurrentType, "add", 1),
|
getAround(relativeToCurrentType, 'add', 1)
|
||||||
];
|
]
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
if (!Array.isArray(regularOrTrendsValue) && !!regularOrTrendsValue)
|
if (!Array.isArray(regularOrTrendsValue) && !!regularOrTrendsValue) { return }
|
||||||
return;
|
this.timeRange.regularOrTrendsValue = new Date()
|
||||||
this.timeRange.regularOrTrendsValue = new Date();
|
return
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
if (intervalType === "timeInterval") {
|
if (intervalType === 'timeInterval') {
|
||||||
const startTime = getAround(
|
const startTime = getAround(
|
||||||
relativeToCurrentType,
|
relativeToCurrentType,
|
||||||
around === "f" ? "subtract" : "add",
|
around === 'f' ? 'subtract' : 'add',
|
||||||
timeNum,
|
timeNum
|
||||||
);
|
)
|
||||||
const endTime = getAround(
|
const endTime = getAround(
|
||||||
relativeToCurrentTypeRange,
|
relativeToCurrentTypeRange,
|
||||||
aroundRange === "f" ? "subtract" : "add",
|
aroundRange === 'f' ? 'subtract' : 'add',
|
||||||
timeNumRange,
|
timeNumRange
|
||||||
);
|
)
|
||||||
this.timeRange.regularOrTrendsValue = [startTime, endTime];
|
this.timeRange.regularOrTrendsValue = [startTime, endTime]
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
if (relativeToCurrent === "custom") {
|
if (relativeToCurrent === 'custom') {
|
||||||
this.timeRange.regularOrTrendsValue = getAround(
|
this.timeRange.regularOrTrendsValue = getAround(
|
||||||
relativeToCurrentType,
|
relativeToCurrentType,
|
||||||
around === "f" ? "subtract" : "add",
|
around === 'f' ? 'subtract' : 'add',
|
||||||
timeNum,
|
timeNum
|
||||||
);
|
)
|
||||||
} else {
|
} else {
|
||||||
switch (relativeToCurrent) {
|
switch (relativeToCurrent) {
|
||||||
case "thisYear":
|
case 'thisYear':
|
||||||
this.timeRange.regularOrTrendsValue = getThisStart("year");
|
this.timeRange.regularOrTrendsValue = getThisStart('year')
|
||||||
break;
|
break
|
||||||
case "lastYear":
|
case 'lastYear':
|
||||||
this.timeRange.regularOrTrendsValue = getLastStart("year");
|
this.timeRange.regularOrTrendsValue = getLastStart('year')
|
||||||
break;
|
break
|
||||||
case "thisMonth":
|
case 'thisMonth':
|
||||||
this.timeRange.regularOrTrendsValue = getThisStart("month");
|
this.timeRange.regularOrTrendsValue = getThisStart('month')
|
||||||
break;
|
break
|
||||||
case "lastMonth":
|
case 'lastMonth':
|
||||||
this.timeRange.regularOrTrendsValue = getLastStart("month");
|
this.timeRange.regularOrTrendsValue = getLastStart('month')
|
||||||
break;
|
break
|
||||||
case "today":
|
case 'today':
|
||||||
this.timeRange.regularOrTrendsValue = getThisStart("day");
|
this.timeRange.regularOrTrendsValue = getThisStart('day')
|
||||||
break;
|
break
|
||||||
case "yesterday":
|
case 'yesterday':
|
||||||
this.timeRange.regularOrTrendsValue = getLastStart("day");
|
this.timeRange.regularOrTrendsValue = getLastStart('day')
|
||||||
break;
|
break
|
||||||
case "monthBeginning":
|
case 'monthBeginning':
|
||||||
this.timeRange.regularOrTrendsValue = getThisStart("month");
|
this.timeRange.regularOrTrendsValue = getThisStart('month')
|
||||||
break;
|
break
|
||||||
case "yearBeginning":
|
case 'yearBeginning':
|
||||||
this.timeRange.regularOrTrendsValue = getThisStart("year");
|
this.timeRange.regularOrTrendsValue = getThisStart('year')
|
||||||
break;
|
break
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
closeFilter() {
|
closeFilter() {
|
||||||
this.timeRange = cloneDeep(this.timeRangeData);
|
this.timeRange = cloneDeep(this.timeRangeData)
|
||||||
this.$emit("changeData", null);
|
this.$emit('changeData', null)
|
||||||
},
|
},
|
||||||
changeFilter() {
|
changeFilter() {
|
||||||
const {
|
const {
|
||||||
@ -435,28 +470,28 @@ export default {
|
|||||||
timeNumRange,
|
timeNumRange,
|
||||||
regularOrTrends,
|
regularOrTrends,
|
||||||
relativeToCurrentTypeRange,
|
relativeToCurrentTypeRange,
|
||||||
aroundRange,
|
aroundRange
|
||||||
} = this.timeRange;
|
} = this.timeRange
|
||||||
if (intervalType === "timeInterval" && regularOrTrends === 'dynamic') {
|
if (intervalType === 'timeInterval' && regularOrTrends === 'dynamic') {
|
||||||
const startTime = getAround(
|
const startTime = getAround(
|
||||||
relativeToCurrentType,
|
relativeToCurrentType,
|
||||||
around === "f" ? "subtract" : "add",
|
around === 'f' ? 'subtract' : 'add',
|
||||||
timeNum,
|
timeNum
|
||||||
);
|
)
|
||||||
const endTime = getAround(
|
const endTime = getAround(
|
||||||
relativeToCurrentTypeRange,
|
relativeToCurrentTypeRange,
|
||||||
aroundRange === "f" ? "subtract" : "add",
|
aroundRange === 'f' ? 'subtract' : 'add',
|
||||||
timeNumRange,
|
timeNumRange
|
||||||
);
|
)
|
||||||
if (+endTime < +startTime) {
|
if (+endTime < +startTime) {
|
||||||
this.$message.error(this.$t('time.end_time_start_time'));
|
this.$message.error(this.$t('time.end_time_start_time'))
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.$emit("changeData", cloneDeep(this.timeRange));
|
this.$emit('changeData', cloneDeep(this.timeRange))
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
};
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="less">
|
<style lang="less">
|
||||||
.set-time-filtering-range {
|
.set-time-filtering-range {
|
||||||
|
|||||||
@ -263,4 +263,8 @@ public abstract class QueryProvider {
|
|||||||
}
|
}
|
||||||
return "'%" + value + "%'";
|
return "'%" + value + "%'";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean needDistinct(List<DeSortField> sortFields, Long limit) {
|
||||||
|
return CollectionUtils.isNotEmpty(sortFields) && ObjectUtils.isNotEmpty(limit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user