"""Roll up a small spend table with aggregate(), then peek at the run() task shape.
Aggregations run synchronously and return one value per (column, AggregationType)
pair. run() is long-running — it returns a TableRunTask immediately, and
run_and_wait() polls until COMPLETED.
"""
from vectorshift.table import (
AggregationType,
ColumnSpec,
CompoundFilter,
FilterCondition,
NumberFormat,
NumberKind,
StringFormat,
Table,
TableFilterOperator,
)
t = Table.new(
name="SDK Tables Agg Demo",
columns=[
ColumnSpec(name="vendor", format=StringFormat()),
ColumnSpec(name="amount", format=NumberFormat(number_kind=NumberKind.FLOAT)),
ColumnSpec(name="region", format=StringFormat()),
],
)
t.insert_rows(
[
{"vendor": "Acme", "amount": 1200.5, "region": "EU"},
{"vendor": "Beta", "amount": 49.9, "region": "EU"},
{"vendor": "Gamma", "amount": 980.0, "region": "US"},
{"vendor": "Delta", "amount": 2200.0, "region": "US"},
]
)
print(f"1. Inserted 4 rows into {t.name!r}.")
# --- Aggregations across the whole table ---
print("2. Aggregations (all rows):")
for col, agg_type in [
("amount", AggregationType.SUM),
("amount", AggregationType.AVERAGE),
("amount", AggregationType.MAX),
("vendor", AggregationType.UNIQUE),
]:
agg = t.aggregate(aggregations=[(col, agg_type)])
for key, val in agg["aggregations"].items():
label = f"{col}.{agg_type.name}"
print(f" - {label:30} = {val}")
# --- Aggregation with a filter ---
agg_eu = t.aggregate(
aggregations=[("amount", AggregationType.SUM)],
filters=CompoundFilter.of(
FilterCondition("region", TableFilterOperator.EQ, "EU"),
),
)
print(f"3. SUM(amount) where region=EU: {agg_eu['aggregations']}")
# --- run() shape — no generator columns on this table, so this is a no-op.
# With a PipelineGenerator or AgentGenerator on the column, run() would
# fill the cells. See sdk/table/examples/columns-full for that wiring. ---
print("4. table.run() shape:")
try:
task = t.run(columns=["vendor"])
print(f" run() -> task_id={task.task_id[:8]}... status={task.status}")
polled = t.run_status(task.task_id)
print(f" run_status() -> status={polled.status}")
except Exception as exc:
print(f" run() requires generator columns: {type(exc).__name__}: {exc}")
t.delete()
print("5. Deleted Table.\n\nDone.")