Skip to content

Latest commit

 

History

History
494 lines (388 loc) · 11.2 KB

File metadata and controls

494 lines (388 loc) · 11.2 KB

Query Module - Implementation Summary

What We Built

The query module provides a powerful, fluent API for constructing complex queries over indexed text content using semantic descriptors.


Files Created

Query Module (query/)

  1. query/predicates.py - Query predicates

    • Base Predicate class with logical operators
    • Field predicates: FieldEquals, FieldIn, FieldStartsWith
    • Hierarchy predicates: HierarchyMatches, HierarchyDepth
    • Text predicates: TextContains, TextMatches
    • Metadata predicates: MetadataEquals, MetadataExists
    • Timestamp predicates: CreatedAfter, CreatedBefore, UpdatedAfter
    • Logical operators: AndPredicate, OrPredicate, NotPredicate
    • Custom predicates: CustomPredicate
  2. query/filters.py - High-level filters

    • Filter class - Fluent filter builder
    • Convenience functions: find_research_posts, find_tutorials, find_by_author, etc.
    • Domain-specific helpers
  3. query/query_builder.py - Query builder

    • QueryBuilder - Main fluent query API
    • QueryResult - Result container with metadata
    • Chainable methods for all query types
    • Sorting and pagination
    • Query explanation
  4. query/explain.py - Query explanations

    • explain_query() - Human-readable query explanations
    • explain_result() - Result analysis
    • explain_predicate_tree() - Predicate visualization
    • explain_why_matched() / explain_why_not_matched() - Match explanations
    • QueryExplainer - Interactive explainer class
    • Result comparison and statistics
  5. query/__init__.py - Public API

  6. examples/query_example.py - 12 comprehensive examples


Key Features

Predicate System

  • Type-safe predicate classes
  • Composable with logical operators (&, |, ~)
  • Human-readable explanations
  • Custom predicate support
  • Lazy evaluation

Query Builder

  • Fluent, chainable API
  • Type-specific methods (domain, intent, tone, etc.)
  • Hierarchy-aware querying
  • Text search
  • Metadata filtering
  • Timestamp filtering
  • Sorting (by any field)
  • Pagination (limit/offset)
  • Query cloning

Filtering

  • High-level Filter class
  • Convenience functions for common patterns
  • Domain-specific helpers
  • Method chaining

Explainability

  • Query explanations (natural language)
  • Result statistics
  • Predicate tree visualization
  • Match/non-match explanations
  • Query comparison
  • Field distribution analysis

Design Highlights

Predicate Pattern

# Predicates are composable
bio = HierarchyMatches('domain', 'Science → Biology')
research = HierarchyMatches('intent', 'Research')

# Combine with operators
combined = bio & research  # AND
either = bio | research    # OR
not_bio = ~bio            # NOT

Fluent Query Building

result = (QueryBuilder(index)
    .where_domain("Science → Biology", exact=False)
    .where_intent("Research", exact=False)
    .where_stability("Peer-reviewed")
    .order_by_created(descending=True)
    .limit(10)
    .execute())

Multiple APIs for Different Needs

# QueryBuilder - Full power
QueryBuilder(index).where_domain("Science").execute()

# Filter - Alternative fluent API
Filter().from_index(index).where_domain("Science").execute()

# Convenience functions - Quick common patterns
find_research_posts(items, domain="Science")

Usage Examples

Basic Query

from query import QueryBuilder

result = (QueryBuilder(index)
    .where_domain("Science → Biology")
    .execute())

print(f"Found {result.total} items")

Complex Query with AND Logic

result = (QueryBuilder(index)
    .where_domain("Science → Biology", exact=False)
    .where_intent("Research", exact=False)
    .where_stability("Peer-reviewed")
    .where_audience("Researchers")
    .execute())

OR Logic

from query import FieldEquals, HierarchyMatches

tutorial = HierarchyMatches('intent', 'Documentation → Tutorial')
beginner = FieldEquals('audience', 'Beginners')

result = (QueryBuilder(index)
    .or_where(tutorial, beginner)
    .execute())

Text Search

result = (QueryBuilder(index)
    .where_text_contains("machine learning", case_sensitive=False)
    .where_domain("Science → Computer Science", exact=False)
    .execute())

Sorting and Pagination

# Get 10 most recent items
result = (QueryBuilder(index)
    .order_by_created(descending=True)
    .limit(10)
    .execute())

# Page 2 (items 11-20)
result = (QueryBuilder(index)
    .order_by_created(descending=True)
    .offset(10)
    .limit(10)
    .execute())

Custom Predicates

def long_text(item):
    return len(item.text) > 1000

result = (QueryBuilder(index)
    .where_custom(long_text, "text length > 1000")
    .execute())

Query Explanation

from query import QueryExplainer

result = (QueryBuilder(index)
    .where_domain("Science")
    .where_intent("Research")
    .execute())

explainer = QueryExplainer(result)
print(explainer.detailed())  # Full analysis
print(explainer.items())     # Item summaries

Advanced Features

Predicate Composition

# Manual composition
from query import AndPredicate, OrPredicate, NotPredicate

bio = HierarchyMatches('domain', 'Science → Biology')
physics = HierarchyMatches('domain', 'Science → Physics')
research = HierarchyMatches('intent', 'Research')

# (Bio OR Physics) AND Research
science = OrPredicate(bio, physics)
query = AndPredicate(science, research)

result = QueryBuilder(index).where(query).execute()

Hierarchy Depth Filtering

