diff --git a/CLAUDE.md b/CLAUDE.md index a2e98d62..7c28063f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -258,7 +258,7 @@ For detailed API documentation, see [`src/doc/API.md`](src/doc/API.md). - Uses `tree-sitter-ggsql` grammar (507 lines, simplified approach) - Parses **full query** (SQL + VISUALISE) into concrete syntax tree (CST) -- Grammar supports: PLOT/TABLE/MAP types, DRAW/SCALE/FACET/PROJECT/LABEL/THEME clauses +- Grammar supports: PLOT/TABLE/MAP types, DRAW/SCALE/FACET/PROJECT/LABEL clauses - British and American spellings: `VISUALISE` / `VISUALIZE` - **SQL portion parsing**: Basic SQL structure (SELECT, WITH, CREATE, INSERT, subqueries) - **Recursive subquery support**: Fully recursive grammar for complex SQL @@ -306,7 +306,6 @@ pub struct Plot { pub facet: Option, // FACET clause pub project: Option, // PROJECT clause pub labels: Option, // LABEL clause - pub theme: Option, // THEME clause } /// Global mapping specification from VISUALISE clause @@ -1063,7 +1062,6 @@ Where `` can be: | `FACET` | ❌ No | Small multiples | `FACET region` | | `PROJECT` | ❌ No | Coordinate system | `PROJECT TO cartesian` | | `LABEL` | ❌ No | Text labels | `LABEL title => 'My Chart', x => 'Date'` | -| `THEME` | ❌ No | Visual styling | `THEME minimal` | ### DRAW Clause (Layers) @@ -1516,8 +1514,7 @@ Plot { Scale { aesthetic: "x", scale_type: Some(ScaleType::Date) } ], facet: Some(Facet::Wrap { variables: ["region"], scales: "fixed" }), - labels: Some(Labels { labels: {"title": "...", "x": "Date", "y": "Total Quantity"} }), - theme: Some(Theme::Minimal) + labels: Some(Labels { labels: {"title": "...", "x": "Date", "y": "Total Quantity"} }) } ``` diff --git a/doc/ggsql.xml b/doc/ggsql.xml index 1d777ab9..23b932bc 100644 --- a/doc/ggsql.xml +++ b/doc/ggsql.xml @@ -95,7 +95,6 @@ PROJECT FACET LABEL - THEME VISUALISE VISUALIZE @@ -128,7 +127,6 @@ line path bar - col area rect polygon @@ -148,6 +146,7 @@ + x y xmin @@ -156,24 +155,48 @@ ymax xend yend + + theta + radius + thetamin + thetamax + radiusmin + radiusmax + thetaend + radiusend + weight + color colour fill stroke opacity + size shape linetype linewidth width height - typeface - fontweight - italic + + label + family + fontface hjust vjust + slope + intercept + + panel + row + column + + offset + density + count + intensity @@ -204,23 +227,6 @@ cartesian polar - flip - fixed - trans - map - quickmap - - - - - minimal - classic - gray - grey - bw - dark - light - void @@ -254,27 +260,6 @@ tag - - - background - panel_background - panel_grid - panel_grid_major - panel_grid_minor - text_size - text_family - title_size - axis_text_size - axis_line - axis_line_width - panel_border - plot_margin - panel_spacing - legend_background - legend_position - legend_direction - - count @@ -410,7 +395,6 @@ - @@ -458,7 +442,6 @@ - @@ -499,7 +482,6 @@ - @@ -539,7 +521,6 @@ - @@ -586,7 +567,6 @@ - @@ -630,7 +610,6 @@ - @@ -673,7 +652,6 @@ - @@ -696,47 +674,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -752,7 +689,6 @@ - diff --git a/ggsql-vscode/examples/sample.gsql b/ggsql-vscode/examples/sample.gsql index 859f3e03..06b0dd8a 100644 --- a/ggsql-vscode/examples/sample.gsql +++ b/ggsql-vscode/examples/sample.gsql @@ -9,7 +9,6 @@ DRAW point LABEL title => 'Horsepower vs Fuel Efficiency', x => 'Horsepower', y => 'Miles per Gallon' -THEME minimal -- ============================================================================ -- Example 2: Multi-Layer Visualization with CTE @@ -34,7 +33,6 @@ LABEL title => 'Sales Trends by Region', x => 'Month', y => 'Total Quantity', caption => 'Data from 2024' -THEME classic -- ============================================================================ -- Example 3: Bar Chart with Projection @@ -51,7 +49,6 @@ PROJECT y, x TO cartesian LABEL title => 'Top 10 Product Categories', x => 'Category', y => 'Total Sales' -THEME dark -- ============================================================================ -- Example 4: Polar Projection (Pie Chart) @@ -107,7 +104,6 @@ LABEL title => 'Temperature Range (Last 30 Days)', x => 'Date', y => 'Temperature (°C)', caption => 'Source: Weather Station Alpha' -THEME minimal -- ============================================================================ -- Example 7: Complex Join with Multiple Aesthetics @@ -134,7 +130,6 @@ LABEL title => 'Sales Performance Analysis', y => 'Revenue (log scale)', color => 'Product Category', size => 'Quantity Sold' -THEME grey -- ============================================================================ -- Example 8: Area Chart with Stacking @@ -170,7 +165,6 @@ SCALE y FROM [0, 500] LABEL title => 'Price Distribution by Category', x => 'Product Category', y => 'Price ($)' -THEME bw -- ============================================================================ -- Example 10: Annotated Scatter Plot diff --git a/ggsql-vscode/syntaxes/ggsql.tmLanguage.json b/ggsql-vscode/syntaxes/ggsql.tmLanguage.json index ba5962cd..48e51717 100644 --- a/ggsql-vscode/syntaxes/ggsql.tmLanguage.json +++ b/ggsql-vscode/syntaxes/ggsql.tmLanguage.json @@ -13,7 +13,6 @@ { "include": "#facet-clause" }, { "include": "#project-clause" }, { "include": "#label-clause" }, - { "include": "#theme-clause" }, { "include": "#sql-keywords" }, { "include": "#visualise-clause" }, { "include": "#operators" } @@ -84,6 +83,10 @@ "name": "keyword.operator.cast.ggsql", "match": "::" }, + { + "name": "keyword.operator.regex.ggsql", + "match": "!~\\*|~\\*|!~|~" + }, { "name": "punctuation.separator.comma.ggsql", "match": "," @@ -218,7 +221,7 @@ "beginCaptures": { "1": { "name": "keyword.other.ggsql" } }, - "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|THEME|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", + "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", "patterns": [ { "include": "#comments" }, { "include": "#strings" }, @@ -249,8 +252,29 @@ "aesthetics": { "patterns": [ { + "comment": "Position aesthetics (cartesian and polar)", + "name": "support.type.aesthetic.ggsql", + "match": "\\b(x|y|xmin|xmax|ymin|ymax|xend|yend|theta|radius|thetamin|thetamax|radiusmin|radiusmax|thetaend|radiusend)\\b" + }, + { + "comment": "Color and appearance aesthetics", + "name": "support.type.aesthetic.ggsql", + "match": "\\b(color|colour|fill|stroke|opacity|size|shape|linetype|linewidth|width|height)\\b" + }, + { + "comment": "Text aesthetics", + "name": "support.type.aesthetic.ggsql", + "match": "\\b(label|family|fontface|hjust|vjust)\\b" + }, + { + "comment": "Specialty and computed aesthetics", + "name": "support.type.aesthetic.ggsql", + "match": "\\b(weight|coef|intercept|offset|density|count|intensity)\\b" + }, + { + "comment": "Facet aesthetics", "name": "support.type.aesthetic.ggsql", - "match": "\\b(x|y|xmin|xmax|ymin|ymax|xend|yend|weight|color|colour|fill|stroke|opacity|size|shape|linetype|linewidth|width|height|label|typeface|fontweight|italic|hjust|vjust|slope|panel|row|column)\\b" + "match": "\\b(panel|row|column)\\b" } ] }, @@ -291,9 +315,10 @@ "beginCaptures": { "1": { "name": "keyword.other.ggsql" } }, - "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|THEME|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", + "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", "patterns": [ { + "comment": "Geom types from grammar.js", "name": "support.type.geom.ggsql", "match": "\\b(point|line|path|bar|col|area|tile|polygon|ribbon|histogram|density|smooth|boxplot|violin|text|label|segment|arrow|rule|errorbar)\\b" }, @@ -305,7 +330,7 @@ "beginCaptures": { "1": { "name": "keyword.other.ggsql" } }, - "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|THEME|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", + "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", "patterns": [ { "name": "support.type.geom.ggsql", @@ -319,9 +344,10 @@ "beginCaptures": { "1": { "name": "keyword.other.ggsql" } }, - "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|THEME|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", + "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", "patterns": [ { + "comment": "Scale type identifiers from grammar.js", "name": "keyword.control.scale-modifier.ggsql", "match": "\\b(?i:CONTINUOUS|DISCRETE|BINNED|ORDINAL|IDENTITY)\\b" }, @@ -330,10 +356,12 @@ "match": "\\b(?i:TO|VIA|RENAMING)\\b" }, { + "comment": "Transform/palette names", "name": "constant.language.scale-type.ggsql", - "match": "\\b(linear|log|log10|log2|sqrt|reverse|categorical|ordinal|date|datetime|time|viridis|plasma|magma|inferno|cividis|diverging|sequential|identity|manual)\\b" + "match": "\\b(linear|log|log10|log2|sqrt|reverse|date|datetime|time|viridis|plasma|magma|inferno|cividis|diverging|sequential|identity)\\b" }, { + "comment": "Scale properties", "name": "support.type.property.ggsql", "match": "\\b(type|limits|breaks|labels|expand|direction|na_value|palette|domain|range)\\b" }, @@ -345,7 +373,7 @@ "beginCaptures": { "1": { "name": "keyword.other.ggsql" } }, - "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|THEME|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", + "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", "patterns": [ { "name": "support.type.property.ggsql", @@ -367,15 +395,17 @@ "beginCaptures": { "1": { "name": "keyword.other.ggsql" } }, - "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|THEME|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", + "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", "patterns": [ { + "comment": "Coord types (currently implemented: cartesian, polar)", "name": "support.type.project.ggsql", - "match": "\\b(cartesian|polar|flip|fixed|trans|map|quickmap)\\b" + "match": "\\b(cartesian|polar)\\b" }, { + "comment": "Project properties", "name": "support.type.property.ggsql", - "match": "\\b(xlim|ylim|ratio|angle|clip)\\b" + "match": "\\b(xlim|ylim|ratio|angle|clip|start)\\b" }, { "include": "#common-clause-patterns" } ] @@ -385,32 +415,15 @@ "beginCaptures": { "1": { "name": "keyword.other.ggsql" } }, - "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|THEME|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", + "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", "patterns": [ { + "comment": "Label types", "name": "support.type.property.ggsql", "match": "\\b(title|subtitle|x|y|caption|tag|color|colour|fill|size|shape|linetype)\\b" }, { "include": "#common-clause-patterns" } ] - }, - "theme-clause": { - "begin": "(?i)\\b(THEME)\\b", - "beginCaptures": { - "1": { "name": "keyword.other.ggsql" } - }, - "end": "(?i)(?=\\b(DRAW|PLACE|SCALE|PROJECT|FACET|LABEL|THEME|VISUALISE|VISUALIZE|SELECT|WHERE|WITH)\\b)", - "patterns": [ - { - "name": "support.type.theme.ggsql", - "match": "\\b(minimal|classic|gray|grey|bw|dark|light|void)\\b" - }, - { - "name": "support.type.property.ggsql", - "match": "\\b(background|panel_background|panel_grid|panel_grid_major|panel_grid_minor|text_size|text_family|title_size|axis_text_size|axis_line|axis_line_width|panel_border|plot_margin|panel_spacing|legend_background|legend_position|legend_direction)\\b" - }, - { "include": "#common-clause-patterns" } - ] } } } diff --git a/src/cli.rs b/src/cli.rs index 6ee32f4b..86b83331 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -315,9 +315,6 @@ fn cmd_parse(query: String, format: String) { if spec.facet.is_some() { println!(" Faceting: Yes"); } - if spec.theme.is_some() { - println!(" Theme: Yes"); - } } } _ => { diff --git a/src/lib.rs b/src/lib.rs index 8d5e78cd..83bdd5b6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,7 +15,6 @@ WHERE year = 2024 VISUALISE date AS x, revenue AS y, region AS color DRAW line LABEL title => 'Sales by Region' -THEME minimal ``` ## Architecture diff --git a/src/parser/builder.rs b/src/parser/builder.rs index 4d575fcb..798cc217 100644 --- a/src/parser/builder.rs +++ b/src/parser/builder.rs @@ -21,7 +21,7 @@ use super::SourceTree; /// /// Returns (name_node, value_node) without any interpretation. /// Works for both patterns: -/// - `name => value` (SETTING, PROJECT, THEME, LABEL, RENAMING) +/// - `name => value` (SETTING, PROJECT, LABEL, RENAMING) /// - `value AS name` (MAPPING explicit_mapping) /// /// Caller is responsible for interpreting the nodes based on their context. @@ -335,9 +335,6 @@ fn process_viz_clause(node: &Node, source: &SourceTree, spec: &mut Plot) -> Resu spec.labels = Some(new_labels); } } - "theme_clause" => { - spec.theme = Some(build_theme(&child, source)?); - } _ => { // Unknown clause type continue; @@ -1143,51 +1140,6 @@ fn build_labels(node: &Node, source: &SourceTree) -> Result { Ok(Labels { labels }) } -// ============================================================================ -// Theme Building -// ============================================================================ - -/// Build a Theme from a theme_clause node -fn build_theme(node: &Node, source: &SourceTree) -> Result { - let mut style: Option = None; - let mut properties = HashMap::new(); - - let mut cursor = node.walk(); - for child in node.children(&mut cursor) { - match child.kind() { - "THEME" | "SETTING" | "=>" | "," => continue, - "theme_name" => { - style = Some(source.get_text(&child)); - } - "theme_property" => { - // Parse theme property: name => value using field-based queries - let (name_node, value_node) = extract_name_value_nodes(&child, "theme property")?; - - // Parse property name - let prop_name = source.get_text(&name_node); - - // Parse property value - let prop_value = match value_node.kind() { - "string" | "number" | "boolean" => { - parse_value_node(&value_node, source, "theme property")? - } - _ => { - return Err(GgsqlError::ParseError(format!( - "Invalid theme property value type: {}", - value_node.kind() - ))); - } - }; - - properties.insert(prop_name, prop_value); - } - _ => {} - } - } - - Ok(Theme { style, properties }) -} - // ============================================================================ // Validation & Utilities // ============================================================================ @@ -1420,7 +1372,6 @@ mod tests { ViSuAlIsE date AS x, revenue AS y DrAw line ScAlE x SeTtInG type => 'date' - ThEmE minimal "#; let result = parse_test_query(query); @@ -1429,7 +1380,6 @@ mod tests { assert_eq!(specs.len(), 1); assert_eq!(specs[0].layers.len(), 1); assert_eq!(specs[0].scales.len(), 1); - assert!(specs[0].theme.is_some()); } #[test] diff --git a/src/parser/mod.rs b/src/parser/mod.rs index dd2c28c8..3fae7162 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -193,7 +193,6 @@ mod tests { VISUALISE x, y DRAW point LABEL title => 'Scatter Plot' - THEME minimal VISUALIZE DRAW bar MAPPING x AS x, y AS y "#; @@ -201,15 +200,13 @@ mod tests { let specs = parse_query(query).unwrap(); assert_eq!(specs.len(), 2); - // First viz should have layers, labels, and theme + // First viz should have layers and labels assert_eq!(specs[0].layers.len(), 1); assert!(specs[0].labels.is_some()); - assert!(specs[0].theme.is_some()); - // Second viz should have layer but no labels/theme + // Second viz should have layer but no labels assert_eq!(specs[1].layers.len(), 1); assert!(specs[1].labels.is_none()); - assert!(specs[1].theme.is_none()); } #[test] @@ -241,7 +238,6 @@ mod tests { DRAW line MAPPING cost AS y SCALE x VIA date LABEL title => 'Revenue and Cost Trends' - THEME minimal VISUALIZE DRAW bar MAPPING date AS x, revenue AS y VISUALISE @@ -251,11 +247,10 @@ mod tests { let specs = parse_query(query).unwrap(); assert_eq!(specs.len(), 3); - // Plot with 2 layers, scale, labels, theme + // Plot with 2 layers, scale, labels assert_eq!(specs[0].layers.len(), 2); assert_eq!(specs[0].scales.len(), 1); assert!(specs[0].labels.is_some()); - assert!(specs[0].theme.is_some()); // Second viz with 1 layer assert_eq!(specs[1].layers.len(), 1); diff --git a/src/plot/main.rs b/src/plot/main.rs index f9a25927..e3d2622e 100644 --- a/src/plot/main.rs +++ b/src/plot/main.rs @@ -14,8 +14,7 @@ //! ├─ scales: Vec (0+ ScaleNode, one per SCALE clause) //! ├─ facet: Option (optional, from FACET clause) //! ├─ project: Option (optional, from PROJECT clause) -//! ├─ labels: Option (optional, merged from LABEL clauses) -//! └─ theme: Option (optional, from THEME clause) +//! └─ labels: Option (optional, merged from LABEL clauses) //! ``` use crate::naming; @@ -68,8 +67,6 @@ pub struct Plot { pub project: Option, /// Text labels (merged from all LABEL clauses) pub labels: Option, - /// Theme styling (from THEME clause) - pub theme: Option, /// Aesthetic context for coordinate-specific aesthetic names /// Computed from the coord type and facet, used for transformations #[serde(skip)] @@ -83,15 +80,6 @@ pub struct Labels { pub labels: HashMap>, } -/// Theme styling (from THEME clause) -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct Theme { - /// Base theme style - pub style: Option, - /// Theme property overrides - pub properties: HashMap, -} - // Manual PartialEq implementation (aesthetic_context is derived, not compared) impl PartialEq for Plot { fn eq(&self, other: &Self) -> bool { @@ -102,7 +90,6 @@ impl PartialEq for Plot { && self.facet == other.facet && self.project == other.project && self.labels == other.labels - && self.theme == other.theme } } @@ -117,7 +104,6 @@ impl Plot { facet: None, project: None, labels: None, - theme: None, aesthetic_context: None, } } @@ -132,7 +118,6 @@ impl Plot { facet: None, project: None, labels: None, - theme: None, aesthetic_context: None, } } diff --git a/tree-sitter-ggsql/grammar.js b/tree-sitter-ggsql/grammar.js index 46023d7b..b1677b03 100644 --- a/tree-sitter-ggsql/grammar.js +++ b/tree-sitter-ggsql/grammar.js @@ -467,7 +467,6 @@ module.exports = grammar({ $.facet_clause, $.project_clause, $.label_clause, - $.theme_clause, ), // DRAW clause - syntax: DRAW geom [MAPPING ...] [REMAPPING ...] [SETTING ...] [FILTER ...] [PARTITION BY ...] [ORDER BY ...] @@ -687,7 +686,7 @@ module.exports = grammar({ // Facet aesthetics 'panel', 'row', 'column', // Computed variables - 'offset', + 'offset', 'density', 'count', 'intensity', // Allow any identifier for custom PROJECT aesthetics (e.g., PROJECT a, b TO polar) $.identifier ), @@ -842,34 +841,6 @@ module.exports = grammar({ label_type: $ => $.identifier, - // THEME clause - THEME [name] [SETTING prop => value, ...] - theme_clause: $ => choice( - // Just theme name - seq(caseInsensitive('THEME'), $.theme_name), - // Theme name with properties - seq( - caseInsensitive('THEME'), $.theme_name, caseInsensitive('SETTING'), - $.theme_property, - repeat(seq(',', $.theme_property)) - ), - // Just properties (custom theme) - seq( - caseInsensitive('THEME'), caseInsensitive('SETTING'), - $.theme_property, - repeat(seq(',', $.theme_property)) - ) - ), - - theme_name: $ => $.identifier, - - theme_property: $ => seq( - field('name', $.theme_property_name), - '=>', - field('value', choice($.string, $.number, $.boolean)) - ), - - theme_property_name: $ => $.identifier, - // Basic tokens bare_identifier: $ => token(/[a-zA-Z_][a-zA-Z0-9_]*/), quoted_identifier: $ => token(choice( diff --git a/tree-sitter-ggsql/queries/highlights.scm b/tree-sitter-ggsql/queries/highlights.scm index c7da26fa..99d1d00f 100644 --- a/tree-sitter-ggsql/queries/highlights.scm +++ b/tree-sitter-ggsql/queries/highlights.scm @@ -30,37 +30,59 @@ ; Aesthetic names [ + ; Position aesthetics (cartesian) "x" "y" - "weight" "xmin" "xmax" "ymin" "ymax" "xend" "yend" + ; Position aesthetics (polar) + "angle" + "radius" + "anglemin" + "anglemax" + "radiusmin" + "radiusmax" + "angleend" + "radiusend" + ; Aggregation aesthetic + "weight" + ; Color aesthetics "color" "colour" "fill" "stroke" "opacity" + ; Size and shape "size" "shape" "linetype" "linewidth" "width" "height" + ; Text aesthetics "label" "typeface" "fontweight" "italic" + "fontsize" "hjust" "vjust" "rotation" + ; Specialty aesthetics "slope" + ; Facet aesthetics "panel" "row" "column" + ; Computed variables + "offset" + "density" + "count" + "intensity" ] @attribute ; String literals @@ -83,7 +105,6 @@ ; Property names (project_property_name) @property -(theme_property_name) @property (label_type) @property ; Operators diff --git a/tree-sitter-ggsql/test/corpus/basic.txt b/tree-sitter-ggsql/test/corpus/basic.txt index 4c7891eb..974c3958 100644 --- a/tree-sitter-ggsql/test/corpus/basic.txt +++ b/tree-sitter-ggsql/test/corpus/basic.txt @@ -438,14 +438,13 @@ DRAW point (geom_type))))) ================================================================================ -Plot with scales and theme +Plot with scales ================================================================================ VISUALISE x, y, group AS color DRAW point SCALE CONTINUOUS x FROM [0, 100] SCALE color TO viridis -THEME minimal -------------------------------------------------------------------------------- @@ -486,11 +485,6 @@ THEME minimal (scale_clause (aesthetic_name) (scale_to_clause - (identifier - (bare_identifier))))) - (viz_clause - (theme_clause - (theme_name (identifier (bare_identifier)))))))