MOBILE-3977 config: Add database optimizations
This commit is contained in:
		
							parent
							
								
									effe53807a
								
							
						
					
					
						commit
						a65919debc
					
				| @ -12,8 +12,11 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { CoreConstants } from '@/core/constants'; | ||||
| import { CorePromisedValue } from '@classes/promised-value'; | ||||
| import { SQLiteDB, SQLiteDBRecordValues } from '@classes/sqlitedb'; | ||||
| import { CoreConfigProvider } from '@services/config'; | ||||
| import { CoreEventObserver, CoreEvents } from '@singletons/events'; | ||||
| import { CoreDatabaseReducer, CoreDatabaseTable, CoreDatabaseConditions, GetDBRecordPrimaryKey } from './database-table'; | ||||
| import { CoreEagerDatabaseTable } from './eager-database-table'; | ||||
| import { CoreLazyDatabaseTable } from './lazy-database-table'; | ||||
| @ -31,6 +34,7 @@ export class CoreDatabaseTableProxy< | ||||
| 
 | ||||
|     protected config: CoreDatabaseConfiguration; | ||||
|     protected target: CorePromisedValue<CoreDatabaseTable<DBRecord, PrimaryKeyColumn>> = new CorePromisedValue(); | ||||
|     protected environmentObserver?: CoreEventObserver; | ||||
| 
 | ||||