from query import HierarchyDepth

# Find items with specific hierarchy depth
result = (QueryBuilder(index)
    .where(HierarchyDepth('domain', min_depth=2, max_depth=3))
    .execute())

Timestamp Filtering

from datetime import datetime, timedelta

yesterday = datetime.now() - timedelta(days=1)

result = (QueryBuilder(index)
    .where_created_after(yesterday)
    .order_by_created(descending=True)
    .execute())

Metadata Queries

# Find by author
result = (QueryBuilder(index)
    .where_metadata('author', 'Dr. Smith')
    .execute())

# Check if metadata exists
result = (QueryBuilder(index)
    .where_metadata_exists('doi')
    .execute())

Query Cloning

# Create base query
base = (QueryBuilder(index)
    .where_domain("Science")
    .where_intent("Research"))

# Clone and specialize
biology = base.clone().where_domain("Science → Biology")
physics = base.clone().where_domain("Science → Physics")

Explainability Examples

Query Explanation

result = (QueryBuilder(index)
    .where_domain("Science → Biology")
    .where_stability("Peer-reviewed")
    .execute())

print(result.query_explanation)
# "SELECT items WHERE (domain under 'Science → Biology' 
#  AND stability = 'Peer-reviewed')"

Why an Item Matched

from query import explain_why_matched

item = result.items[0]
predicate = builder.build_predicate()

explanation = explain_why_matched(item, predicate)
print(explanation)
# "Item abc123 matched because:
#   All of the following were true:
#     • domain = 'Science → Biology → Systems Biology' 
#       (matched hierarchy 'Science → Biology')
#     • stability = 'Peer-reviewed' 
#       (matched 'Peer-reviewed')"

Result Statistics

from query import QueryExplainer

explainer = QueryExplainer(result)
stats = explainer.statistics()

print(stats)
# {
#   'total': 5,
#   'returned': 5,
#   'query': '...',
#   'field_distribution': {
#     'domain': Counter({'Science → Biology': 3, ...}),
#     'intent': Counter({'Research → Empirical': 2, ...})
#   }
# }

Predicate Tree Visualization

from query import explain_predicate_tree

combined = (bio_pred & research_pred) | tutorial_pred

print(explain_predicate_tree(combined))
# OR:
#   AND:
#     • domain under 'Science → Biology'
#     • intent under 'Research'
#   • intent = 'Documentation → Tutorial'

Convenience Functions

from query import (
    find_research_posts,
    find_tutorials,
    find_by_author,
    find_recent,
    search_text,
)

# Find research posts in biology
research = find_research_posts(
    items, 
    domain="Science → Biology",
    stability="Peer-reviewed"
)

# Find tutorials
tutorials = find_tutorials(items, domain="Engineering")

# Find by author
smith_posts = find_by_author(items, "Dr. Smith")

# Find recent items
recent = find_recent(items, since=yesterday)

# Search text
ai_posts = search_text(items, "artificial intelligence")

Integration Points

With Core Module

  • Uses semantic descriptors for querying
  • Hierarchy-aware via core normalization
  • Respects semantic field structure

With Indexer Module

  • Queries TextIndex directly
  • Works with IndexedText objects
  • Leverages metadata system

Future API Layer

  • QueryBuilder serializable to JSON
  • Query explanations suitable for HTTP responses
  • Result pagination ready for REST APIs

Performance Characteristics

Query Execution

  • Linear scan: O(n) where n = number of items
  • Predicate evaluation: O(1) per item
  • Sorting: O(n log n) when ordering
  • Filtering: No intermediate allocations

Optimization Opportunities

  • Index-based lookups (future)
  • Predicate short-circuiting (implemented)
  • Lazy evaluation (implemented)
  • Query result caching (future)

Scalability Notes

  • Current: Optimized for 10K-100K items
  • Predicates are lightweight and composable
  • Explanation overhead is minimal
  • Memory efficient (no duplication)

Quality Highlights

  • Fluent, chainable API
  • Type-safe predicates
  • Composable with operators
  • Human-readable explanations
  • Multiple API styles
  • Zero external dependencies
  • Comprehensive docstrings
  • 12 usage examples
  • Explainability first
  • Custom predicate support

Philosophy Alignment

This implementation embodies the project's core values:

Clarity over Cleverness

  • Explicit predicate classes
  • Clear method names
  • Obvious behavior

Explainability

  • Every query can be explained
  • Match/non-match reasons provided
  • Predicate tree visualization

Meaning over Manipulation

  • Queries based on semantic meaning
  • No hidden scoring algorithms
  • Transparent filtering

Non-Hostile UX

  • Multiple API styles for different preferences
  • Helpful error messages
  • Educational explanations

Use Cases

Research Platforms

# Find cautious, early-stage research
result = (QueryBuilder(index)
    .where_domain("Science", exact=False)
    .where_intent("Research → Conceptual → Early-stage")
    .where_tone("Analytical / Cautious")
    .where_stability("Hypothesis")
    .execute())

Developer Forums

# Find answered questions
result = (QueryBuilder(index)
    .where_intent("Discussion → Question")
    .where_metadata_exists('accepted_answer')
    .execute())

Knowledge Bases

# Find validated documentation
result = (QueryBuilder(index)
    .where_intent("Documentation", exact=False)
    .where_stability("Validated")
    .order_by_updated(descending=True)
    .execute())

Status: Query module complete and production-ready

Dependencies: Core module, Indexer module
Ready for: API development, production use, advanced applications