Qwiratry — SQL-AST-Comparison

SQL AST comparison: Red vs SQL::Abstract

Goal

The proposal is that we use a common SQL AST (Abstract Syntax Tree) that can be shared by:

  • Red

  • SQL::Abstract

  • Qwiratry

The hope is that, instead of having 2 or 3 incomplete SQL AST representations, we can have one that combines the best of all of them.

Update

It's likely that the sensible thing to do is to layer Qwiratry on top of SQL::Abstract, then layer Red on top of Qwiratry. So I'm going to retire this for now, but reference it in Post-SQL-TaOP-Improvements.md.

Overview

Research note for a combined SQL AST. Compares the two Raku approaches that build a query AST and then render/translate it to SQL:

Red (Red::AST + Red::Driver::*)SQL::Abstract (zef:leont)
Latest release0.2.4 — 2025-11-130.0.9 — 2024-04-28
RoleORM query/DDL pipeline that happens to emit SQLStandalone AST + helpers + dialect renderers (+ builder API)
Public productModels + ResultSeq (grep/map/…)select/insert/update/delete/upsert from Raku data structures, or SQL::Abstract::Builder
OutputDriver runs SQL (optional debug of SQL/binds)SQL::Query (.sql + .arguments) via renderer
DDLYes (tables, views, alter-ish)No
Multi-dialect emitCommonSQL + Pg + SQLiteRenderers: Postgres, SQLite, MySQL

Release dates from raku.land badges pages (checked 2026-08-11).

Sources: Red docs, Red architecture, FCO/Red, SQL::Abstract / Leont/sql-abstract.

1. Verdict (feature range / options)

Most first-class DML / SELECT options: SQL::Abstract.It has a portable query AST plus CTEs (WITH), window definitions, DISTINCT, HAVING, compound queries (UNION-family), row locking clauses, upsert/ON CONFLICT, multi-row INSERT, INSERT…SELECT, UPDATE…FROM, DELETE…USING, NATURAL/CROSS joins, rich Conditions coercions (ranges → BETWEEN, junctions → IN, JSON ops, etc.), and separate Postgres / SQLite / MySQL renderers (including ? vs $n placeholders on Postgres). ~3500-line core module; designed to represent any SELECT/UPDATE/INSERT/DELETE valid in both PostgreSQL and SQLite.

Widest statement kinds including schema/DDL: Red.Beyond DML it builds CREATE TABLE/VIEW, column alter/FK AST, transactions, set ops, and ORM-tied prefetch/locking, with driver translate and an actively released codebase (newer of the two). It is not a free-form SQL builder: you go through models/ResultSeq. Notable DQL gap vs Abstract: no HAVING on the Select AST.

QuestionAnswer
Most options for ad-hoc DML SQL (no ORM)?SQL::Abstract
Most options for schema + executed ORM queries?Red

2. The Layers

Overview

In the Proposal column, a - means that each framework does their own thing (or nothing, if preferred).

LayerRedSQL::AbstractProposal
User-facing APIModels + ResultSeq (grep / map / sort / …)Functional select/insert/… or SQL::Abstract::Builder chains-
API -> ASTCallable/block evaluation and ResultSeq chaining grow a Red::AST treeHelpers coerce Hashes/Lists/Pairs (and Builder methods) into Expression/Query nodes-
ASTRed::AST::* (Select, Insert, Update, Delete, DDL, operators, …)Expression / Query AST (Select, Update, ops, Conditions, Common/CTE, …)Unified SQL AST, with the best of both
Rendering (AST -> Query Dialect)Red::Driver.translate (CommonSQL, then Pg / SQLite overrides)Renderer::Postgres / SQLite / MySQLShared Rendering Layer
Query text (eg. SQL)SQL string + bind list (often only seen in debug / dry-run)SQL::Query with .sql and .argumentsShared Query Text
Execution callBuilt in: driver prepare/executeNot built in (caller)-
Actual ExecutionDBIishDBIish, or Net::Postgres::Abstract-

Individual Layers

User-facing API

