Connector Capability Matrix
A side-by-side, honest comparison of every Nexus connector — read and write modes, schema discovery, pushdown of filters, ordering, grouping and aggregation, operator subsets, and what happens when a source lacks a capability.
This page is the single place to compare every Nexus connector at a glance: what each can read and write, what it discovers, and — most importantly — exactly what it pushes down versus what the engine finishes in memory. Pushdown is deliberately not uniform across connectors, and this page states where and why. For the semantics behind the tables (why a partial filter is re-applied in memory, what the row budget is), read the connectors overview first.
The honest headline
Every connector returns the same result for the same UQL query. What differs is where the work runs. A relational database evaluates your entire query at the source; a SaaS API with no aggregation surface returns rows and Nexus aggregates them itself. Both give you the correct grouped totals — the second just reads more rows to get there, bounded by the engine's row budget. Nowhere does a source silently ignore a predicate it doesn't understand: if an operator isn't pushable, the engine applies it in memory rather than trusting a partial translation.
Read / write / discover
| Connector | Version | Read | Write modes | Merge / upsert | Discover |
|---|---|---|---|---|---|
| PostgreSQL | 2.0.7 | Yes | insert / update / delete | Yes (ON CONFLICT) |
Yes |
| MySQL | 2.0.5 | Yes | insert / update / delete | Yes (ON DUPLICATE KEY) |
Yes |
| SQL Server | 2.0.5 | Yes | insert / update / delete | Yes (T-SQL MERGE) |
Yes |
| Generic JDBC | 2.0.5 | Yes | insert / update / delete | Dialect-dependent | Yes |
| NetSuite (REST / SuiteQL) | 2.0.8 | Yes | insert / update / delete | Yes | Yes |
| NetSuite (SuiteAnalytics Connect) | 2.0.8 | Yes | — (read-only) | No | Yes |
| QuickBooks Online | 2.0.1 | Yes | insert / update / delete | No | Yes |
| Monday.com | 2.0.6 | Yes | insert / update / delete | No | Yes |
| Stripe (preview) | 0.1.0 | Yes | insert / update / delete (per-collection) | No | Yes |
| Internal Workspace | baked-in | Yes | insert / update / delete | Yes (ON CONFLICT) |
Yes |
Notes:
- NetSuite is one bundle with two surfaces. The REST/SuiteQL surface writes; the SuiteAnalytics Connect surface is read-only analytics. Both ship as version 2.0.8.
- Generic JDBC merge is dialect-dependent — Nexus doesn't assume one merge syntax across every JDBC database. See the JDBC page.
- Stripe write is per-collection: Stripe resources differ in what they allow (some objects can't be deleted, only cancelled/voided), so writability is declared per collection.
Pushdown
"Pushdown" means the source evaluates that clause itself. "In-engine" means Nexus reads rows and evaluates the clause in memory (bounded by the row budget) — still correct, just executed locally.
| Connector | WHERE | ORDER | GROUP BY | Aggregates | Notes |
|---|---|---|---|---|---|
| PostgreSQL | Push | Push | Push | Push | Full SQL: distinct, having, joins, select expressions, sum/count/avg/min/max |
| MySQL | Push | Push | Push | Push | Full SQL |
| SQL Server | Push | Push | Push | Push | Full T-SQL |
| Generic JDBC | Push | Push | Push | Push | Full SQL surface at the source database |
| NetSuite — SuiteQL surface | Push | Push | Push | Push | Full pushdown through the SuiteQL query endpoint |
| NetSuite — Record API surface | In-engine | In-engine | In-engine | In-engine | The per-record REST surface has no query pushdown |
| NetSuite — SuiteAnalytics Connect | Push | Push | Push | Push | Richest surface: window functions, CTEs, lateral joins, regex/JSON |
| QuickBooks Online | Push | Push | In-engine | In-engine | QBO query language has filter + order but no GROUP BY/aggregate |
| Monday.com | Push | Push | In-engine | In-engine | GraphQL ItemsQuery filters + order; no aggregation surface |
| Stripe (preview) | In-engine | In-engine | In-engine | In-engine | Pre-1.0: where/order declared false → engine filters and sorts in memory |
| Internal Workspace | Push | Push | Push | Push | Full Postgres pushdown; ideal staging target for in-engine work |
The pattern to internalize: the three relational databases, generic JDBC, the workspace, and NetSuite's SQL surfaces push everything down. QuickBooks and Monday push filtering and ordering but aggregate in-engine. NetSuite's REST Record API and Stripe (preview) push nothing — every clause runs in-engine. This is a property of each source's API, not a Nexus limitation, and the overview explains how the engine keeps all of them correct.
Filter operators
SQL-backed connectors (Postgres, MySQL, SQL Server, generic JDBC, both NetSuite surfaces, QuickBooks, the workspace) share the standard operator set:
$eq $ne $gt $gte $lt $lte $like $in $not_in $between $empty $contains $starts_with $ends_with $expr
Exceptions and additions:
| Connector | Operator differences |
|---|---|
| Monday.com | Adds $not_contains, $not_empty. Lacks $in, $not_in, $like, $expr. |
| QuickBooks Online | Standard set, but only $eq/$ne/comparisons/$in etc. are pushed; the rest are applied in-engine. |
| Stripe (preview) | Standard set, all applied in-engine (no operator is pushed down yet). |
$expr injects a raw source-native fragment and is a trusted-author surface wherever it appears — treat report and pipeline authorship as privileged. Connectors that don't expose $expr (notably Monday) have no raw-fragment escape hatch by design.
What happens when a source lacks a capability
Nexus never fails a query just because a source can't push part of it down, and never returns a partially-filtered result. The defined behavior:
- Unpushable filter operator → the source evaluates what it can; the engine re-applies the entire WHERE in memory over the returned rows, so the result matches UQL exactly.
LIMIT/OFFSETare then applied after the in-engine filter (they are pushed to the source only when the source is doing the whole filter). - No aggregation surface (QuickBooks, Monday, Stripe, NetSuite Record API) → the engine performs
GROUP BYandSUM/COUNT/AVG/MIN/MAXitself over the rows it read. Correct totals, just computed locally. - Bounded by the row budget → in-engine filtering/aggregation reads and materializes up to a cap rather than streaming an unbounded source into memory. For large analytical work over a low-pushdown source, push as much filter down as the source allows, stage into the workspace (full pushdown), and aggregate there. See timeouts & limits.
- Write to a non-writable target → rejected before any statement is sent. Views, computed/identity/formula/lookup columns, and read-only collections (e.g. QuickBooks
CompanyInfo/Preferences, name-list entities that deactivate rather than delete) are gated independently of RBAC. - Write mode a source doesn't support (e.g. merge on QuickBooks/Monday/Stripe) → not offered; use explicit insert/update or pipeline-side update-then-insert.
Maturity notes
- Stripe is a preview / pre-1.0 connector (0.1.0). It reads and does per-collection writes, but pushes nothing down and its collection coverage is evolving. Treat it as evaluation-grade, not production-hardened, and pin behavior in tests before depending on it.
- QuickBooks Online (2.0.1) is a newer adapter; confirm availability in your deployment.
- All version numbers above track the signed adapter bundles; the canonical machine-readable list is published at
/adapters.html.
See also
- Connectors overview — the adapter contract and full pushdown semantics
- Generic HTTP/REST and Generic JDBC — integrating anything not listed here
- Internal Workspace — the full-pushdown staging store
- UQL operators reference
- Supply-chain integrity — how connector bundles are signed and verified