How to handle missing References
Introduction​
In dcupl, managing references between models can be challenging, especially if data quality varies. There are several strategies to handle missing references, tailored to specific use cases or requirements.
Validity​
When dealing with references, you have the option to set their validity
as either strict
or loose
. With a loose reference, the value is retained even if the target is not found. On the other hand, a strict reference turns to undefined when its target is missing. The choice of validity should align with the needs of your application.
{
"key": "modelA",
"references": [
{
"key": "b_loose",
"model": "modelB",
"type": "singleValued",
"validity": "loose"
},
{
"key": "b_strict",
"model": "modelB",
"type": "singleValued",
"validity": "strict"
}
]
}
// if a.b_loose points to a missing reference the value of b_loose remains an object
{ "key": "a1", "b_loose": { "key": "some_missing_key" } }
// if a.b_strict points to a missing reference it's value is undefined
{ "key": "a1" } // b_strict is not present since it's undefined
Reference Metadata​
When you activate reference metadata in your project, dcupl enhances your references with an additional parameter. This parameter indicates the status of the reference as either a hit
, miss
, or auto_hit
(the latter denotes a successful reference generated from a "supportsAutogeneration" action). Utilizing reference metadata is particularly beneficial when working with loose references, as it provides clearer insights into the reference's resolution status.
const dcupl = new Dcupl({
referenceMetadata: {
enabled: true,
},
});
Using the same model as above the responses looks like this:
// if a.b_loose points to a missing reference the value of b_loose remains an object
[
{
"key": "a1",
"b_loose": { "key": "some_missing_key", "_dcupl_ref_": "miss" }
},
{
"key": "a2",
"b_loose": { "key": "valid_key", "_dcupl_ref_": "hit" }
},
]
An Example query for "missed References" might looks like this:
const q = dcupl.query.generate('modelA', {
attribute: 'b_loose',
operator: 'find',
value: { _dcupl_ref_: 'miss' },
});
const missing_b_Loose = dcupl.query.execute(q);