How application code asks for a query, before any SQL exists.

This layer is where the two projects feel most different. Red presents database work as Raku collections: Person.^all.grep({ .age > 18 }).sort(*.name). Models, traits (is column, relationships), and meta-methods (^create, ^load, ^create-table) are the product; SQL is incidental. SQL::Abstract is deliberately SQL-shaped: you either pass tables/columns/conditions as Raku data to select/insert/update/delete/upsert, or chain SQL::Abstract::Builder (on → where → select → …). No models required.

API -> AST

How that request becomes typed AST nodes.

Red grows the tree by interpreting ResultSeq operations and (for grep / map blocks) by evaluating callables with column proxies whose operators build Red::AST nodes instead of Bools. That is powerful and Rakuish, but historically heuristic; a RakuAST-based path is planned. SQL::Abstract uses explicit coercions: Hashes/Lists/Pairs/Range/Junction become Conditions, Column::List, joins, CTEs, etc. The Builder path constructs the same nodes method-by-method. Abstract’s strength here is predictable data→AST mapping (e.g. 1..10 → BETWEEN, 1|2|3 → IN) without running user blocks.

AST

The dialect-neutral representation of the query (or DDL).

Both keep a real node tree rather than a bag of SQL strings. Red’s Red::AST::* spans DML and schema/admin (CreateTable/View, column alter, FK, transactions, MultiSelect union/intersect/minus, Case, JSON ops, …). Select has filter/order/group/limit/offset/lock/prefetch, but no HAVING node. SQL::Abstract’s Expression/Query AST is DML-only but denser for modern SELECT: CTEs (Common), windows, DISTINCT, HAVING, compound queries, locking, upsert/ON CONFLICT, UPDATE…FROM, DELETE…USING. For a portable query IR checklist, Abstract’s node set is the richer reference; for schema IR, only Red has first-class nodes.

Rendering (AST -> Query Dialect)

Turn the AST into dialect-specific SQL text and placeholders.

Red centralizes common SQL in Red::Driver::CommonSQL.translate, with Pg / SQLite (and related) overrides for types, placeholders, RETURNING, EXCEPT vs MINUS, JSON, and so on. Emit is coupled to “the current driver.” SQL::Abstract picks a named renderer at construction (:renderer<postgres|sqlite|mysql>), including Postgres $n vs DBI ? placeholder styles. Abstract also lists MySQL as a first-class renderer; Red’s MySQL story has historically been more WIP. Neither is a full SQL standardizer — dialect quirks still live in this layer.

Query text (eg. SQL)

The value you can inspect or hand to a DB client: text + binds.

Red usually hides this: iteration triggers translate+execute; you see SQL mainly via $*RED-DEBUG, dry-run, or driver internals. SQL::Abstract stops at a SQL::Query (.sql, .arguments) — the natural hand-off for any executor. That makes Abstract easier to reuse as a pure encoder; Red’s product is “rows/objects,” with SQL as an internal side effect.

Execution call

Who triggers running the statement.

Red owns this: prepare, bind, execute, inflate model objects (and ResultSeq laziness). SQL::Abstract does not; callers invoke a DB client themselves (DBIish, Net::Postgres, or Net::Postgres::Abstract).

Actual Execution

The DB client that talks to the database.

Red uses DBIish under the hood. SQL::Abstract has no executor of its own; typical callers use DBIish or Net::Postgres::Abstract (Abstract

  • async Postgres client).

Per-model Comments

Red

model / ResultSeq methods  →  Red::AST tree  →  Red::Driver.translate  →  SQL + binds  →  execute
  • User-facing API is Rakuish (Person.^all.grep({ .age > 18 }).sort(*.name)).

  • ~40 AST modules; CommonSQL alone ~80 translate multis (~1000 lines), plus Pg/SQLite overrides.

  • SQL is an ORM implementation detail.

SQL::Abstract

