3.7 KiB
3.7 KiB
SmartData Project Overview
This document provides a high-level overview of the SmartData library (@push.rocks/smartdata
), its architecture, core components, and key features—including recent enhancements to the search API.
1. Project Purpose
- A TypeScript‑first wrapper around MongoDB that supplies:
- Strongly‑typed document & collection classes
- Decorator‑based schema definition (no external schema files)
- Advanced search capabilities with Lucene‑style queries
- Built‑in support for real‑time data sync, distributed coordination, and key‑value EasyStore
2. Core Concepts & Components
- SmartDataDb: Manages the MongoDB connection, pooling, and initialization of collections.
- SmartDataDbDoc: Base class for all document models; provides CRUD, upsert, and cursor APIs.
- Decorators:
@Collection
: Associates a class with a MongoDB collection@svDb()
: Marks a field as persisted to the DB@unI()
: Marks a field as a unique index@index()
: Adds a regular index@searchable()
: Marks a field for inclusion in text searches or regex queries
- SmartdataCollection: Wraps a MongoDB collection; auto‑creates indexes based on decorators.
- Lucene Adapter: Parses a Lucene query string into an AST and transforms it to a MongoDB filter object.
- EasyStore: A simple, schema‑less key‑value store built on top of MongoDB for sharing ephemeral data.
- Distributed Coordinator: Leader election and task‑distribution API for building resilient, multi‑instance systems.
- Watcher: Listens to change streams for real‑time updates and integrates with RxJS.
3. Search API
SmartData provides a unified .search(query[, opts])
method on all models with @searchable()
fields:
-
Supported Syntax:
- Exact field:value (e.g.
field:Value
) - Quoted phrases (e.g.
"exact phrase"
or'exact phrase'
) - Wildcards:
*
(zero or more chars) and?
(single char) - Boolean operators:
AND
,OR
,NOT
- Grouping: parenthesis
(A OR B) AND C
- Range queries:
[num TO num]
,{num TO num}
- Multi‑term unquoted: terms AND’d across all searchable fields
- Empty query returns all documents
- Exact field:value (e.g.
-
Fallback Mechanisms:
- Text index based
$text
search (if supported) - Field‑scoped and multi‑field regex queries
- In‑memory filtering for complex or unsupported cases
- Text index based
New Security & Extensibility Hooks
The .search(query, opts?)
signature now accepts a SearchOptions<T>
object:
interface SearchOptions<T> {
filter?: Record<string, any>; // Additional MongoDB filter AND‑merged
validate?: (doc: T) => boolean; // Post‑fetch hook to drop results
}
- filter: Enforces mandatory constraints (e.g. multi‑tenant isolation) directly in the Mongo query.
- validate: An async function that runs after fetching; return
false
to exclude a document.
4. Testing Strategy
- Unit tests in
test/test.search.ts
cover basic search functionality and new options:- Exact, wildcard, phrase, boolean and grouping cases
- Implicit AND and mixed free‑term + field searches
- Edge cases (non‑searchable fields, quoted wildcards, no matches)
filter
andvalidate
tests ensure security hooks work as intended
- Advanced search scenarios are covered in
test/test.search.advanced.ts
.
5. Usage Example
// Basic search
const prods = await Product.search('wireless earbuds');
// Scoped search (only your organization’s items)
const myItems = await Product.search('book', { filter: { ownerId } });
// Post‑search validation (only cheap items)
const cheapItems = await Product.search('', { validate: p => p.price < 50 });
Last updated: 2025-04-22