Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions modules/experimental/src/ludf/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,16 @@ export type {
LuDataFrameDerivedColumnFormatForExpression,
LuDataFrameDerivedColumnOptions
} from './lu-data-frame-query';
export {LuDataFrameGroupByQuery, LuDataFrameGroupedAggregationQuery} from './lu-group-by-query';
export type {
LuDataFrameAggregationDefinition,
LuDataFrameAggregationDefinitions,
LuDataFrameAggregationOperation,
LuDataFrameAggregationValue,
LuDataFrameColumnNamesOfFormat,
LuDataFrameGroupByOptions,
LuDataFrameGroupedAggregationResult
} from './lu-group-by-query';
export {and, column, literal, LuExpression, not, or, parameter} from './lu-expression';
export type {
LuExpressionBinaryOperator,
Expand All @@ -28,3 +38,4 @@ export type {
} from './lu-expression';
export {CompiledLuDataFrameQuery} from './lu-query-compiler';
export type {LuDataFrameQueryParameters} from './lu-query-compiler';
export {CompiledLuDataFrameGroupedAggregation} from './lu-group-aggregation-compiler';
13 changes: 13 additions & 0 deletions modules/experimental/src/ludf/lu-data-frame-query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ import type {GPUTypeMap} from '@luma.gl/tables';
import type {GPUCommandGraph} from '../gpu-primitives/gpu-command-graph';
import type {LuDataFrame} from './lu-data-frame';
import {getLuExpressionColumnNames, LuExpression, type LuExpressionNode} from './lu-expression';
import {
LuDataFrameGroupByQuery,
type LuDataFrameColumnNamesOfFormat,
type LuDataFrameGroupByOptions
} from './lu-group-by-query';
import {
compileLuDataFrameQuery,
type CompiledLuDataFrameQuery,
Expand Down Expand Up @@ -144,6 +149,14 @@ export class LuDataFrameQuery<
);
}

/** Plans dense categorical grouping without allocating GPU resources or reading source values. */
groupBy<Key extends LuDataFrameColumnNamesOfFormat<Logical, SelectedColumns, 'uint32'>>(
key: Key,
options: LuDataFrameGroupByOptions = {}
): LuDataFrameGroupByQuery<Logical, SelectedColumns, Key, Source> {
return new LuDataFrameGroupByQuery(this, key, options);
}

/** Materializes reusable GPU graph passes and compiler-owned selection/index/count outputs. */
compile(
graph: GPUCommandGraph<LuDataFrameQueryParameters>
Expand Down
17 changes: 17 additions & 0 deletions modules/experimental/src/ludf/lu-data-frame.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ import {
type LuDataFrameDerivedColumnOptions
} from './lu-data-frame-query';
import type {LuExpression} from './lu-expression';
import type {
LuDataFrameColumnNamesOfFormat,
LuDataFrameGroupByOptions,
LuDataFrameGroupByQuery
} from './lu-group-by-query';

/** Whether a dataframe borrows its source resources or releases them after its final view. */
export type LuDataFrameOwnership = 'borrowed' | 'owned';
Expand Down Expand Up @@ -191,6 +196,18 @@ export class LuDataFrame<T extends GPUTypeMap = GPUTypeMap> {
return query.withColumn<Name, ReferencedColumns, Format>(name, expression, options);
}

/** Plans dense unsigned grouping without allocating GPU resources or retaining source leases. */
groupBy<Key extends LuDataFrameColumnNamesOfFormat<T, keyof T & string, 'uint32'>>(
key: Key,
options: LuDataFrameGroupByOptions = {}
): LuDataFrameGroupByQuery<T, keyof T & string, Key, T> {
this.assertAvailable();
return new LuDataFrameQuery<T, keyof T & string, T>(this, [], this.columnNames).groupBy(
key,
options
);
}

/**
* Returns an independent borrowed projection without mutating or destroying source columns.
*
Expand Down
5 changes: 3 additions & 2 deletions modules/experimental/src/ludf/lu-expression-shader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,10 @@ export function makeLuQueryExpressionShaderPlan<T extends GPUTypeMap>(
source: LuDataFrame<T>,
predicates: readonly LuExpression<boolean, string>[],
derivedColumns: readonly LuDataFrameDerivedColumn[] = [],
selectedColumns: readonly string[] = []
selectedColumns: readonly string[] = [],
allowEmptyPredicates = false
): LuQueryExpressionShaderPlan {
if (predicates.length === 0 && derivedColumns.length === 0) {
if (predicates.length === 0 && derivedColumns.length === 0 && !allowEmptyPredicates) {
throw new Error('LuDataFrame filtering requires at least one predicate');
}

Expand Down
Loading
Loading