Skip to content

Build multi-criteria invoice filter engine with query compilation and index caching #184

@Kingsman-99

Description

@Kingsman-99

Description

Implement a high-performance client-side invoice filter engine that compiles filter criteria into a reusable query object, supports nested AND/OR logic, and caches per-field indexes to avoid re-scanning large invoice arrays on repeated queries.

Acceptance Criteria

  • Create src/invoiceFilter.ts exporting compileFilter(criteria: FilterCriteria): CompiledFilter and applyFilter(invoices: Invoice[], filter: CompiledFilter): Invoice[]
  • FilterCriteria supports: { and?: FilterCriteria[], or?: FilterCriteria[], status?: InvoiceStatus, creator?: string, recipient?: string, token?: string, minFunded?: bigint, maxFunded?: bigint, deadlineBefore?: number, deadlineAfter?: number }
  • compileFilter validates criteria (throws if both and and or present at same level) and returns a CompiledFilter with a pre-built predicate function
  • FilterIndex class in same file: buildIndex(invoices: Invoice[]): FilterIndex builds Map-based indexes for status, creator, token; queryIndex(filter: CompiledFilter): Invoice[] uses indexes for equality checks then applies remaining predicates
  • Index is invalidated when the underlying invoice array reference changes
  • All exported from src/index.ts
  • Tests in test/invoiceFilter.test.ts: nested AND/OR logic, index reuse across multiple queries, invalid criteria throws, empty array returns empty, bigint funded range filtering

Context

  • Invoice and InvoiceStatus types are in src/types.ts
  • bigint comparison requires care — use explicit > / < not Math functions
  • Index must handle invoices with multiple recipients (recipient filter matches if ANY recipient matches)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions