Files
Joseph Doherty 26ff8d9b4f Initial commit: JDE Scoping Tool migration project
Set up repository with legacy .NET Framework 4.8 source (OLD/),
new .NET 10 Blazor solution (NEW/), OpenSpec specifications,
documentation, and project configuration.
2026-01-02 07:43:29 -05:00

4.8 KiB

Implement Search Processing

Summary

Implement the search processing subsystem that executes user-defined filter queries against the SQL Server cache database. This phase replaces the legacy T4 text template (QueryTemplate.tt) with a SqlKata fluent query builder, providing type-safe query construction, parameterized SQL generation, and composable filter handling.

Scope

In Scope

  • ISearchQueryBuilder interface and SqlKataSearchQueryBuilder implementation
  • Filter handler pattern with individual handlers per filter type:
    • WorkOrderFilterHandler
    • ItemNumberFilterHandler
    • ProfitCenterFilterHandler
    • WorkCenterFilterHandler
    • OperatorFilterHandler
    • ComponentLotFilterHandler
    • ItemOperationMisFilterHandler
    • TimespanFilterHandler
  • ISearchProcessor interface and SearchProcessor service implementation
  • IWorkOrderTraversalService interface for downstream work order traversal
  • SearchModel class (reporting model with enriched filter entries)
  • Filter entry record types (immutable DTOs with output attributes)
  • Result record types: SearchResult, MisSearchResult, MisNonMatchSearchResult
  • Table-valued parameter creation helpers
  • MIS data extraction query building
  • SearchProcessingOptions configuration class
  • AddSearchProcessing service registration extension method
  • Unit tests with xUnit, Shouldly, and NSubstitute

Out of Scope

  • Background job scheduling (handled by Phase 5 data-sync or separate worker phase)
  • Excel export generation (Phase 7: excel-export)
  • API endpoints for search submission (Phase 8: web-api-auth)
  • SignalR real-time status updates (Phase 8: web-api-auth)
  • Database schema changes (Phase 1: migrate-database-schema)

Motivation

The legacy T4 text template approach has significant limitations:

  • SDK incompatibility: T4 templates are poorly supported in modern .NET SDK-style projects
  • Untestable: Generated SQL cannot be unit tested without database execution
  • Fragile: String concatenation prone to SQL injection and syntax errors
  • Untyped: No compile-time validation of query structure

SqlKata provides:

  • Fluent API: Readable, composable query building with IntelliSense support
  • Parameterized by default: SQL injection protection built-in
  • Testable: Unit test query building without database
  • Type-safe: Compile-time checking of method calls
  • SQL Server optimized: SqlServerCompiler generates optimized T-SQL

Acceptance Criteria

  1. ISearchQueryBuilder interface defined with BuildSearchQuery(SearchModel) method
  2. SqlKataSearchQueryBuilder generates equivalent SQL to legacy QueryTemplate.tt
  3. All 8 filter handlers implemented with conditional join/where clause generation
  4. SearchProcessor orchestrates:
    • Filter entry enrichment via repository lookups
    • Query building via SqlKata
    • Query execution via Dapper
    • Result aggregation into SearchModel.Results
    • MIS data extraction when ExtractMisData = true
  5. Downstream work order traversal calls stored procedure dbo.TraverseWorkOrders
  6. Table-valued parameters created correctly for all filter types
  7. All result types include OutputColumnAttribute and OutputTableAttribute for Excel export
  8. Unit tests verify:
    • Query builder generates expected SQL structure
    • Filter handlers apply correct joins and conditions
    • Parameter binding works for all TVP types
  9. AddSearchProcessing registers all services with appropriate lifetimes
  10. openspec validate implement-search-processing --strict passes

Dependencies

  • Phase 1: migrate-database-schema - Database tables, TVP types, stored procedures
  • Phase 3: implement-domain-models - Core domain entities (Search, SearchCriteria, etc.)
  • Phase 4: implement-data-access - IDbConnectionFactory, ILotFinderRepository for lookups
  • NuGet packages: SqlKata, SqlKata.Execution, Dapper, Microsoft.Data.SqlClient

Risks

Risk Mitigation
Query logic drift from legacy Codex MCP review comparing generated SQL against QueryTemplate.tt output
Complex filter combinations Comprehensive unit test matrix covering all filter permutations
MIS extraction query complexity Retain MIS extraction as separate stored procedure if needed
Performance regression Benchmark query execution time against legacy implementation
Downstream traversal correctness Stored procedure dbo.TraverseWorkOrders encapsulates iterative logic
  • search-processing - Primary specification for query building and search execution
  • domain-models - Entity types used in search criteria and results
  • data-access - Repository interfaces for filter enrichment lookups
  • database-schema - SQL Server tables and TVP types for search execution