@@ -295,6 +295,9 @@ component accessors="true" {
295295 setUpMementifier ();
296296 fireEvent ( " instanceReady" , { entity : this } );
297297 }
298+ for ( var key in retrieveAttributeNames ( withVirtualColumns = false ) ) {
299+ structDelete ( variables , key );
300+ }
298301 }
299302
300303 /**
@@ -2311,8 +2314,12 @@ component accessors="true" {
23112314 .addSelect ( retrieveQualifiedColumns () )
23122315 .with ( variables ._with );
23132316
2314- if ( variables ._meta .originalMetadata .keyExists ( " grammar" ) ) {
2315- newBuilder .setGrammar ( variables ._wirebox .getInstance ( variables ._meta .originalMetadata .grammar ) );
2317+ if ( hasMetadataAttribute ( " grammar" , variables ._meta .originalMetadata ) ) {
2318+ newBuilder .setGrammar (
2319+ variables ._wirebox .getInstance (
2320+ getMetadataAttribute ( key = " grammar" , metadata = variables ._meta .originalMetadata )
2321+ )
2322+ );
23162323 }
23172324
23182325 newBuilder .applyInheritanceJoins ();
@@ -2723,51 +2730,81 @@ component accessors="true" {
27232730
27242731 if ( ! isStruct ( variables ._meta ) || structIsEmpty ( variables ._meta ) ) {
27252732 variables ._meta = duplicate (
2726- variables ._cache .getOrSet ( " quick-metadata:#variables ._mapping #" , function () {
2733+ variables ._cache .getOrSet ( " quick-metadata:#variables ._mapping #_# createUUID () # " , function () {
27272734 var util = variables ._wirebox .getUtility ();
27282735 var meta = {};
27292736 meta [ " originalMetadata" ] = util .getInheritedMetadata ( this );
27302737 meta [ " localMetadata" ] = getMetadata ( this );
2731- if (
2732- ! meta [ " localMetadata" ].keyExists ( " accessors" ) ||
2733- meta [ " localMetadata" ].accessors == false
2734- ) {
2738+ var hasAccessorsEnabled = getMetadataAttribute (
2739+ " accessors" ,
2740+ false ,
2741+ meta .localMetadata
2742+ );
2743+ if ( ! hasAccessorsEnabled ) {
27352744 throw (
27362745 type = " QuickAccessorsMissing" ,
27372746 message = ' This instance is missing `accessors="true"` in the component metadata. This is required for Quick to work properly. Please add it to your component metadata and reinit your application.'
27382747 );
27392748 }
2740- meta [ " fullName" ] = meta .originalMetadata .fullname ;
2741- param meta .originalMetadata .mapping = listLast ( meta .originalMetadata .fullname , " ." );
2742- meta [ " mapping" ] = meta .originalMetadata .mapping ;
2743- param meta .originalMetadata .entityName = listLast ( meta .originalMetadata .name , " ." );
2744- meta [ " entityName" ] = meta .originalMetadata .entityName ;
2745- param meta .originalMetadata .table = variables ._str .plural ( variables ._str .snake ( meta .entityName ) );
2746- meta [ " table" ] = meta .originalMetadata .table ;
2747- param meta .originalMetadata .readonly = false ;
2748- meta [ " readonly" ] = meta .originalMetadata .readonly ;
2749- param meta .originalMetadata .joincolumn = " " ;
2750- param meta .originalMetadata .discriminatorValue = " " ;
2751- param meta .originalMetadata .singleTableInheritance = false ;
2752- param meta .originalMetadata .extends = " " ;
2753- param meta .originalMetadata .functions = [];
2754- meta [ " hasParentEntity" ] = !! len ( meta .originalMetadata .joincolumn );
2749+ meta [ " fullName" ] = getMetadataAttribute ( key = " fullname" , metadata = meta .originalMetadata );
2750+ meta [ " mapping" ] = getMetadataAttribute (
2751+ " mapping" ,
2752+ listLast ( meta .fullName , " ." ),
2753+ meta .originalMetadata
2754+ );
2755+ meta [ " entityName" ] = getMetadataAttribute (
2756+ " entityName" ,
2757+ listLast ( getMetadataAttribute ( key = " name" , metadata = meta .originalMetadata ), " ." ),
2758+ meta .originalMetadata
2759+ );
2760+ meta [ " table" ] = getMetadataAttribute (
2761+ " table" ,
2762+ variables ._str .plural ( variables ._str .snake ( meta .entityName ) ),
2763+ meta .originalMetadata
2764+ );
2765+ meta [ " readonly" ] = getMetadataAttribute (
2766+ " readonly" ,
2767+ false ,
2768+ meta .originalMetadata
2769+ );
2770+ meta [ " joinColumn" ] = getMetadataAttribute (
2771+ " joinColumn" ,
2772+ " " ,
2773+ meta .originalMetadata
2774+ );
2775+ meta [ " discriminatorValue" ] = getMetadataAttribute (
2776+ " discriminatorValue" ,
2777+ " " ,
2778+ meta .originalMetadata
2779+ );
2780+ meta [ " singleTableInheritance" ] = getMetadataAttribute (
2781+ " singleTableInheritance" ,
2782+ false ,
2783+ meta .originalMetadata
2784+ );
2785+ meta [ " extends" ] = getMetadataAttribute ( " extends" , " " , meta .originalMetadata );
2786+ meta [ " functions" ] = getMetadataAttribute (
2787+ " functions" ,
2788+ [],
2789+ meta .originalMetadata
2790+ );
2791+ meta [ " hasParentEntity" ] = !! len ( meta .joinColumn );
27552792 if ( meta .hasParentEntity ) {
27562793 var reference = variables ._wirebox .getInstance (
2757- name = meta .localMetadata .extends . fullName ,
2794+ name = getMetadataAttribute ( key = " fullName " , metadata = meta .localMetadata .extends ) ,
27582795 initArguments = { " meta" : {}, " shallow" : true }
27592796 );
27602797
27612798 meta [ " parentDefinition" ] = {
27622799 " meta" : reference .get_Meta (),
27632800 " key" : reference .keyNames ()[ 1 ],
2764- " joincolumn" : meta .originalMetadata . joincolumn
2801+ " joincolumn" : meta .joinColumn
27652802 };
27662803
2767- if ( len ( meta .originalMetadata . discriminatorValue ) ) {
2804+ if ( len ( meta .discriminatorValue ) ) {
27682805 try {
2769- var parentMeta = getComponentMetadata ( meta .parentDefinition .meta .fullName );
2770- meta .parentDefinition [ " discriminatorValue" ] = meta .originalMetadata . discriminatorValue ;
2806+ var parentMeta = util . getInheritedMetaData ( meta .parentDefinition .meta .fullName );
2807+ meta .parentDefinition [ " discriminatorValue" ] = meta .discriminatorValue ;
27712808 meta .parentDefinition [ " discriminatorColumn" ] = parentMeta .discriminatorColumn ;
27722809 } catch ( any e ) {
27732810 throw (
@@ -2781,7 +2818,7 @@ component accessors="true" {
27812818
27822819 var baseEntityFunctionNames = variables ._cache .getOrSet ( " quick-metadata:BaseEntity" , function () {
27832820 return arrayReduce (
2784- getComponentMetadata ( " quick.models.BaseEntity" ).functions ,
2821+ util . getInheritedMetaData ( " quick.models.BaseEntity" ).functions ,
27852822 function ( acc , func ) {
27862823 arguments .acc [ arguments .func .name ] = " " ;
27872824 return arguments .acc ;
@@ -2790,7 +2827,7 @@ component accessors="true" {
27902827 );
27912828 } );
27922829 meta [ " functionNames" ] = generateFunctionNameArray (
2793- from = meta .originalMetadata . functions ,
2830+ from = meta .functions ,
27942831 without = baseEntityFunctionNames
27952832 );
27962833
@@ -2799,8 +2836,13 @@ component accessors="true" {
27992836 meta [ " attributes" ] = generateAttributesFromProperties (
28002837 meta .hasParentEntity ? meta .localMetadata .properties : meta .originalMetadata .properties
28012838 );
2802- if ( structKeyExists ( meta .localMetadata , " discriminatorColumn" ) ) {
2803- meta .attributes [ meta .localMetaData .discriminatorColumn ] = paramAttribute ( { " name" : meta .localMetaData .discriminatorColumn } );
2839+ if ( hasMetadataAttribute ( " discriminatorColumn" , meta .localMetadata ) ) {
2840+ var discriminatorColumn = getMetadataAttribute (
2841+ key = " discriminatorColumn" ,
2842+ metadata = meta .localMetadata
2843+ );
2844+ meta .attributes [ discriminatorColumn ] = paramAttribute ( { " name" : discriminatorColumn } );
2845+ meta [ " discriminatorColumn" ] = discriminatorColumn ;
28042846 }
28052847 arrayWrap ( variables ._key ).each ( function ( key ) {
28062848 if ( ! meta .attributes .keyExists ( key ) ) {
@@ -2826,8 +2868,10 @@ component accessors="true" {
28262868 }
28272869
28282870 param variables ._queryOptions = {};
2829- if ( variables ._queryOptions .isEmpty () && variables ._meta .originalMetadata .keyExists ( " datasource" ) ) {
2830- variables ._queryOptions = { datasource : variables ._meta .originalMetadata .datasource };
2871+ if ( variables ._queryOptions .isEmpty () && hasMetadataAttribute ( " datasource" , variables ._meta .originalMetadata ) ) {
2872+ variables ._queryOptions = {
2873+ " datasource" : getMetadataAttribute ( key = " datasource" , metadata = variables ._meta .originalMetadata )
2874+ };
28312875 }
28322876 variables ._readonly = variables ._meta .readonly ;
28332877 explodeAttributesMetadata ( variables ._meta .attributes );
@@ -2925,6 +2969,15 @@ component accessors="true" {
29252969 * @return An attribute struct with all the keys needed.
29262970 */
29272971 private struct function paramAttribute ( required struct attr ) {
2972+ if ( arguments .attr .keyExists ( " annotations" ) ) {
2973+ structAppend (
2974+ arguments .attr ,
2975+ arguments .attr .annotations ,
2976+ true
2977+ );
2978+ structDelete ( arguments .attr , " annotations" );
2979+ }
2980+
29282981 param attr .column = arguments .attr .name ;
29292982 param attr .persistent = true ;
29302983 param attr .nullValue = " " ;
@@ -2972,11 +3025,11 @@ component accessors="true" {
29723025 }
29733026
29743027 public boolean function isDiscriminatedChild () {
2975- return hasParentEntity () && variables . _meta . localMetadata . keyExists ( " discriminatorValue" );
3028+ return hasParentEntity () && hasMetadataAttribute ( " discriminatorValue" , variables . _meta . localMetadata );
29763029 }
29773030
29783031 public boolean function isDiscriminatedParent () {
2979- return variables . _meta . localMetadata . keyExists ( " discriminatorColumn" )
3032+ return hasMetadataAttribute ( " discriminatorColumn" , variables . _meta . localMetadata )
29803033 && variables ._discriminators .len () > 0 ;
29813034 }
29823035
@@ -2996,13 +3049,13 @@ component accessors="true" {
29963049 // Can be ignored for singleTableInheritance since there's no join
29973050 if (
29983051 ! isSingleTableInheritance () && (
2999- ! structKeyExists ( childMeta , " joincolumn" ) ||
3000- ! structKeyExists ( childMeta , " discriminatorValue" )
3052+ ! hasMetadataAttribute ( " joincolumn" , childMeta ) ||
3053+ ! hasMetadataAttribute ( " discriminatorValue" , childMeta )
30013054 )
30023055 ) {
30033056 throw (
30043057 type = " QuickParentInstantiationException" ,
3005- message = " Failed to instantiate the parent entity [#variables ._meta .fullName #]. The discriminated child class [#childMeta . fullName #] did not contain either a `joinColumn` or `discriminatorValue` attribute"
3058+ message = " Failed to instantiate the parent entity [#variables ._meta .fullName #]. The discriminated child class [#getMetadataAttribute ( " fullName" , " [unknown] " , childMeta ) #] did not contain either a `joinColumn` or `discriminatorValue` attribute"
30063059 );
30073060 }
30083061 var childAttributes = childClass
@@ -3021,12 +3074,16 @@ component accessors="true" {
30213074 return ! arrayContainsNoCase ( localColumns , column );
30223075 } );
30233076
3024- acc [ childMeta .discriminatorValue ] = {
3025- " mapping" : childMeta .fullName ,
3026- " table" : ( childMeta .keyExists ( " table" ) ? childMeta .table : variables ._meta .table ),
3077+ acc [ getMetadataAttribute ( key = " discriminatorValue" , metadata = childMeta ) ] = {
3078+ " mapping" : getMetadataAttribute ( key = " fullName" , metadata = childMeta ),
3079+ " table" : getMetadataAttribute (
3080+ " table" ,
3081+ variables ._meta .table ,
3082+ childMeta
3083+ ),
30273084 " joincolumn" : (
3028- childMeta . keyExists ( " joinColumn" ) ? childClass .qualifyColumn (
3029- column = childMeta . joinColumn ,
3085+ hasMetadataAttribute ( " joinColumn" , childMeta ) ? childClass .qualifyColumn (
3086+ column = getMetadataAttribute ( key = " joinColumn" , metadata = childMeta ) ,
30303087 useParentLookup = false
30313088 ) : " "
30323089 ),
@@ -3221,7 +3278,7 @@ component accessors="true" {
32213278 private void function guardKeyHasNoDefaultValue ( required struct attributes ) {
32223279 for ( var key Name in keyNames () ) {
32233280 if ( attributes .keyExists ( key Name ) ) {
3224- if ( attributes [ key Name ].keyExists ( " default" ) ) {
3281+ if ( attributes [ key Name ].keyExists ( " default" ) && ! isNull ( attributes [ key Name ]. default ) ) {
32253282 throw (
32263283 type = " QuickEntityDefaultedKey" ,
32273284 message = " The key value [#key Name #] has a default value. Default values on keys prevents Quick from working as expected. Remove the default value to continue."
@@ -3621,7 +3678,36 @@ component accessors="true" {
36213678 * since the data for each sub entity originates from a single table
36223679 */
36233680 public boolean function isSingleTableInheritance () {
3624- return variables ._meta .originalMetadata .singleTableInheritance ;
3681+ return variables ._meta .singleTableInheritance ;
3682+ }
3683+
3684+ private boolean function hasMetadataAttribute (
3685+ required string key ,
3686+ struct metadata = variables ._meta .localMetadata
3687+ ) {
3688+ return arguments .metadata .keyExists ( arguments .key ) || (
3689+ arguments .metadata .keyExists ( " annotations" ) &&
3690+ arguments .metadata .annotations .keyExists ( arguments .key )
3691+ );
3692+ }
3693+
3694+ private any function getMetadataAttribute (
3695+ required string key ,
3696+ any defaultValue ,
3697+ struct metadata = variables ._meta .localMetadata
3698+ ) {
3699+ if ( arguments .metadata .keyExists ( " annotations" ) && arguments .metadata .annotations .keyExists ( arguments .key ) ) {
3700+ return arguments .metadata .annotations [ arguments .key ];
3701+ } else if ( arguments .metadata .keyExists ( arguments .key ) ) {
3702+ return arguments .metadata [ arguments .key ];
3703+ } else if ( ! isNull ( arguments .defaultValue ) ) {
3704+ return arguments .defaultValue ;
3705+ } else {
3706+ throw (
3707+ type = " MetadataAttributeNotFound" ,
3708+ message = " The metadata attribute [#arguments .key #] was not found."
3709+ );
3710+ }
36253711 }
36263712
36273713}
0 commit comments