Raku Hash/List/Pair helpers  →  Expression/Query AST  →  Renderer::*  →  SQL::Query(.sql, .arguments)
# or:
SQL::Abstract::Builder.new(...).on(...).select(...).where(...).build
  • Three layers: AST, coercions from ordinary Raku data, dialect renderers.

  • Functional API ($abstract.select(...)) and chainable Builder.

  • No ORM; no built-in execution (pair with DBIish / Net::Postgres::Abstract, etc.).

3. AST object comparison

For each SQL construct, the concrete AST type (or role) each library uses. — = no dedicated node; behaviour may still exist via driver defaults, projection tricks, model metadata, or runtime Raku code.

Qwiratry / RakuAST / SQL mapping for the same rows lives in SQL-AST-Qwiratry-Mapping.md.

Represented itemRedSQL::Abstract
AST rootRed::AST (role)SQL::Abstract::Expression / SQL::Abstract::Query roles
Clause chain bagRed::AST::Chained (filter, order, group, limit, offset, table-list)fields on each query class (via SQL::Abstract::Query::Common)
SELECTRed::AST::SelectSQL::Abstract::Select
INSERTRed::AST::InsertSQL::Abstract::Insert::Values, SQL::Abstract::Insert::Select, SQL::Abstract::Insert::Defaults
UPDATERed::AST::UpdateSQL::Abstract::Update
DELETERed::AST::DeleteSQL::Abstract::Delete
UPSERT / ON CONFLICT—SQL::Abstract::Conflicts, SQL::Abstract::Conflict::Update, SQL::Abstract::Conflict::Nothing, SQL::Abstract::Conflict::Target::* on SQL::Abstract::Insert
UNION / INTERSECT / EXCEPTRed::AST::Union, Red::AST::Intersect, Red::AST::Minus (Red::AST::MultiSelect)SQL::Abstract::Compound on SQL::Abstract::Select
VALUES (inline relation)—SQL::Abstract::Values
CREATE TABLERed::AST::CreateTable—
CREATE VIEWRed::AST::CreateView—
ADD / CHANGE / DROP COLUMNRed::AST::CreateColumn, Red::AST::ChangeColumn, Red::AST::DropColumn—
ADD FOREIGN KEYRed::AST::AddForeignKeyOnTable—
BEGIN / COMMIT / ROLLBACKRed::AST::BeginTransaction, Red::AST::CommitTransaction, Red::AST::RollbackTransaction—
Column referenceRed::Column (also does Red::AST)SQL::Abstract::Identifier
Table referenceRed::Model in Red::AST::Select.of / @.table-listSQL::Abstract::Table::Simple, SQL::Abstract::Table::Renamed
Literal valueRed::AST::ValueSQL::Abstract::Literal
Bind placeholderRed::AST::Value / unary·infix $.bindSQL::Abstract::Placeholder
Function callRed::AST::FunctionSQL::Abstract::Function
Column alias (AS)projection via map / @.fieldsSQL::Abstract::Expression::Renamed
* in projectionmodel column expansionSQL::Abstract::Star
WHERERed::AST on Red::AST::Select/Red::AST::Chained $.filterSQL::Abstract::Conditions on SQL::Abstract::Select $.where
AND / ORRed::AST::AND, Red::AST::ORSQL::Abstract::Op::And, SQL::Abstract::Op::Or (in SQL::Abstract::Conditions)
NOTRed::AST::NotSQL::Abstract::Op::Not
Comparisons (=, <, …)Red::AST::Eq, Red::AST::Lt, Red::AST::Gt, Red::AST::Le, Red::AST::Ge, Red::AST::NeSQL::Abstract::Op::Equals, SQL::Abstract::Op::LessThan, SQL::Abstract::Op::GreaterThan, …
LIKERed::AST::LikeSQL::Abstract::Op::Like, SQL::Abstract::Op::NotLike
IN (value list)Red::AST::InSQL::Abstract::Op::In::List
IN / EXISTS (subquery)Red::AST::In + nested Red::AST::SelectSQL::Abstract::Op::In::Query, SQL::Abstract::Op::Exists
BETWEENRed::AST::BetweenSQL::Abstract::Op::Between, SQL::Abstract::Op::NotBetween
IS NULL / definednessRed::AST::IsDefinedSQL::Abstract::Op::IsNull
CASERed::AST::CaseSQL::Abstract::Op::Case
CASTRed::AST::CastSQL::Abstract::Op::Cast
JSON path opsRed::AST::JsonItem, Red::AST::JsonRemoveItemSQL::Abstract::Op::JSON::GetElem, SQL::Abstract::Op::JSON::GetElemText, SQL::Abstract::Op::JSON::GetPath, SQL::Abstract::Op::JSON::GetPathText
XML path ops——
Arithmetic / concatRed::AST::Sum, Red::AST::Sub, Red::AST::Mul, Red::AST::Div, Red::AST::Concat, …SQL::Abstract::Op::Plus, SQL::Abstract::Op::Minus, SQL::Abstract::Op::Times, SQL::Abstract::Op::Concat, …
Generic operatorRed::AST::Generic::Infix, Red::AST::Generic::Prefix, Red::AST::Generic::Postfixtyped SQL::Abstract::Op::* hierarchy
FROM / joined tables@.table-list + primary $.of (Red::Model)SQL::Abstract::Source (SQL::Abstract::Table, SQL::Abstract::Join, …)
JOIN … ONjoin metadata on joined Red::Model entriesSQL::Abstract::Join::On
JOIN … USING—SQL::Abstract::Join::Using
NATURAL / CROSS JOIN—SQL::Abstract::Join::Natural, SQL::Abstract::Join::Cross
Subquery in FROMRed::AST::Select (:sub-select)SQL::Abstract::Source::Query
GROUP BY@.group on Red::AST::Select/Red::AST::ChainedSQL::Abstract::GroupBy
HAVING—SQL::Abstract::Conditions on SQL::Abstract::Select $.having
DISTINCTRed::AST::Function (func<DISTINCT>) in projectionSQL::Abstract::Distinction, SQL::Abstract::Distinction::Columns on SQL::Abstract::Select
ORDER BY@.order (Red::AST / Red::Column)SQL::Abstract::OrderBy, SQL::Abstract::Order::Modifier
LIMIT / OFFSETInt on Red::AST::Select/Red::AST::ChainedSQL::Abstract::Limit, SQL::Abstract::Offset
CTE (WITH)—SQL::Abstract::Common (+ SQL::Abstract::Query::Common $.common)
Window definition / use—SQL::Abstract::Window::Clauses, SQL::Abstract::Window::Definition, SQL::Abstract::Window::Function
Row locking (FOR UPDATE, …)Red::LockType on Red::AST::Select $.forSQL::Abstract::Locking, SQL::Abstract::Locking::Clause
RETURNINGdriver emit context (e.g. "delete-returning")SQL::Abstract::Column::List on DML queries
String functionsRed::AST::Substring, Red::AST::Index, Red::AST::Lowercase, Red::AST::UppercaseSQL::Abstract::Function
Date/time functionsRed::AST::DateTimePart, Red::AST::DateTimeCoerce, Red::AST::DateTimeNow, Red::AST::DateTimeTodaySQL::Abstract::Function, SQL::Abstract::Current
PK / table constraintsRed::AST::Pk, Red::AST::Constraint—
SQL commentsRed::AST::Comment, Red::AST::TableComment—
Custom / escape SQL—SQL::Abstract::Expression::Custom
Map / transform rowsvia map / Red::ResultSeq—
Aggregate / foldvia classify / aggregates—
Projection (column pick)@.fields / mapSQL::Abstract::Column::List
Equijoin / outer / semijoin / antijoinvia model join metadataSQL::Abstract::Join::* variants

