@@ -68,7 +68,7 @@ export function createGraphDBModel(schema: GraphDBSchema, schemaOptions: SchemaO
6868 const internalKey2Option = new Map ( ) ;
6969
7070 // nested model information
71- const nestedType2Model = new Map ( ) ;
71+ const nestedType2Model = new Uri2ModelMap ( ) ;
7272
7373 for ( let [ key , options ] of Object . entries ( schema ) ) {
7474 // Map to our data structure with some predefined options
@@ -103,9 +103,6 @@ export function createGraphDBModel(schema: GraphDBSchema, schemaOptions: SchemaO
103103 else
104104 nestedType2Model . set ( SPARQL . getFullURI ( nestedRdfType ) , nestedModel ) ;
105105 }
106- for ( const [ innerKey , innerVal ] of nestedModel . nestedType2Model ?. entries ( ) || [ ] ) {
107- nestedType2Model . set ( innerKey , innerVal ) ;
108- }
109106
110107 }
111108 }
@@ -131,4 +128,39 @@ function getGraphDBModel(name: string) {
131128 return store [ `:${ name } ` ] ;
132129}
133130
131+ class Uri2ModelMap {
132+ private map = new Map < string , GraphDBModel > ( ) ;
133+
134+ /**
135+ * Recursively find the model by URI.
136+ */
137+ public get ( uri : string , iterated = new Set ( ) ) {
138+ if ( iterated . has ( this ) ) {
139+ return ;
140+ }
141+ iterated . add ( this ) ;
142+
143+ if ( this . map . has ( uri ) ) {
144+ return this . map . get ( uri ) ;
145+ } else {
146+ return this . _getFromNestedModels ( uri , iterated ) ;
147+ }
148+ }
149+
150+ public set ( uri : string , model : GraphDBModel ) {
151+ this . map . set ( uri , model ) ;
152+ }
153+
154+ private _getFromNestedModels ( uri : string , iterated = new Set ( ) ) {
155+ for ( const nestedModel of this . map . values ( ) ) {
156+ const nestedResult = nestedModel . nestedType2Model . get ( uri , iterated ) ;
157+ if ( nestedResult ) {
158+ return nestedResult ;
159+ }
160+ }
161+ return undefined ;
162+ }
163+ }
164+
165+
134166module . exports = { Types, DeleteType, regexBuilder, createGraphDBModel, getGraphDBModel}
0 commit comments