Skip to main content

FieldMapping

Struct FieldMapping 

Source
pub struct FieldMapping {
    pub source: String,
    pub output: String,
    pub source_fallback: Option<String>,
    pub nested_typename: Option<String>,
    pub nested_fields: Option<Vec<FieldMapping>>,
    pub declared_scalar: bool,
}
Expand description

Field mapping for projection with alias support.

Fields§

§source: String

JSONB key name (source).

§output: String

Output key name (alias if different from source).

§source_fallback: Option<String>

Fallback stored key, tried when source is not present in the row.

Populated by every constructor from stored_key_candidates. It is not support for camelCase storage — a view exposes snake_case keys and columns, and the SQL projection generator has no fallback at all. It is there because this projector runs over two different maps: the raw stored document, whose keys are snake_case, and the output of jsonb_build_object, whose keys are the camelCase response names the SQL projection already emitted. One mapping has to read both.

Until #1271 this field had no producer anywhere in the workspace — its documented job was described and never performed, and the primary source was the declared name verbatim, so the raw-document case was simply unreadable.

§nested_typename: Option<String>

For nested object fields, the typename to add. This enables __typename to be added recursively to nested objects.

§nested_fields: Option<Vec<FieldMapping>>

Nested field mappings (for related objects).

§declared_scalar: bool

The schema positively declares this field a scalar (#1192).

Set by ProjectionMapper::with_declared_scalars, which is the only thing that knows. It gates the JSON-text re-parse below: a value the database handed back as a string is re-read as an object or an array when it parses as one, to recover a nested object the SQL side extracted with ->> — and the comment justifying that said scalar strings “won’t parse as Object/Array, so this is safe for all field types”. That premise is false for exactly the rows a text column full of serialized JSON exists to carry: an audit payload, a webhook body, an imported document. A field declared String was returned as the value its text encodes, so the response violated the schema the server publishes, per row, depending on whether that row’s text happened to parse.

Defaults to false — not known to be scalar — so a mapping built without schema knowledge keeps the recovery behaviour it had.

Implementations§

Source§

impl FieldMapping

Source

pub fn simple(name: impl Into<String>) -> Self

Create a simple field mapping (no alias).

name is the declared field name; the stored key it reads is derived by stored_key_candidates, not taken verbatim.

let mapping = FieldMapping::simple("fkUser");
assert_eq!(mapping.source, "fk_user");
assert_eq!(mapping.output, "fkUser");
Source

pub fn aliased(source: impl Into<String>, alias: impl Into<String>) -> Self

Create a field mapping with an alias.

source is the declared field name and alias the response key — the same split the SQL projection generator makes, where an aliased field myName: fullName reads data->>'full_name' and is emitted as myName (#418). The stored key is derived from source by stored_key_candidates.

Source

pub fn nested_object( name: impl Into<String>, typename: impl Into<String>, fields: Vec<FieldMapping>, ) -> Self

Create a field mapping for a nested object with its own typename.

§Example
// For a Post with nested author (User type)
let mapping = FieldMapping::nested_object("author", "User", vec![
    FieldMapping::simple("id"),
    FieldMapping::simple("name"),
]);
assert_eq!(mapping.source, "author");
Source

pub fn nested_object_aliased( source: impl Into<String>, alias: impl Into<String>, typename: impl Into<String>, fields: Vec<FieldMapping>, ) -> Self

Create an aliased nested object field.

Source

pub fn with_nested_typename(self, typename: impl Into<String>) -> Self

Set the typename for a nested object field.

Source

pub fn with_nested_fields(self, fields: Vec<FieldMapping>) -> Self

Set nested field mappings.

Source

pub fn lookup_in<'a>( &self, map: &'a Map<String, JsonValue>, ) -> Option<&'a JsonValue>

Read this field’s value out of a stored JSONB object.

The primary key first, then source_fallback — both resolved once at construction, so this stays allocation-free on the per-row path.

Trait Implementations§

Source§

impl Clone for FieldMapping

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FieldMapping

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more