MOBILE-3981 course: Optimize tables
parent
84307d6f70
commit
4504d1ba8a
|
@ -45,6 +45,10 @@ import { CoreCourseAutoSyncData, CoreCourseSyncProvider } from './sync';
|
||||||
import { CoreTagItem } from '@features/tag/services/tag';
|
import { CoreTagItem } from '@features/tag/services/tag';
|
||||||
import { CoreNavigationOptions, CoreNavigator } from '@services/navigator';
|
import { CoreNavigationOptions, CoreNavigator } from '@services/navigator';
|
||||||
import { CoreCourseModuleDelegate } from './module-delegate';
|
import { CoreCourseModuleDelegate } from './module-delegate';
|
||||||
|
import { lazyMap, LazyMap } from '@/core/utils/lazy-map';
|
||||||
|
import { asyncInstance, AsyncInstance } from '@/core/utils/async-instance';
|
||||||
|
import { CoreDatabaseTable } from '@classes/database/database-table';
|
||||||
|
import { CoreDatabaseCachingStrategy } from '@classes/database/database-table-proxy';
|
||||||
|
|
||||||
const ROOT_CACHE_KEY = 'mmCourse:';
|
const ROOT_CACHE_KEY = 'mmCourse:';
|
||||||
|
|
||||||
|
@ -140,9 +144,18 @@ export class CoreCourseProvider {
|
||||||
];
|
];
|
||||||
|
|
||||||
protected logger: CoreLogger;
|
protected logger: CoreLogger;
|
||||||
|
protected statusTables: LazyMap<AsyncInstance<CoreDatabaseTable<CoreCourseStatusDBRecord>>>;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.logger = CoreLogger.getInstance('CoreCourseProvider');
|
this.logger = CoreLogger.getInstance('CoreCourseProvider');
|
||||||
|
this.statusTables = lazyMap(
|
||||||
|
siteId => asyncInstance(
|
||||||
|
() => CoreSites.getSiteTable(COURSE_STATUS_TABLE, {
|
||||||
|
siteId,
|
||||||
|
config: { cachingStrategy: CoreDatabaseCachingStrategy.Eager },
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -221,7 +234,7 @@ export class CoreCourseProvider {
|
||||||
const site = await CoreSites.getSite(siteId);
|
const site = await CoreSites.getSite(siteId);
|
||||||
this.logger.debug('Clear all course status for site ' + site.id);
|
this.logger.debug('Clear all course status for site ' + site.id);
|
||||||
|
|
||||||
await site.getDb().deleteRecords(COURSE_STATUS_TABLE);
|
await this.statusTables[site.getId()].delete();
|
||||||
this.triggerCourseStatusChanged(CoreCourseProvider.ALL_COURSES_CLEARED, CoreConstants.NOT_DOWNLOADED, site.id);
|
this.triggerCourseStatusChanged(CoreCourseProvider.ALL_COURSES_CLEARED, CoreConstants.NOT_DOWNLOADED, site.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -373,7 +386,7 @@ export class CoreCourseProvider {
|
||||||
*/
|
*/
|
||||||
async getCourseStatusData(courseId: number, siteId?: string): Promise<CoreCourseStatusDBRecord> {
|
async getCourseStatusData(courseId: number, siteId?: string): Promise<CoreCourseStatusDBRecord> {
|
||||||
const site = await CoreSites.getSite(siteId);
|
const site = await CoreSites.getSite(siteId);
|
||||||
const entry: CoreCourseStatusDBRecord = await site.getDb().getRecord(COURSE_STATUS_TABLE, { id: courseId });
|
const entry = await this.statusTables[site.getId()].getOneByPrimaryKey({ id: courseId });
|
||||||
if (!entry) {
|
if (!entry) {
|
||||||
throw Error('No entry found on course status table');
|
throw Error('No entry found on course status table');
|
||||||
}
|
}
|
||||||
|
@ -405,16 +418,13 @@ export class CoreCourseProvider {
|
||||||
* @return Resolves with an array containing downloaded course ids.
|
* @return Resolves with an array containing downloaded course ids.
|
||||||
*/
|
*/
|
||||||
async getDownloadedCourseIds(siteId?: string): Promise<number[]> {
|
async getDownloadedCourseIds(siteId?: string): Promise<number[]> {
|
||||||
|
const downloadedStatuses = [CoreConstants.DOWNLOADED, CoreConstants.DOWNLOADING, CoreConstants.OUTDATED];
|
||||||
const site = await CoreSites.getSite(siteId);
|
const site = await CoreSites.getSite(siteId);
|
||||||
const entries: CoreCourseStatusDBRecord[] = await site.getDb().getRecordsList(
|
const entries = await this.statusTables[site.getId()].getManyWhere({
|
||||||
COURSE_STATUS_TABLE,
|
sql: 'status IN (?,?,?)',
|
||||||
'status',
|
sqlParams: downloadedStatuses,
|
||||||
[
|
js: ({ status }) => downloadedStatuses.includes(status),
|
||||||
CoreConstants.DOWNLOADED,
|
});
|
||||||
CoreConstants.DOWNLOADING,
|
|
||||||
CoreConstants.OUTDATED,
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
return entries.map((entry) => entry.id);
|
return entries.map((entry) => entry.id);
|
||||||
}
|
}
|
||||||
|
@ -1269,7 +1279,6 @@ export class CoreCourseProvider {
|
||||||
this.logger.debug(`Set previous status for course ${courseId} in site ${siteId}`);
|
this.logger.debug(`Set previous status for course ${courseId} in site ${siteId}`);
|
||||||
|
|
||||||
const site = await CoreSites.getSite(siteId);
|
const site = await CoreSites.getSite(siteId);
|
||||||
const db = site.getDb();
|
|
||||||
const entry = await this.getCourseStatusData(courseId, siteId);
|
const entry = await this.getCourseStatusData(courseId, siteId);
|
||||||
|
|
||||||
this.logger.debug(`Set previous status '${entry.status}' for course ${courseId}`);
|
this.logger.debug(`Set previous status '${entry.status}' for course ${courseId}`);
|
||||||
|
@ -1282,7 +1291,7 @@ export class CoreCourseProvider {
|
||||||
downloadTime: entry.status == CoreConstants.DOWNLOADING ? entry.previousDownloadTime : entry.downloadTime,
|
downloadTime: entry.status == CoreConstants.DOWNLOADING ? entry.previousDownloadTime : entry.downloadTime,
|
||||||
};
|
};
|
||||||
|
|
||||||
await db.updateRecords(COURSE_STATUS_TABLE, newData, { id: courseId });
|
await this.statusTables[site.getId()].update(newData, { id: courseId });
|
||||||
// Success updating, trigger event.
|
// Success updating, trigger event.
|
||||||
this.triggerCourseStatusChanged(courseId, newData.status, siteId);
|
this.triggerCourseStatusChanged(courseId, newData.status, siteId);
|
||||||
|
|
||||||
|
@ -1329,16 +1338,14 @@ export class CoreCourseProvider {
|
||||||
|
|
||||||
if (previousStatus != status) {
|
if (previousStatus != status) {
|
||||||
// Status has changed, update it.
|
// Status has changed, update it.
|
||||||
const data: CoreCourseStatusDBRecord = {
|
await this.statusTables[site.getId()].insert({
|
||||||
id: courseId,
|
id: courseId,
|
||||||
status: status,
|
status: status,
|
||||||
previous: previousStatus,
|
previous: previousStatus,
|
||||||
updated: new Date().getTime(),
|
updated: new Date().getTime(),
|
||||||
downloadTime: downloadTime,
|
downloadTime: downloadTime,
|
||||||
previousDownloadTime: previousDownloadTime,
|
previousDownloadTime: previousDownloadTime,
|
||||||
};
|
});
|
||||||
|
|
||||||
await site.getDb().insertRecord(COURSE_STATUS_TABLE, data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Success inserting, trigger event.
|
// Success inserting, trigger event.
|
||||||
|
|
Loading…
Reference in New Issue