Red spreads SELECT clauses across Red::AST::Select and a linked Red::AST::Chained bag on Red::ResultSeq; Abstract keeps them as typed fields on SQL::Abstract::Select (and siblings). Red joins are not separate AST nodes — joined tables appear as Red::Model-shaped entries in @.table-list with join type/on supplied via model metaclass. Abstract models joins explicitly as SQL::Abstract::Join::* implementing SQL::Abstract::Source.

Type-name prefixes in the table: Red::* and SQL::Abstract::* (nested in the SQL::Abstract unit class).

4. Statement coverage matrix

Legend: Yes = first-class; Partial = limited / dialect-only / escape-hatch; No = not in API/AST without raw/custom SQL.

CapabilityRedSQL::Abstract
SELECTYesYes
Columns / aliases / *Yes (map / model cols)Yes (Column::List, pairs AS, *)
WHEREYesYes (rich Conditions)
JOIN INNER/LEFT/RIGHT/FULLYesYes
NATURAL / CROSS JOINPartial / uncommonYes
JOIN of subqueryPartialYes
GROUP BYYesYes
HAVINGNoYes
DISTINCTPartialYes (full / columns)
ORDER BY / ASC·DESCYesYes (+ NULLS ordering)
LIMIT / OFFSETYesYes
Subselect in FROMYesYes
Subselect / EXISTS / IN (query)YesYes
UNION / INTERSECT / EXCEPTYesYes (:compound)
FOR UPDATE / lockingYes (LockType)Yes (Locking)
Window functions / WINDOWNoYes
CTEs (WITH)NoYes (Common / Builder.with)
INSERT valuesYesYes (map + multi-row lists)
INSERT … SELECTPartialYes
ON CONFLICT / upsertNoYes (upsert / conflicts)
UPDATEYesYes (+ optional FROM)
DELETEYesYes (+ optional USING)
RETURNINGPartial (often * on Pg)Yes
CREATE TABLE / VIEWYesNo
ALTER TABLE (column/FK)YesNo
Transactions BEGIN/COMMIT/ROLLBACKYesNo
Dialect renderersCommonSQL + Pg + SQLitePostgres + SQLite + MySQL
Escape / custom SQLLimitedLiterals / captures / Expression::Custom
Pretty-printDebug / commentsRenderer formatting
Clone / reuseResultSeq patternsBuilder + AST values

