Logo
NeoArc Studio

Multi-Domain Projections

Every model property carries three independent projection configurations: persistence (how it is stored), search (how it is indexed), and API (how it is exposed). Each domain sees the same property through its own lens, controlled by profiles, without duplicating the definition.

A property in a data model does not exist in isolation. It has a physical representation in a database column, a search representation in an index field, and a public representation in an API contract. In most organisations, these three representations are defined separately by different teams using different tools. The database team writes DDL. The search team writes index mappings. The API team writes OpenAPI specs. Each definition is a copy, and each copy can drift from the others.

NeoArc eliminates this duplication by giving every model property three independent projection configurations. The property is defined once. Each domain reads it through its own projection lens. Profiles control how abstract types, naming conventions, and domain-specific behaviours are resolved. The result is three consistent outputs from one source of truth.

The Three Projections

The property table editor in NeoArc Studio offers four lens modes. The schema lens shows the base definition. The other three show how that definition projects into each domain.

Persistence Projection
Controls whether a property is included in the physical data store. Configures the column name (via database profile naming convention) and column type (via abstract-to-concrete type mapping). A property can be excluded from persistence entirely if it is computed at query time.
Search Projection
Configures search behaviours per property: searchable, filterable, sortable, facetable, retrievable, highlightable, and aggregatable. Includes analyser, normaliser, synonym map, language, boost factor, and vector search settings (dimensions, similarity metric). Per-profile overrides allow different search engines to use different analysers.
API Projection
Defines the API-layer representation: field name override, inclusion flag, and read-only status. The API serialisation profile controls the naming convention (camelCase, snake_case, PascalCase), date format (ISO 8601, Unix timestamp), and enum style (string, numeric).

How Projections Work

Concrete Example

Consider a createdDate property on a Customer entity with abstract type datetime.

DomainProfile AppliedResolved Output
Persistence (SQL Server)Database profile: SQL ServerColumn: created_date, Type: DATETIME2, Nullable: false
Persistence (PostgreSQL)Database profile: PostgreSQLColumn: created_date, Type: TIMESTAMPTZ, Nullable: false
Search (Elasticsearch)Search profile: ElasticsearchField: createdDate, Type: date, Format: strict_date_optional_time, Sortable: yes
Search (Azure Cognitive Search)Search profile: Azure Cognitive SearchField: createdDate, Type: Edm.DateTimeOffset, Filterable: yes, Sortable: yes
API (Public REST)API serialisation profile: camelCase + ISO 8601Field: createdDate, Format: 2026-03-05T00:00:00Z
API (Internal Batch)API serialisation profile: snake_case + UnixField: created_date, Format: 1772006400

All six outputs derive from the same property. If the property is renamed, all six update. If the type is changed from datetime to date, each profile resolves the new abstract type to its domain-specific concrete type automatically.

Search Projection Details

The search projection is the richest of the three, reflecting the complexity of search index configuration.

CategorySettingsPurpose
Query Behaviourssearchable, filterable, sortable, facetable, retrievable, highlightable, aggregatable, scoring enabledControls how the field participates in different query operations
Text Analysisanalyser, index analyser, search analyser, normaliser, synonym map, languageConfigures tokenisation, stemming, and linguistic processing
Vector Searchdimensions, vector search profile, similarity metric (cosine, dot product, L2 norm)Enables vector similarity search for embeddings and semantic search
Storage and Performancestored, docValues, index enabled, norms, null value, term vector, nested flagFine-grained control over index storage and performance trade-offs
Sub-Fieldsmulti-field configuration with independent analysersAllows a single property to be indexed multiple ways (e.g., keyword and full-text)
Per-Profile Overridesprofile-specific analyser, normaliser, and type overridesDifferent search engines can use different analysis chains for the same property

Intent Graph Integration

Each projection creates typed edges in the Architectural Intent Graph, enabling field-level traceability across all domains.

Edge TypeFromToMetadata
projects-to-dbModel propertyPersistence projection nodeColumn name, column type
projects-to-searchModel propertySearch projection nodeField name, search field type, key flag, search behaviours, analyser
projects-to-apiModel propertyAPI projection nodeField name, read-only flag

Unprojected Properties

Not every property needs to appear in every domain. A property might be stored in the database but excluded from the API (internal audit fields). A property might be exposed in the API but not indexed in search (large text fields). A property might exist only in search (computed relevance scores).

The Intent Graph service provides getUnprojectedProperties(entityId, domain, allPropertyIds) which identifies properties that are not projected to a specific domain. This is used by coverage reports to highlight potential gaps where a property exists in the model but has not been configured for a particular output channel.