feat(db): add inline TVFs for simple array extraction from SearchCriteria

This commit is contained in:
Joseph Doherty
2026-01-06 13:14:18 -05:00
parent 5ee348dc98
commit 250323f8b0
@@ -0,0 +1,128 @@
-- Migration: 046_CreateSimpleTableFunctions
-- Inline TVFs to extract simple arrays from Search.Criteria JSON
-- Pattern: CTE pre-filters valid JSON, OPENJSON...WITH for type-safe extraction
-- fn_GetSearchWorkOrders: Extract WorkOrderNumbers array
IF OBJECT_ID('dbo.fn_GetSearchWorkOrders', 'IF') IS NOT NULL
DROP FUNCTION dbo.fn_GetSearchWorkOrders;
GO
CREATE FUNCTION dbo.fn_GetSearchWorkOrders(@SearchId INT)
RETURNS TABLE
AS
RETURN
(
WITH ValidSearch AS (
SELECT Criteria
FROM dbo.Search
WHERE ID = @SearchId
AND Criteria IS NOT NULL
AND ISJSON(Criteria) = 1
)
SELECT j.WorkOrderNumber
FROM ValidSearch s
CROSS APPLY OPENJSON(s.Criteria, '$.WorkOrderNumbers')
WITH (WorkOrderNumber BIGINT '$') j
WHERE j.WorkOrderNumber IS NOT NULL
);
GO
-- fn_GetSearchItemNumbers: Extract ItemNumbers array
IF OBJECT_ID('dbo.fn_GetSearchItemNumbers', 'IF') IS NOT NULL
DROP FUNCTION dbo.fn_GetSearchItemNumbers;
GO
CREATE FUNCTION dbo.fn_GetSearchItemNumbers(@SearchId INT)
RETURNS TABLE
AS
RETURN
(
WITH ValidSearch AS (
SELECT Criteria
FROM dbo.Search
WHERE ID = @SearchId
AND Criteria IS NOT NULL
AND ISJSON(Criteria) = 1
)
SELECT j.ItemNumber
FROM ValidSearch s
CROSS APPLY OPENJSON(s.Criteria, '$.ItemNumbers')
WITH (ItemNumber VARCHAR(128) '$') j
WHERE j.ItemNumber IS NOT NULL
);
GO
-- fn_GetSearchProfitCenters: Extract ProfitCenters array
IF OBJECT_ID('dbo.fn_GetSearchProfitCenters', 'IF') IS NOT NULL
DROP FUNCTION dbo.fn_GetSearchProfitCenters;
GO
CREATE FUNCTION dbo.fn_GetSearchProfitCenters(@SearchId INT)
RETURNS TABLE
AS
RETURN
(
WITH ValidSearch AS (
SELECT Criteria
FROM dbo.Search
WHERE ID = @SearchId
AND Criteria IS NOT NULL
AND ISJSON(Criteria) = 1
)
SELECT j.Code
FROM ValidSearch s
CROSS APPLY OPENJSON(s.Criteria, '$.ProfitCenters')
WITH (Code VARCHAR(12) '$') j
WHERE j.Code IS NOT NULL
);
GO
-- fn_GetSearchWorkCenters: Extract WorkCenters array
IF OBJECT_ID('dbo.fn_GetSearchWorkCenters', 'IF') IS NOT NULL
DROP FUNCTION dbo.fn_GetSearchWorkCenters;
GO
CREATE FUNCTION dbo.fn_GetSearchWorkCenters(@SearchId INT)
RETURNS TABLE
AS
RETURN
(
WITH ValidSearch AS (
SELECT Criteria
FROM dbo.Search
WHERE ID = @SearchId
AND Criteria IS NOT NULL
AND ISJSON(Criteria) = 1
)
SELECT j.Code
FROM ValidSearch s
CROSS APPLY OPENJSON(s.Criteria, '$.WorkCenters')
WITH (Code VARCHAR(12) '$') j
WHERE j.Code IS NOT NULL
);
GO
-- fn_GetSearchOperatorIDs: Extract OperatorIDs array
IF OBJECT_ID('dbo.fn_GetSearchOperatorIDs', 'IF') IS NOT NULL
DROP FUNCTION dbo.fn_GetSearchOperatorIDs;
GO
CREATE FUNCTION dbo.fn_GetSearchOperatorIDs(@SearchId INT)
RETURNS TABLE
AS
RETURN
(
WITH ValidSearch AS (
SELECT Criteria
FROM dbo.Search
WHERE ID = @SearchId
AND Criteria IS NOT NULL
AND ISJSON(Criteria) = 1
)
SELECT j.OperatorID
FROM ValidSearch s
CROSS APPLY OPENJSON(s.Criteria, '$.OperatorIDs')
WITH (OperatorID VARCHAR(128) '$') j
WHERE j.OperatorID IS NOT NULL
);
GO