Nexus
Documentation / Connectors

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/OFFSET are 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 BY and SUM/COUNT/AVG/MIN/MAX itself 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