Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ impl PreAggregationsCompiler {
"Pre-aggregation time dimension must be a dimension"
))
})?;
if dimension.dimension_type() != "time" {
if !dimension.is_time() {
return Err(CubeError::user(format!(
"Pre-aggregation time dimension must be a dimension"
)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,15 +146,11 @@ impl BaseFilter {
let filters_context = context.filters_context();
let symbol = self.member_evaluator();
let member_type = match symbol.as_ref() {
MemberSymbol::Dimension(dimension_symbol) => Some(
dimension_symbol
.definition()
.static_data()
.dimension_type
.clone(),
),
MemberSymbol::Dimension(dimension_symbol) => {
Some(dimension_symbol.dimension_type().to_string())
}
MemberSymbol::Measure(measure_symbol) => {
Some(measure_symbol.measure_type().clone())
Some(measure_symbol.measure_type().to_string())
}
_ => None,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ impl MultiStageAppliedState {
m.resolve_reference_chain()
};
if let Ok(dim) = symbol.as_dimension() {
if dim.dimension_type() == "time" {
if dim.is_time() {
Some(symbol)
} else {
None
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use crate::planner::sql_evaluator::collectors::member_childs;
use crate::planner::sql_evaluator::Case;
use crate::planner::sql_evaluator::CaseSwitchDefinition;
use crate::planner::sql_evaluator::CaseSwitchItem;
use crate::planner::sql_evaluator::MeasureKind;
use crate::planner::sql_evaluator::MemberSymbol;
use crate::planner::GranularityHelper;
use crate::planner::QueryProperties;
Expand Down Expand Up @@ -114,12 +115,10 @@ impl MultiStageQueryPlanner {
resolved_multi_stage_dimensions: &mut HashSet<String>,
) -> Result<(MultiStageInodeMember, bool), CubeError> {
let inode = if let Ok(measure) = base_member.as_measure() {
let member_type = if measure.measure_type() == "rank" {
MultiStageInodeMemberType::Rank
} else if !measure.is_calculated() {
MultiStageInodeMemberType::Aggregate
} else {
MultiStageInodeMemberType::Calculate
let member_type = match measure.kind() {
MeasureKind::Rank => MultiStageInodeMemberType::Rank,
MeasureKind::Calculated(_) => MultiStageInodeMemberType::Calculate,
_ => MultiStageInodeMemberType::Aggregate,
};

let time_shift = measure.time_shift().clone();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,7 @@ impl TraversalVisitor for HasMultiStageMembersCollector {
MemberSymbol::Measure(s) => {
if s.is_multi_stage() {
self.has_multi_stage = true;
} else if !self.ignore_cumulative
&& (s.is_rolling_window() || s.measure_type() == "runningTotal")
{
} else if !self.ignore_cumulative && s.is_cumulative() {
self.has_multi_stage = true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ impl<'a> SqlCallBuilder<'a> {
) -> Option<SqlCallDependency> {
if let Ok(member_symbol) = self.build_evaluator(&current_cube_name, &path_tail[0]) {
if let Ok(dimension) = member_symbol.as_dimension() {
if dimension.dimension_type() == "time" && path_tail.len() == 2 {
if dimension.is_time() && path_tail.len() == 2 {
let granularity = &path_tail[1];
if let Ok(Some(granularity_obj)) = GranularityHelper::make_granularity_obj(
self.cube_evaluator.clone(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,42 +38,12 @@ impl SqlNode for EvaluateSqlNode {
let res = visitor.apply(&ev.base_symbol(), node_processor.clone(), templates)?;
Ok(res)
}
MemberSymbol::Measure(ev) => {
let res = if ev.has_sql() {
ev.evaluate_sql(
visitor,
node_processor.clone(),
query_tools.clone(),
templates,
)?
} else if ev.pk_sqls().len() > 1 {
let pk_strings = ev
.pk_sqls()
.iter()
.map(|pk| -> Result<_, CubeError> {
let res = pk.eval(
&visitor,
node_processor.clone(),
query_tools.clone(),
templates,
)?;
templates.cast_to_string(&res)
})
.collect::<Result<Vec<_>, _>>()?;
templates.concat_strings(&pk_strings)?
} else if ev.pk_sqls().len() == 1 {
let pk_sql = ev.pk_sqls().first().unwrap();
pk_sql.eval(
&visitor,
node_processor.clone(),
query_tools.clone(),
templates,
)?
} else {
format!("*")
};
Ok(res)
}
MemberSymbol::Measure(ev) => ev.evaluate_sql(
visitor,
node_processor.clone(),
query_tools.clone(),
templates,
),
MemberSymbol::CubeTable(ev) => ev.evaluate_sql(
visitor,
node_processor.clone(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use super::SqlNode;
use crate::planner::query_tools::QueryTools;
use crate::planner::sql_evaluator::MeasureSymbol;
use crate::planner::sql_evaluator::symbols::{AggregateWrap, MeasureSymbol};
use crate::planner::sql_evaluator::MemberSymbol;
use crate::planner::sql_evaluator::SqlEvaluatorVisitor;
use crate::planner::sql_templates::PlanSqlTemplates;
Expand Down Expand Up @@ -32,12 +32,27 @@ impl FinalMeasureSqlNode {
&self.input
}

fn is_count_distinct(&self, symbol: &MeasureSymbol) -> bool {
symbol.measure_type() == "countDistinct"
|| (symbol.measure_type() == "count"
&& self
.rendered_as_multiplied_measures
.contains(&symbol.full_name()))
fn wrap_aggregate(
&self,
ev: &MeasureSymbol,
input: String,
templates: &PlanSqlTemplates,
) -> Result<String, CubeError> {
let is_multiplied = self
.rendered_as_multiplied_measures
.contains(&ev.full_name());
match ev.kind().aggregate_wrap(is_multiplied) {
AggregateWrap::PassThrough => Ok(input),
AggregateWrap::Function(name) => Ok(format!("{}({})", name, input)),
AggregateWrap::CountDistinct => templates.count_distinct(&input),
AggregateWrap::CountDistinctApprox => {
if self.count_approx_as_state {
templates.hll_init(input)
} else {
templates.count_distinct_approx(input)
}
}
}
}
}

Expand All @@ -59,26 +74,7 @@ impl SqlNode for FinalMeasureSqlNode {
node_processor.clone(),
templates,
)?;

if ev.is_calculated() || ev.measure_type() == "numberAgg" {
input
} else if ev.measure_type() == "countDistinctApprox" {
if self.count_approx_as_state {
templates.hll_init(input)?
} else {
templates.count_distinct_approx(input)?
}
} else if self.is_count_distinct(ev) {
templates.count_distinct(&input)?
} else {
let measure_type = if ev.measure_type() == "runningTotal" {
"sum"
} else {
&ev.measure_type()
};

format!("{}({})", measure_type, input)
}
self.wrap_aggregate(ev, input, templates)?
}
_ => {
return Err(CubeError::internal(format!(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use super::SqlNode;
use crate::planner::query_tools::QueryTools;
use crate::planner::sql_evaluator::sql_nodes::RenderReferences;
use crate::planner::sql_evaluator::sql_nodes::RenderReferencesType;
use crate::planner::sql_evaluator::symbols::AggregateWrap;
use crate::planner::sql_evaluator::MemberSymbol;
use crate::planner::sql_evaluator::SqlEvaluatorVisitor;
use crate::planner::sql_templates::PlanSqlTemplates;
Expand Down Expand Up @@ -48,14 +49,14 @@ impl SqlNode for FinalPreAggregationMeasureSqlNode {
table_ref,
templates.quote_identifier(&column_name.name())?
);
if ev.measure_type() == "count" || ev.measure_type() == "sum" {
format!("sum({})", pre_aggregation_measure)
} else if ev.measure_type() == "countDistinctApprox" {
templates.count_distinct_approx(pre_aggregation_measure)?
} else if ev.measure_type() == "min" || ev.measure_type() == "max" {
format!("{}({})", ev.measure_type(), pre_aggregation_measure)
} else {
format!("sum({})", pre_aggregation_measure)
match ev.kind().pre_aggregate_wrap() {
AggregateWrap::CountDistinctApprox => {
templates.count_distinct_approx(pre_aggregation_measure)?
}
AggregateWrap::Function(name) => {
format!("{}({})", name, pre_aggregation_measure)
}
_ => format!("sum({})", pre_aggregation_measure),
}
}
RenderReferencesType::LiteralValue(value) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use super::SqlNode;
use crate::planner::query_tools::QueryTools;
use crate::planner::sql_evaluator::symbols::DimensionKind;
use crate::planner::sql_evaluator::MemberSymbol;
use crate::planner::sql_evaluator::SqlEvaluatorVisitor;
use crate::planner::sql_templates::PlanSqlTemplates;
Expand Down Expand Up @@ -32,31 +33,20 @@ impl SqlNode for GeoDimensionSqlNode {
) -> Result<String, CubeError> {
let res = match node.as_ref() {
MemberSymbol::Dimension(ev) => {
if ev.dimension_type() == "geo" {
if let (Some(latitude), Some(longitude)) = (ev.latitude(), ev.longitude()) {
let latitude_str = latitude.eval(
visitor,
node_processor.clone(),
query_tools.clone(),
templates,
)?;
let longitude_str = longitude.eval(
visitor,
node_processor.clone(),
query_tools.clone(),
templates,
)?;
templates.concat_strings(&vec![
latitude_str,
format!("','"),
longitude_str,
])?
} else {
return Err(CubeError::user(format!(
"Geo dimension '{}' must have latitude and longitude",
ev.full_name()
)));
}
if let DimensionKind::Geo(geo) = ev.kind() {
let latitude_str = geo.latitude().eval(
visitor,
node_processor.clone(),
query_tools.clone(),
templates,
)?;
let longitude_str = geo.longitude().eval(
visitor,
node_processor.clone(),
query_tools.clone(),
templates,
)?;
templates.concat_strings(&vec![latitude_str, format!("','"), longitude_str])?
} else {
self.input.to_sql(
visitor,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use super::SqlNode;
use crate::planner::query_tools::QueryTools;
use crate::planner::sql_evaluator::symbols::MeasureKind;
use crate::planner::sql_evaluator::MemberSymbol;
use crate::planner::sql_evaluator::SqlEvaluatorVisitor;
use crate::planner::sql_templates::PlanSqlTemplates;
Expand Down Expand Up @@ -40,7 +41,7 @@ impl SqlNode for MultiStageRankNode {
) -> Result<String, CubeError> {
let res = match node.as_ref() {
MemberSymbol::Measure(m) => {
if m.is_multi_stage() && m.measure_type() == "rank" {
if m.is_multi_stage() && matches!(m.kind(), MeasureKind::Rank) {
let order_by = if !m.measure_order_by().is_empty() {
let sql = m
.measure_order_by()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use super::SqlNode;
use crate::planner::query_tools::QueryTools;
use crate::planner::sql_evaluator::symbols::{AggregationType, MeasureKind};
use crate::planner::sql_evaluator::{MemberSymbol, SqlEvaluatorVisitor};
use crate::planner::sql_templates::PlanSqlTemplates;
use cubenativeutils::CubeError;
Expand Down Expand Up @@ -43,25 +44,35 @@ impl SqlNode for RollingWindowNode {
node_processor.clone(),
templates,
)?;
if m.measure_type() == "countDistinctApprox" {
templates.hll_cardinality_merge(input)?
} else {
if m.measure_type() == "sum"
|| m.measure_type() == "count"
|| m.measure_type() == "runningTotal"
match m.kind() {
MeasureKind::Aggregated(a)
if a.agg_type() == AggregationType::CountDistinctApprox =>
{
format!("sum({})", input)
} else if m.measure_type() == "min" || m.measure_type() == "max" {
format!("{}({})", m.measure_type(), input)
} else {
self.default_processor.to_sql(
templates.hll_cardinality_merge(input)?
}
MeasureKind::Count(_) => format!("sum({})", input),
MeasureKind::Aggregated(a) => match a.agg_type() {
AggregationType::Sum | AggregationType::RunningTotal => {
format!("sum({})", input)
}
AggregationType::Min | AggregationType::Max => {
format!("{}({})", a.agg_type().as_str(), input)
}
_ => self.default_processor.to_sql(
visitor,
node,
query_tools.clone(),
node_processor,
templates,
)?
}
)?,
},
_ => self.default_processor.to_sql(
visitor,
node,
query_tools.clone(),
node_processor,
templates,
)?,
}
} else {
self.default_processor.to_sql(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ impl SqlNode for TimeShiftSqlNode {
)?;
let res = match node.as_ref() {
MemberSymbol::Dimension(ev) => {
if !ev.is_reference() && ev.dimension_type() == "time" {
if !ev.is_reference() && ev.is_time() {
if let Some(shift) = self.shifts.dimensions_shifts.get(&ev.full_name()) {
let shift = shift.interval.clone().unwrap().to_sql(); // Common time shifts should always have an interval
let res = templates.add_timestamp_interval(input, shift)?;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use super::SqlNode;
use crate::planner::query_tools::QueryTools;
use crate::planner::sql_evaluator::symbols::{AggregationType, MeasureKind};
use crate::planner::sql_evaluator::MemberSymbol;
use crate::planner::sql_evaluator::SqlEvaluatorVisitor;
use crate::planner::sql_templates::PlanSqlTemplates;
Expand Down Expand Up @@ -43,10 +44,15 @@ impl SqlNode for UngroupedQueryFinalMeasureSqlNode {
if input == "*" {
"1".to_string()
} else {
if ev.measure_type() == "count"
|| ev.measure_type() == "countDistinct"
|| ev.measure_type() == "countDistinctApprox"
{
let is_count_like = match ev.kind() {
MeasureKind::Count(_) => true,
MeasureKind::Aggregated(a) => matches!(
a.agg_type(),
AggregationType::CountDistinct | AggregationType::CountDistinctApprox
),
_ => false,
};
if is_count_like {
format!("CASE WHEN ({}) IS NOT NULL THEN 1 END", input) //TODO templates!!
} else {
input
Expand Down
Loading
Loading