5. What Red can build (detail)

5.1 DQL / DML

  • Filter/project/order/limit (grep/map/sort/head/skip), aggregates, classify → GROUP BY–style results, joins/join-model, prefetch, union/intersect/minus, ResultSeq delete/update, FOR UPDATE / SKIP LOCKED.

5.2 Expressions

Large Red::Operators + Red::ColumnMethods: comparisons, arithmetic, AND/OR/NOT, LIKE helpers, IN, BETWEEN, CASE, casts, string/datetime funcs, JSON -> / remove, generic ops, Red::AST::Function.

5.3 DDL / schema

CreateTable, CreateView, column create/change/drop, FK add, constraints, comments, transactions; schema readers on drivers.

5.4 Gaps / coupling

  • Model-tied; no HAVING; coarse RETURNING; no CTEs/windows/upsert as AST; block→AST historically heuristic (RakuAST planned).

6. What SQL::Abstract can build (detail)

6.1 Functional + builder APIs

  • $abstract.select($from, $columns, $where, :$common, :$distinct, :$group-by, :$having, :$windows, :$compound, :$order-by, :$limit, :$offset, :$locking)

  • $abstract.insert (map, multi-row list, or select), update, delete, upsert.

  • SQL::Abstract::Builder: on / with (CTEs) / join / select / insert / update / delete / upsert / clause methods including distinct, windows, compound, locking, returning.

Stated goal: any SELECT/UPDATE/INSERT/DELETE valid in both PostgreSQL and SQLite (portable core); MySQL renderer also present.

6.2 Conditions & expressions

