Skip to content
7 changes: 5 additions & 2 deletions ggsql-jupyter/src/data_explorer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
//! paginated data access.

use ggsql::reader::Reader;
use ggsql::sql::FromItem;
use serde_json::{json, Value};

/// Result of handling an RPC call.
Expand Down Expand Up @@ -539,7 +540,8 @@ impl DataExplorerState {
// a bare aggregate, which without a FROM would compute
// over an empty input and yield NULL).
let from_query = format!("SELECT * FROM {}", self.table_path);
let median_expr = dialect.sql_quantile(&col.name, 0.5, &from_query, &[]);
let median_expr =
dialect.sql_quantile(&col.name, 0.5, FromItem::Query(&from_query), &[]);
let median_sql = format!(
"SELECT {} AS \"median_val\" FROM ({}) AS \"__ggsql_qt__\"",
median_expr, from_query
Expand Down Expand Up @@ -776,7 +778,8 @@ impl DataExplorerState {
let from_query = format!("SELECT * FROM {}", self.table_path);
for q in &quantiles_param {
if let Some(q_val) = q.as_f64() {
let expr = dialect.sql_quantile(&col.name, q_val, &from_query, &[]);
let expr =
dialect.sql_quantile(&col.name, q_val, FromItem::Query(&from_query), &[]);
// See the median path above: the expression needs the FROM.
let q_sql = format!(
"SELECT {} AS \"q_val\" FROM ({}) AS \"__ggsql_qt__\"",
Expand Down
14 changes: 11 additions & 3 deletions src/execute/layer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,12 @@ pub fn apply_pre_stat_transform(
})
.collect();

crate::sql::select_from(dialect, &select_exprs.join(", "), query, "__ggsql_pre__")
crate::sql::select_from(
dialect,
&select_exprs.join(", "),
crate::sql::FromItem::Query(query),
"__ggsql_pre__",
)
}

/// Part 1: Build the initial layer query with SELECT, casts, filters, and aesthetic renames.
Expand Down Expand Up @@ -428,7 +433,7 @@ pub fn build_layer_base_query(
// Build query with optional WHERE clause
let mut query = crate::sql::Select::new(dialect)
.select(select_clause)
.from_aliased(source_query, "__ggsql_src__");
.from_aliased(crate::sql::FromItem::Query(source_query), "__ggsql_src__");
if let Some(ref f) = layer.filter {
query = query.and_where(f.as_str());
}
Expand Down Expand Up @@ -696,7 +701,10 @@ where
} else {
crate::sql::Select::new(dialect)
.select_star_plus(&stat_rename_exprs, "__ggsql_stat__")
.from_aliased(&transformed_query, "__ggsql_stat__")
.from_aliased(
crate::sql::FromItem::Query(&transformed_query),
"__ggsql_stat__",
)
.build()
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/execute/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ pub fn build_minmax_query(
crate::sql::Select::new(dialect)
.with_cte(&__ggsql_source__, source_query)
.select(exprs.join(", "))
.from(&__ggsql_source__)
.from(crate::sql::FromItem::Table(&__ggsql_source__))
.build()
}

Expand Down Expand Up @@ -163,7 +163,7 @@ where
{
let schema_query = crate::sql::Select::new(dialect)
.select_star()
.from_aliased(query, naming::SCHEMA_ALIAS)
.from_aliased(crate::sql::FromItem::Query(query), naming::SCHEMA_ALIAS)
.build_limited(1);
let schema_df = execute_query(&schema_query)?;

Expand Down
2 changes: 1 addition & 1 deletion src/golden/duckdb.sql
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ SELECT ST_Transform(ST_Point(0, 0), '+proj=longlat +datum=WGS84 +no_defs +type=c
LOAD spatial;
CREATE OR REPLACE TEMP TABLE "__ggsql_clip_boundary_<session>__" AS SELECT ST_Transform(ST_GeomFromText('POLYGON((-180.000000 85.000000, 180.000000 85.000000, 180.000000 -85.000000, -180.000000 -85.000000, -180.000000 85.000000))'), 'EPSG:4326', '+proj=longlat +datum=WGS84 +no_defs +type=crs', always_xy := true) AS geom;
SELECT ST_AsText(ST_Transform(ST_GeomFromText('POLYGON((-180.000000 85.000000, 180.000000 85.000000, 180.000000 -85.000000, -180.000000 -85.000000, -180.000000 85.000000))'), 'EPSG:4326', '+proj=merc +lon_0=0', always_xy := true)) AS wkt;
SELECT ST_XMin(ext) AS xmin, ST_YMin(ext) AS ymin, ST_XMax(ext) AS xmax, ST_YMax(ext) AS ymax FROM (SELECT ST_Extent_Agg(ST_Transform(geom, '+proj=longlat +datum=WGS84 +no_defs +type=crs', '+proj=merc +lon_0=0', always_xy := true)) AS ext FROM __ggsql_clip_boundary_<session>__);
SELECT ST_XMin(ext) AS xmin, ST_YMin(ext) AS ymin, ST_XMax(ext) AS xmax, ST_YMax(ext) AS ymax FROM (SELECT ST_Extent_Agg(ST_Transform(geom, '+proj=longlat +datum=WGS84 +no_defs +type=crs', '+proj=merc +lon_0=0', always_xy := true)) AS ext FROM __ggsql_clip_boundary_<session>__) AS "__ggsql_ext__";
CREATE OR REPLACE TEMP TABLE "__ggsql_layer_0___proj" AS SELECT ST_X("__ggsql_proj_pt__") AS "__ggsql_aes_pos1__", ST_Y("__ggsql_proj_pt__") AS "__ggsql_aes_pos2__" FROM (SELECT *, ST_Transform(ST_Point("__ggsql_aes_pos1__", "__ggsql_aes_pos2__"), '+proj=longlat +datum=WGS84 +no_defs +type=crs', '+proj=merc +lon_0=0', always_xy := true) AS "__ggsql_proj_pt__" FROM (SELECT *, "id" AS "__ggsql_aes_pos1__", "val" AS "__ggsql_aes_pos2__" FROM (SELECT * FROM ggsql_live_test) AS "__ggsql_src__") AS "__ggsql_proj__") AS "__ggsql_pp__";
SELECT MIN("__ggsql_aes_pos1__"), MIN("__ggsql_aes_pos2__"), MAX("__ggsql_aes_pos1__"), MAX("__ggsql_aes_pos2__") FROM "__ggsql_layer_0___proj";
SELECT * FROM "__ggsql_layer_0___proj";
Expand Down
Loading
Loading