feat(db): add inline TVFs for complex object extraction from SearchCriteria

This commit is contained in:
Joseph Doherty
2026-01-06 13:17:23 -05:00
parent 250323f8b0
commit 28d2fd30c9
@@ -0,0 +1,59 @@
-- Migration: 047_CreateComplexTableFunctions
-- Inline TVFs to extract complex object arrays from Search.Criteria JSON
-- Pattern: CTE pre-filters valid JSON, OPENJSON...WITH for type-safe extraction
-- fn_GetSearchComponentLots: Extract ComponentLotNumbers array of objects
IF OBJECT_ID('dbo.fn_GetSearchComponentLots', 'IF') IS NOT NULL
DROP FUNCTION dbo.fn_GetSearchComponentLots;
GO
CREATE FUNCTION dbo.fn_GetSearchComponentLots(@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.LotNumber, j.ItemNumber
FROM ValidSearch s
CROSS APPLY OPENJSON(s.Criteria, '$.ComponentLotNumbers')
WITH (
LotNumber VARCHAR(30) '$.LotNumber',
ItemNumber VARCHAR(128) '$.ItemNumber'
) j
);
GO
-- fn_GetSearchPartOperations: Extract PartOperations array of objects
IF OBJECT_ID('dbo.fn_GetSearchPartOperations', 'IF') IS NOT NULL
DROP FUNCTION dbo.fn_GetSearchPartOperations;
GO
CREATE FUNCTION dbo.fn_GetSearchPartOperations(@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, j.OperationNumber, j.MisNumber, j.MisRevision
FROM ValidSearch s
CROSS APPLY OPENJSON(s.Criteria, '$.PartOperations')
WITH (
ItemNumber VARCHAR(128) '$.ItemNumber',
OperationNumber VARCHAR(10) '$.OperationNumber',
MisNumber VARCHAR(10) '$.MisNumber',
MisRevision VARCHAR(10) '$.MisRevision'
) j
);
GO