mirror of
https://github.com/tencentmusic/supersonic.git
synced 2026-04-26 01:34:53 +08:00
Compare commits
4 Commits
master
...
fb71ed3dc1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb71ed3dc1 | ||
|
|
f764236657 | ||
|
|
738093bc88 | ||
|
|
b6d1525daa |
@@ -78,7 +78,8 @@ public abstract class SemanticNode {
|
||||
scope.getValidator().getCatalogReader().getRootSchema(), engineType);
|
||||
if (Configuration.getSqlAdvisor(sqlValidatorWithHints, engineType).getReservedAndKeyWords()
|
||||
.contains(expression.toUpperCase())) {
|
||||
if (engineType == EngineType.HANADB || engineType == EngineType.PRESTO || engineType == EngineType.TRINO) {
|
||||
if (engineType == EngineType.HANADB || engineType == EngineType.PRESTO
|
||||
|| engineType == EngineType.TRINO) {
|
||||
expression = String.format("\"%s\"", expression);
|
||||
} else {
|
||||
expression = String.format("`%s`", expression);
|
||||
@@ -166,9 +167,9 @@ public abstract class SemanticNode {
|
||||
if (sqlNode instanceof SqlBasicCall) {
|
||||
SqlBasicCall sqlBasicCall = (SqlBasicCall) sqlNode;
|
||||
if (sqlBasicCall.getOperator().getKind().equals(SqlKind.AS)) {
|
||||
if (sqlBasicCall.getOperandList().get(0) instanceof SqlSelect) {
|
||||
SqlSelect table = (SqlSelect) sqlBasicCall.getOperandList().get(0);
|
||||
return table;
|
||||
SqlNode innerQuery = sqlBasicCall.getOperandList().get(0);
|
||||
if (innerQuery instanceof SqlCall) {
|
||||
return innerQuery;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,13 @@ public class SqlBuilder {
|
||||
SqlNode parserNode = tableView.build();
|
||||
DatabaseResp database = queryStatement.getOntology().getDatabase();
|
||||
EngineType engineType = EngineType.fromString(database.getType());
|
||||
parserNode = optimizeParseNode(parserNode, engineType);
|
||||
try {
|
||||
parserNode = optimizeParseNode(parserNode, engineType);
|
||||
} catch (Exception e) {
|
||||
// failure in optimization phase doesn't affect the query result,
|
||||
// just ignore it
|
||||
log.error("optimizeParseNode error", e);
|
||||
}
|
||||
return SemanticNode.getSql(parserNode, engineType);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,12 +48,13 @@ const MetricTrend: React.FC<Props> = ({
|
||||
const { queryColumns, queryResults, aggregateInfo, entityInfo, chatContext } = data;
|
||||
const [chartType, setChartType] = useState('line');
|
||||
|
||||
const dateField: any = queryColumns?.find(
|
||||
const dateField = queryColumns?.find(
|
||||
(column: any) => column.showType === 'DATE' || column.type === 'DATE'
|
||||
);
|
||||
const dateColumnName = dateField?.bizName || '';
|
||||
const categoryColumnName =
|
||||
queryColumns?.find((column: any) => column.showType === 'CATEGORY')?.bizName || '';
|
||||
let categoryColumnName =
|
||||
queryColumns?.find((column: any) => column.showType === 'CATEGORY')?.bizName || '';
|
||||
categoryColumnName = categoryColumnName === dateColumnName ? '' : categoryColumnName;
|
||||
const metricFields = queryColumns?.filter((column: any) => column.showType === 'NUMBER');
|
||||
|
||||
const currentMetricField = queryColumns?.find((column: any) => column.showType === 'NUMBER');
|
||||
@@ -80,11 +81,11 @@ const MetricTrend: React.FC<Props> = ({
|
||||
<MetricInfo aggregateInfo={aggregateInfo} currentMetricField={currentMetricField} />
|
||||
)}
|
||||
<div className={`${prefixCls}-select-options`}>
|
||||
<DateOptions
|
||||
chatContext={chatContext}
|
||||
currentDateOption={currentDateOption}
|
||||
onSelectDateOption={onSelectDateOption}
|
||||
/>
|
||||
{/*<DateOptions*/}
|
||||
{/* chatContext={chatContext}*/}
|
||||
{/* currentDateOption={currentDateOption}*/}
|
||||
{/* onSelectDateOption={onSelectDateOption}*/}
|
||||
{/*/>*/}
|
||||
<div>
|
||||
<Select
|
||||
defaultValue="line"
|
||||
|
||||
@@ -8,7 +8,7 @@ import { ISemantic } from '../../data';
|
||||
import {
|
||||
AGG_OPTIONS,
|
||||
DATE_FORMATTER,
|
||||
DATE_OPTIONS,
|
||||
// DATE_OPTIONS,
|
||||
DIM_OPTIONS,
|
||||
EnumDataSourceType,
|
||||
EnumModelDataType,
|
||||
@@ -275,7 +275,7 @@ const ModelFieldForm: React.FC<Props> = ({
|
||||
}
|
||||
}
|
||||
if ([EnumDataSourceType.TIME, EnumDataSourceType.PARTITION_TIME].includes(type)) {
|
||||
const { dateFormat, timeGranularity } = record;
|
||||
const { dateFormat } = record;
|
||||
const dateFormatterOptions =
|
||||
type === EnumDataSourceType.PARTITION_TIME ? PARTITION_TIME_FORMATTER : DATE_FORMATTER;
|
||||
|
||||
@@ -302,25 +302,25 @@ const ModelFieldForm: React.FC<Props> = ({
|
||||
<ExclamationCircleOutlined />
|
||||
</Tooltip>
|
||||
</Space>
|
||||
<Space>
|
||||
<span>时间粒度:</span>
|
||||
<Select
|
||||
placeholder="时间粒度"
|
||||
value={timeGranularity === '' ? undefined : timeGranularity}
|
||||
onChange={(value) => {
|
||||
handleFieldChange(record, 'timeGranularity', value);
|
||||
}}
|
||||
defaultValue={timeGranularity === '' ? undefined : DATE_OPTIONS[0]}
|
||||
style={{ minWidth: 180 }}
|
||||
allowClear
|
||||
>
|
||||
{DATE_OPTIONS.map((item) => (
|
||||
<Option key={item} value={item}>
|
||||
{item}
|
||||
</Option>
|
||||
))}
|
||||
</Select>
|
||||
</Space>
|
||||
{/*<Space>*/}
|
||||
{/* <span>时间粒度:</span>*/}
|
||||
{/* <Select*/}
|
||||
{/* placeholder="时间粒度"*/}
|
||||
{/* value={timeGranularity === '' ? undefined : timeGranularity}*/}
|
||||
{/* onChange={(value) => {*/}
|
||||
{/* handleFieldChange(record, 'timeGranularity', value);*/}
|
||||
{/* }}*/}
|
||||
{/* defaultValue={timeGranularity === '' ? undefined : DATE_OPTIONS[0]}*/}
|
||||
{/* style={{ minWidth: 180 }}*/}
|
||||
{/* allowClear*/}
|
||||
{/* >*/}
|
||||
{/* {DATE_OPTIONS.map((item) => (*/}
|
||||
{/* <Option key={item} value={item}>*/}
|
||||
{/* {item}*/}
|
||||
{/* </Option>*/}
|
||||
{/* ))}*/}
|
||||
{/* </Select>*/}
|
||||
{/*</Space>*/}
|
||||
</Space>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user