Skip to content
Prev Previous commit
Next Next commit
refactor(ft.hybrid): reuse AGGREGATE reducer types in HYBRID command
  • Loading branch information
PavelPashov committed Feb 5, 2026
commit cf3d6ed895df11b131e4760ead337fc77ca1256e
4 changes: 2 additions & 2 deletions packages/search/lib/commands/AGGREGATE.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ interface RandomSampleReducer extends GroupByReducerWithProperty<FT_AGGREGATE_GR
sampleSize: number;
}

type GroupByReducers = CountReducer | CountDistinctReducer | CountDistinctishReducer | SumReducer | MinReducer | MaxReducer | AvgReducer | StdDevReducer | QuantileReducer | ToListReducer | FirstValueReducer | RandomSampleReducer;
export type GroupByReducers = CountReducer | CountDistinctReducer | CountDistinctishReducer | SumReducer | MinReducer | MaxReducer | AvgReducer | StdDevReducer | QuantileReducer | ToListReducer | FirstValueReducer | RandomSampleReducer;

interface GroupByStep extends AggregateStep<FT_AGGREGATE_STEPS['GROUPBY']> {
properties?: RediSearchProperty | Array<RediSearchProperty>;
Expand Down Expand Up @@ -284,7 +284,7 @@ function pushLoadField(args: Array<RedisArgument>, toLoad: LoadField) {
}
}

function parseGroupByReducer(parser: CommandParser, reducer: GroupByReducers) {
export function parseGroupByReducer(parser: CommandParser, reducer: GroupByReducers) {
parser.push('REDUCE', reducer.type);

switch (reducer.type) {
Expand Down
25 changes: 10 additions & 15 deletions packages/search/lib/commands/HYBRID.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import HYBRID, { FT_HYBRID_VECTOR_METHOD, FT_HYBRID_COMBINE_METHOD } from "./HYB
import { BasicCommandParser } from "@redis/client/lib/client/parser";
import testUtils, { GLOBAL } from "../test-utils";
import { SCHEMA_VECTOR_FIELD_ALGORITHM } from "./CREATE";
import { FT_AGGREGATE_GROUP_BY_REDUCERS } from "./AGGREGATE";

/**
* Helper function to create a Float32Array vector as a Buffer
Expand Down Expand Up @@ -480,9 +481,7 @@ describe("FT.HYBRID", () => {
GROUPBY: {
fields: ["@category"],
REDUCE: {
function: "COUNT",
nargs: 0,
args: [],
type: FT_AGGREGATE_GROUP_BY_REDUCERS.COUNT,
},
},
PARAMS: {
Expand Down Expand Up @@ -765,15 +764,13 @@ describe("FT.HYBRID", () => {
fields: ["@itemType", "@price"],
REDUCE: [
{
function: "COUNT_DISTINCT",
nargs: 1,
args: ["@color"],
type: FT_AGGREGATE_GROUP_BY_REDUCERS.COUNT_DISTINCT,
property: "@color",
AS: "colors_count",
},
{
function: "MIN",
nargs: 1,
args: ["@size"],
type: FT_AGGREGATE_GROUP_BY_REDUCERS.MIN,
property: "@size",
},
],
},
Expand Down Expand Up @@ -1756,15 +1753,13 @@ describe("FT.HYBRID", () => {
fields: ["@itemType", "@price"],
REDUCE: [
{
function: "COUNT_DISTINCT",
nargs: 1,
args: ["@color"],
type: FT_AGGREGATE_GROUP_BY_REDUCERS.COUNT_DISTINCT,
property: "@color",
AS: "colors_count",
},
{
function: "MIN",
nargs: 1,
args: ["@size"],
type: FT_AGGREGATE_GROUP_BY_REDUCERS.MIN,
property: "@size",
},
],
},
Expand Down
27 changes: 4 additions & 23 deletions packages/search/lib/commands/HYBRID.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
parseOptionalVariadicArgument,
} from "@redis/client/dist/lib/commands/generic-transformers";
import { parseParamsArgument } from "./SEARCH";
import { GroupByReducers, parseGroupByReducer } from "./AGGREGATE";

/**
* Text search expression configuration for hybrid search.
Expand Down Expand Up @@ -100,20 +101,6 @@ interface FtHybridCombineMethodLinear {
WINDOW?: number;
}

/**
* Reducer configuration for GROUPBY aggregation.
*/
export interface FtHybridReducer {
/** Reducer function name (e.g., "COUNT", "SUM", "AVG") */
function: RedisArgument;
/** Number of arguments for the reducer */
nargs: number;
/** Arguments for the reducer function */
args: Array<RedisArgument>;
/** Alias for the reducer result in output */
AS?: RedisArgument;
}

/**
* Apply expression for result transformation.
*/
Expand Down Expand Up @@ -146,7 +133,7 @@ export interface FtHybridOptions {
/** Fields to group by */
fields: RedisVariadicArgument;
/** Reducer(s) to apply to each group */
REDUCE?: FtHybridReducer | Array<FtHybridReducer>;
REDUCE?: GroupByReducers | Array<GroupByReducers>;
};
/** Apply expression(s) for result transformation */
APPLY?: FtHybridApply | Array<FtHybridApply>;
Expand Down Expand Up @@ -312,13 +299,7 @@ function parseCombineMethod(
}
}

function parseReducer(parser: CommandParser, reducer: FtHybridReducer) {
parser.push("REDUCE", reducer.function, reducer.nargs.toString());
parser.push(...reducer.args);
if (reducer.AS) {
parser.push("AS", reducer.AS);
}
}


function parseApply(parser: CommandParser, apply: FtHybridApply) {
parser.push("APPLY", apply.expression);
Expand Down Expand Up @@ -353,7 +334,7 @@ function parseHybridOptions(parser: CommandParser, options?: FtHybridOptions) {
: [options.GROUPBY.REDUCE];

for (const reducer of reducers) {
parseReducer(parser, reducer);
parseGroupByReducer(parser, reducer);
}
}
}
Expand Down
Loading