|     constructor( | ||||
|         config: Partial<CoreDatabaseConfiguration>, | ||||
| @ -47,11 +51,16 @@ export class CoreDatabaseTableProxy< | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     async initialize(): Promise<void> { | ||||
|         const target = this.createTarget(); | ||||
|         this.environmentObserver = CoreEvents.on(CoreConfigProvider.ENVIRONMENT_UPDATED, () => this.updateTarget()); | ||||
| 
 | ||||
|         await target.initialize(); | ||||
|         await this.updateTarget(); | ||||
|     } | ||||
| 
 | ||||
|         this.target.resolve(target); | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     async destroy(): Promise<void> { | ||||
|         this.environmentObserver?.off(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -146,13 +155,46 @@ export class CoreDatabaseTableProxy< | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get database configuration to use at runtime. | ||||
|      * | ||||
|      * @returns Database configuration. | ||||
|      */ | ||||
|     protected getRuntimeConfig(): CoreDatabaseConfiguration { | ||||
|         return { | ||||
|             ...this.config, | ||||
|             ...CoreConstants.CONFIG.databaseOptimizations, | ||||
|             ...CoreConstants.CONFIG.databaseTableOptimizations?.[this.tableName], | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Update underlying target instance. | ||||
|      */ | ||||
|     protected async updateTarget(): Promise<void> { | ||||
|         const oldTarget = this.target.value; | ||||
|         const newTarget = this.createTarget(); | ||||
| 
 | ||||
|         if (oldTarget) { | ||||
|             await oldTarget.destroy(); | ||||
| 
 | ||||
|             this.target.reset(); | ||||
|         } | ||||
| 
 | ||||
|         await newTarget.initialize(); | ||||
| 
 | ||||
|         this.target.resolve(newTarget); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Create proxy target. | ||||
|      * | ||||
|      * @returns Target instance. | ||||
|      */ | ||||
|     protected createTarget(): CoreDatabaseTable<DBRecord, PrimaryKeyColumn> { | ||||
|         return this.createTable(this.config.cachingStrategy); | ||||
|         const config = this.getRuntimeConfig(); | ||||
| 
 | ||||
|         return this.createTable(config.cachingStrategy); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -134,6 +134,16 @@ export class CorePromisedValue<T = unknown> implements Promise<T> { | ||||
|         this._reject(reason); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Reset status and value. | ||||
|      */ | ||||
|     reset(): void { | ||||
|         delete this._resolvedValue; | ||||
|         delete this._rejectedReason; | ||||
| 
 | ||||
|         this.initPromise(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Initialize the promise and the callbacks. | ||||
|      */ | ||||
|  | ||||
| @ -145,23 +145,6 @@ export class CoreConstants { | ||||
|     static readonly CONFIG = { ...envJson.config } as unknown as EnvironmentConfig; // Data parsed from config.json files.
 | ||||
|     static readonly BUILD = envJson.build as unknown as EnvironmentBuild; // Build info.
 | ||||
| 
 | ||||
|     /** | ||||
|      * Update config with the given values. | ||||
|      * | ||||
|      * @param config Config updates. | ||||
|      */ | ||||
|     static patchConfig(config: Partial<EnvironmentConfig>): void { | ||||
|         Object.assign(this.CONFIG, config); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Reset config values to its original state. | ||||
|      */ | ||||
|     static resetConfig(): void { | ||||
|         Object.keys(this.CONFIG).forEach(key => delete this.CONFIG[key]); | ||||
|         Object.assign(this.CONFIG, envJson.config); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| interface EnvironmentBuild { | ||||
|  | ||||
| @ -12,14 +12,30 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { EnvironmentConfig } from '@/types/config'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { CoreDatabaseCachingStrategy, CoreDatabaseTableProxy } from '@classes/database/database-table-proxy'; | ||||
| import { CoreApp } from '@services/app'; | ||||
| import { APP_SCHEMA, ConfigDBEntry, CONFIG_TABLE_NAME } from '@services/database/config'; | ||||
| import { makeSingleton } from '@singletons'; | ||||
| import { CoreConstants } from '../constants'; | ||||
| import { CoreEvents } from '@singletons/events'; | ||||
| import { CoreDatabaseTable } from '@classes/database/database-table'; | ||||
| import { CorePromisedValue } from '@classes/promised-value'; | ||||
| 
 | ||||
| declare module '@singletons/events' { | ||||
| 
 | ||||
|     /** | ||||
|      * Augment CoreEventsData interface with events specific to this service. | ||||
|      * | ||||
|      * @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
 | ||||
|      */ | ||||
|     export interface CoreEventsData { | ||||
|         [CoreConfigProvider.ENVIRONMENT_UPDATED]: EnvironmentConfig; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Factory to provide access to dynamic and permanent config and settings. | ||||
|  * It should not be abused into a temporary storage. | ||||
| @ -27,7 +43,10 @@ import { CorePromisedValue } from '@classes/promised-value'; | ||||
| @Injectable({ providedIn: 'root' }) | ||||
| export class CoreConfigProvider { | ||||
| 
 | ||||
|     static readonly ENVIRONMENT_UPDATED = 'environment_updated'; | ||||
| 
 | ||||
|     protected table: CorePromisedValue<CoreDatabaseTable<ConfigDBEntry, 'name'>> = new CorePromisedValue(); | ||||
|     protected defaultEnvironment?: EnvironmentConfig; | ||||
| 
 | ||||
|     /** | ||||
|      * Initialize database. | ||||
| @ -98,6 +117,33 @@ export class CoreConfigProvider { | ||||
|         await table.insert({ name, value }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Update config with the given values. | ||||
|      * | ||||
|      * @param config Config updates. | ||||
|      */ | ||||
|     patchEnvironment(config: Partial<EnvironmentConfig>): void { | ||||
|         this.defaultEnvironment = this.defaultEnvironment ?? CoreConstants.CONFIG; | ||||
| 
 | ||||
|         Object.assign(CoreConstants.CONFIG, config); | ||||
|         CoreEvents.trigger(CoreConfigProvider.ENVIRONMENT_UPDATED, CoreConstants.CONFIG); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Reset config values to its original state. | ||||
|      */ | ||||
|     resetEnvironment(): void { | ||||
|         if (!this.defaultEnvironment) { | ||||
|             // The environment config hasn't been modified; there's not need to reset.
 | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         Object.keys(CoreConstants.CONFIG).forEach(key => delete CoreConstants.CONFIG[key]); | ||||
|         Object.assign(CoreConstants.CONFIG, this.defaultEnvironment); | ||||
|         CoreEvents.trigger(CoreConfigProvider.ENVIRONMENT_UPDATED, CoreConstants.CONFIG); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| export const CoreConfig = makeSingleton(CoreConfigProvider); | ||||
|  | ||||
							
								
								
									
										3
									
								
								src/types/config.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/types/config.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -17,6 +17,7 @@ import { CoreMainMenuLocalizedCustomItem } from '@features/mainmenu/services/mai | ||||
| import { CoreSitesDemoSiteData } from '@services/sites'; | ||||
| import { OpenFileAction } from '@services/utils/utils'; | ||||
| import { CoreLoginSiteSelectorListMethod } from '@features/login/services/login-helper'; | ||||
| import { CoreDatabaseConfiguration } from '@classes/database/database-table-proxy'; | ||||
| 
 | ||||
| /* eslint-disable @typescript-eslint/naming-convention */ | ||||
| 
 | ||||
| @ -31,6 +32,8 @@ export interface EnvironmentConfig { | ||||
|     cache_update_frequency_rarely: number; | ||||
|     default_lang: string; | ||||
|     languages: Record<string, string>; | ||||
|     databaseOptimizations?: Partial<CoreDatabaseConfiguration>; | ||||
|     databaseTableOptimizations?: Record<string, Partial<CoreDatabaseConfiguration>>; | ||||
|     wsservice: string; | ||||
|     demo_sites: Record<string, CoreSitesDemoSiteData>; | ||||
|     zoomlevels: Record<CoreZoomLevel, number>; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user