Coercions from hashes/lists/pairs:

  • Operators (=, comparisons, like/not-like, JSON ->/->>/#>/#>>, arithmetic, bitwise, IS DISTINCT FROM, …).

  • Nil/undefined → IS NULL; Ranges → BETWEEN; Junctions → IN; nested and/or; subquery EXISTS/IN; CASE; CAST; functions; row lists.

6.3 Advanced SELECT / DML

  • CTEs (Common), window frames/clauses, compound queries, locking clauses, DISTINCT ON–style column distinction where represented.

  • Upsert / ON CONFLICT targets and update actions.

  • Multi-row INSERT; INSERT…SELECT; UPDATE FROM; DELETE USING; RETURNING.

  • Join types including NATURAL and CROSS; subquery / function sources (incl. WITH ORDINALITY rendering paths).

6.4 Gaps

  • No DDL (CREATE/ALTER TABLE, etc.) — Red still unique here among AST builders.

  • No ORM models or automatic schema mapping.

  • Version still 0.0.x; last raku.land release April 2024 (older than Red). Large feature surface in one module; fewer public tutorials than Red.

7. Options count (rough)

AxisRedSQL::Abstract
Top-level familiesDML + MultiSelect + DDL + TxnSelect/Insert/Update/Delete + Upsert (+ Builder)
First-class SELECT extrasFOR lock, set opsHAVING, DISTINCT, CTE, WINDOW, compound, locking
DialectsCommonSQL, Pg, SQLitePostgres, SQLite, MySQL
Expression surfaceVery large (ORM ops)Very large (AST ops + coercions)
Escape hatchLimitedLiterals / custom expressions
Approx. AST/render code sizeLarge (AST + drivers + ORM)~3.5k LOC Abstract + small Query/Placeholders

Most DML options: SQL::Abstract.Most overall SQL kinds (incl. DDL): Red.

8. Excluded SQL builders

These generate or run SQL but are out of scope here because they do not use an AST → render/translate pipeline (the criterion for this note).

ModuleWhy excluded (no AST → SQL)
SQL::Builder (zef:avuserow)Chainable builder assembles typed fragments (Identifier, Placeholder, Raw, Fn) straight into SQL strings + binds — no query AST and no dialect renderer layer. Companion: SQL::Builder::ExecuteWithDBIish.
ORM::ActiveRecordStructured Query clause bags (hashes/lists of where/order/joins/…) then adapter string builders (to-sql / SqlBuilders). Intermediate state, not an expression AST.
DB::Xoos (+ Pg/SQLite/MySQL/Oracle)Filters/options → string concat in DB::Xoos::SQL (sql-select / sql-insert / …).
DB::ORM::QuickySearch hashes → SQL strings via !processtosql (SELECT/INSERT/UPDATE/DELETE).

Also not AST builders (hand-written or non-generative SQL): Badger (.sql files → Raku subs), Slang::SQL (embed SQL in Raku), SQL::Lexer (lexical grammar only). Marrow reads schemas and generates Cro apps; it does not emit query SQL. Net::Postgres::Abstract wraps SQL::Abstract rather than defining its own AST.

9. Source pointers

AreaPath / URL
Red Select ASTRed/lib/Red/AST/Select.rakumod
Red SQL emitRed/lib/Red/Driver/CommonSQL.rakumod
Red ResultSeqRed/lib/Red/ResultSeq.rakumod
Red architecturehttps://fco.github.io/Red/tutorials/architecture.html
SQL::Abstractlib/SQL/Abstract.rakumod / https://raku.land/zef:leont/SQL::Abstract
Red releaseshttps://raku.land/zef:FCO/Red/badges
Abstract releaseshttps://raku.land/zef:leont/SQL::Abstract/badges

Generated from upstream sources and raku.land release metadata checked 2026-08-11.

Qwiratry v0.11.0

Declarative query and data-walking architecture for Raku, with transformers, molds, walkers, I/O pipelines, and aggregate functions.

Authors

  • Tim Nelson

License

Dependencies

SlangifyImplementation::Loader:ver<0.0.9+>Glob::Grammar

Test Dependencies

Provides

  • Qwiratry
  • Qwiratry::Aggregate::AggSub
  • Qwiratry::Aggregate::AggSub::Compiler
  • Qwiratry::Aggregate::Avg
  • Qwiratry::Aggregate::BodyRewrite
  • Qwiratry::Aggregate::Count
  • Qwiratry::Aggregate::DenseRank
  • Qwiratry::Aggregate::Driver
  • Qwiratry::Aggregate::Rank
  • Qwiratry::Aggregate::Sum
  • Qwiratry::AggregateFunction
  • Qwiratry::Context
  • Qwiratry::DatabaseStorage
  • Qwiratry::DatabaseStorage::CSVdemo
  • Qwiratry::DatabaseStorage::Location
  • Qwiratry::DatabaseStorage::Location::Tree
  • Qwiratry::DatabaseStorage::Memory
  • Qwiratry::FieldMode
  • Qwiratry::Format
  • Qwiratry::Format::Base
  • Qwiratry::Format::CSVdemo
  • Qwiratry::Format::HalfHuman
  • Qwiratry::Format::JSONdemo
  • Qwiratry::Format::NDJSONdemo
  • Qwiratry::Format::Textish::RenderWalkable
  • Qwiratry::Implementation::Loader
  • Qwiratry::Location
  • Qwiratry::Location::Base
  • Qwiratry::Location::File
  • Qwiratry::Mold
  • Qwiratry::Mold::Compiler
  • Qwiratry::Mold::Registry
  • Qwiratry::Mold::Slang
  • Qwiratry::MovingFrameAggregateFunction
  • Qwiratry::Operator::Capability
  • Qwiratry::Operator::IO
  • Qwiratry::Operator::MapReduce
  • Qwiratry::Operator::Navigation
  • Qwiratry::Operator::Set
  • Qwiratry::Query::Evaluator::Eager
  • Qwiratry::Query::Evaluator::Filter
  • Qwiratry::Query::Evaluator::Join
  • Qwiratry::Query::Evaluator::Lazy
  • Qwiratry::Query::Evaluator::MapReduce
  • Qwiratry::Query::Evaluator::Navigation
  • Qwiratry::Query::Evaluator::Relational
  • Qwiratry::Query::Evaluator::Row
  • Qwiratry::Query::Evaluator::Set
  • Qwiratry::Query::Evaluator::Union
  • Qwiratry::Query::Extract
  • Qwiratry::Query::NamedJoins
  • Qwiratry::Query::RelationCommon
  • Qwiratry::Query::Runtime
  • Qwiratry::Query::Selector
  • Qwiratry::Query::Slang
  • Qwiratry::Query::Slang::Ops
  • Qwiratry::Query::Slang::Topic
  • Qwiratry::Query::Specificity
  • Qwiratry::Query::Topic
  • Qwiratry::QueryCursor
  • Qwiratry::QueryIterator
  • Qwiratry::QueryMatch
  • Qwiratry::Setup
  • Qwiratry::Singleton
  • Qwiratry::Strategy
  • Qwiratry::Strategy::ControlSignal
  • Qwiratry::Strategy::FinishResult
  • Qwiratry::Strategy::RewriteSpec
  • Qwiratry::Strategy::Traversal
  • Qwiratry::Suggest
  • Qwiratry::TaOP
  • Qwiratry::Table
  • Qwiratry::Table::Schema
  • Qwiratry::Transformer
  • Qwiratry::Transformer::Copy
  • Qwiratry::Transformer::TreeRewrite
  • Qwiratry::Tree::Navigator
  • Qwiratry::Tree::Navigator::Base
  • Qwiratry::Tree::Navigator::Filesystem
  • Qwiratry::Tree::Navigator::Match
  • Qwiratry::Tree::Navigator::RakuAST
  • Qwiratry::Tree::Replace
  • Qwiratry::Walker
  • Qwiratry::Walker::Capabilities
  • Qwiratry::Walker::Factory
  • Qwiratry::Walker::Implementation::Table
  • Qwiratry::Walker::Implementation::Tree
  • Qwiratry::Walker::Implementation::TreeWithPath
  • Qwiratry::Walker::Master
  • Qwiratry::Walker::Providing
  • TypedIterator
  • WalkCursor
  • X::Qwiratry

The Camelia image is copyright 2009 by Larry Wall. "Raku" is a trademark of the Yet Another Society. All rights reserved.

Built with Podlite — the markup and publishing tools behind this site.