Skip to main content
Version: 3.0 (next)

Apache Cassandra Nodes

Apache Cassandra is a distributed wide-column database built for heavy write loads such as sensor readings and event history. MaestroHub provides six nodes for it: CQL queries, key reads, row writes, deletes, single statements and batches — all against the keyspace the connection profile names.

Rows cross the boundary as plain JSON objects keyed by column name, and a downstream node reads result.rows[0].celsius directly.

For the connection, the function types and their fields, see the Apache Cassandra connection guide.

Configuration Quick Reference​

FieldWhat you chooseDetails
ParametersConnection, Function, Function Parameters, Timeout OverrideSelect the connection profile (which fixes the cluster and keyspace), the function, values for any ((parameter)) the function uses, and optionally a timeout override.
SettingsDescription, Timeout (seconds), Retry on Timeout, Retry on Fail, On ErrorNode description, maximum execution time, retry behavior on timeout or failure, and error handling strategy. All execution settings default to pipeline-level values.

Cassandra Query Node​

Run a CQL SELECT with values bound to ? markers.

The limit is sent to Cassandra as the page size, so it bounds what the cluster reads. When more rows may follow, the result carries a paging state that resumes the next run where this one stopped. Only SELECT runs here — other statements belong in Execute Statement.

Supported Function Types:

Function NamePurposeCommon Use Cases
QueryRead the rows a CQL SELECT selectsA device's readings in a time window, the latest value per device, paging through a partition

Cassandra Read Rows Node​

Read the rows of one partition by primary key, without writing CQL.

Name the partition key, and optionally leading clustering columns, as a JSON object. A key that matches nothing is not an error: the node succeeds with an empty result.rows, so a pipeline branches on the lookup.

Supported Function Types:

Function NamePurposeCommon Use Cases
Read RowsRead one partition, or one row of itEnrichment lookups, a machine's current record, existence checks

Cassandra Write Rows Node​

Insert or overwrite up to 1,000 rows in one call.

Each JSON field is bound to the column of the same name and converted to its type. A row with the same primary key is overwritten, so a replay writes the same data again. With Insert Only, rows that already exist are left as they were and listed in result.notApplied.

Supported Function Types:

Function NamePurposeCommon Use Cases
Write RowsStore one row or a list of rowsPersisting sensor readings, upserting machine records, create-only registration

Cassandra Delete Rows Node​

Delete one row by its full primary key, or a whole partition by its partition key.

Deleting rows that are not there succeeds, so the node is safe to replay. With If Exists, result.applied says whether the row was there.

Supported Function Types:

Function NamePurposeCommon Use Cases
Delete RowsRemove rows by keyRetention cleanup, erasure requests, compensating actions

Cassandra Execute Statement Node​

Run one CQL statement: an UPDATE of a counter, a conditional INSERT … IF NOT EXISTS, a CREATE TABLE.

A lightweight transaction reports whether its condition held in result.applied; when it did not, result.rows carries the row as it is.

Supported Function Types:

Function NamePurposeCommon Use Cases
Execute StatementAny single CQL statementCounter updates, conditional writes, schema setup

Cassandra Execute Batch Node​

Run up to 100 INSERT, UPDATE and DELETE statements as one logged, unlogged or counter batch.

A logged batch is atomic: once Cassandra accepts it, every statement is eventually applied. A batch is never buffered and replayed by store-and-forward, because its statements may increment counters.

Supported Function Types:

Function NamePurposeCommon Use Cases
Execute BatchSeveral statements applied togetherWriting a reading and updating its device summary, moving a row between partitions

Paging through a query​

When more rows may follow, result.truncated is true and result.pagingState carries the position. Feed it into the next run's Paging State, with the same query and values:

run 1: limit 100                      → result.pagingState "…", result.truncated true
run 2: pagingState from run 1 → result.pagingState "…", result.truncated true
run 3: pagingState from run 2 → result.truncated false, no paging state

Output​

Rows are plain JSON objects keyed by column name. Text carries UUIDs, IP addresses, decimals and varints too wide for a JSON number; timestamps are RFC 3339 in UTC; dates are YYYY-MM-DD; blobs are base64; lists and sets are arrays; maps and user-defined types are objects; a tuple is an array. A null column is null.

result.warnings carries the cluster's own client warnings for the request — an aggregation without a partition key, a batch over the warn threshold — and is empty when there are none.

Query​

KeyDescription
result.rowsThe rows, as JSON objects keyed by column name
result.countHow many rows came back
result.columnsThe column names in the order the cluster returned them
result.truncatedWhether more rows may follow — true exactly when result.pagingState is present
result.pagingStateFeed it back as the next run's Paging State to resume. Absent on the last page
result.warningsThe cluster's client warnings

Read Rows​

KeyDescription
result.tableThe table read, as keyspace.table when it is not in the connection's keyspace
result.keyThe key the read was made against
result.rowsThe rows the key matched, in clustering order — empty when it matched none
result.countHow many rows came back
result.columnsThe column names in the order the cluster returned them
result.truncatedWhether more rows may follow — true exactly when result.pagingState is present
result.pagingStateFeed it back as the next run's Paging State to resume. Absent on the last page
result.warningsThe cluster's client warnings

Write Rows​

KeyDescription
result.tableThe table written
result.countHow many rows the call carried
result.writtenHow many rows the cluster wrote
result.notAppliedWith Insert Only, the rows that already existed, each as {index, existing}. Empty otherwise

Delete Rows​

KeyDescription
result.tableThe table the rows were deleted from
result.keyThe key the delete was made against
result.appliedfalse only with If Exists, when no row had the key

Execute Statement​

KeyDescription
result.appliedfalse only when the statement's condition (IF …) did not hold
result.rowsRows the statement returned — a SELECT's rows, or the current row of a condition that did not hold
result.countHow many rows came back
result.columnsThe column names in the order the cluster returned them
result.truncatedWhether the statement returned more than the 1,000 rows delivered
result.warningsThe cluster's client warnings

Execute Batch​

KeyDescription
result.batchTypelogged, unlogged or counter
result.countHow many statements the batch carried
result.appliedfalse only for a conditional batch whose condition did not hold — then nothing was applied
result.rowsFor a conditional batch that did not apply, the rows as they are. Empty otherwise
result.warningsThe cluster's client warnings