Implementing Filtering and Sorting

1. Defining Filter Input Types

Example: Composable filter

input PostFilter {
  AND: [PostFilter!]
  OR: [PostFilter!]
  NOT: PostFilter
  title: StringFilter
  status: OrderStatus
  createdAt: DateFilter
}

2. Using Comparison Operators

OperatorField
eqEquals
neNot equals
gt / gte / lt / lteComparison
in / ninSet membership

3. Using Logical Operators

Example: AND/OR/NOT

{
  posts(filter: {
    AND: [
      { status: PUBLISHED }
      { OR: [{ title: { contains: "graphql" } }, { tags: { in: ["api"] } }] }
    ]
  }) { id }
}

4. Implementing String Filters

OperatorUse
eq / neExact
containsSubstring (LIKE %x%)
startsWith / endsWithPrefix/suffix
matchesRegex (use cautiously)
caseSensitiveToggle collation

5. Implementing Date Filters

Example: Date filter

input DateFilter {
  eq: DateTime
  gte: DateTime
  lte: DateTime
  between: [DateTime!]   # exactly 2
}

6. Implementing Null Filters

OperatorBehavior
isNull: trueWHERE x IS NULL
isNull: falseWHERE x IS NOT NULL
eq: nullAvoid — ambiguous in some ORMs

7. Defining Sort Input Types

Example: Sort input

enum PostSortField { CREATED_AT TITLE LIKES_COUNT }
enum SortDirection { ASC DESC }

input PostOrderBy {
  field: PostSortField!
  direction: SortDirection! = DESC
}

8. Using Sort Direction

DirectionSQL
ASCORDER BY x ASC
DESCORDER BY x DESC
NullsNULLS FIRST/LAST option

9. Implementing Multi-field Sorting

Example: Multi-field sort

{
  posts(orderBy: [
    { field: STATUS, direction: ASC }
    { field: CREATED_AT, direction: DESC }
  ]) { id title }
}

10. Combining Filters and Sorting

PatternDetail
filter + orderBy + paginationStandard list query signature
Index alignmentCover (filter, sort) columns with composite index
Stable sortAppend id as final sort key for cursor pagination