Convert to batch queries.

This commit is contained in:
Dermot Duffy
2023-01-24 19:36:54 -08:00
parent 92b75c4b1a
commit 04d3ca3f46
10 changed files with 600 additions and 345 deletions
+11 -4
View File
@@ -53,12 +53,15 @@ export const createViewForEvents = async (
? options.cameraIDs
: new Set(getAllDependentCameras(cameras, view.camera));
const queries = cameraManager.generateDefaultEventQueries(cameraIDs, {
const eventQueries = cameraManager.generateDefaultEventQueries(cameraIDs, {
...(options?.limit && { limit: options.limit }),
...(options?.mediaType === 'clips' && { hasClip: true }),
...(options?.mediaType === 'snapshots' && { hasSnapshot: true }),
});
query = new EventMediaQueries(queries);
if (!eventQueries) {
return null;
}
query = new EventMediaQueries(eventQueries);
}
let queryResults: MediaQueriesResults | null;
@@ -137,12 +140,16 @@ export const createViewForRecordings = async (
? options.cameraIDs
: new Set(getAllDependentCameras(cameras, view.camera));
const queries = cameraManager.generateDefaultRecordingQueries(cameraIDs, {
const recordingQueries = cameraManager.generateDefaultRecordingQueries(cameraIDs, {
...(options?.start && { start: options.start }),
...(options?.end && { end: options.end }),
});
const query = new RecordingMediaQueries(queries);
if (!recordingQueries) {
return null;
}
const query = new RecordingMediaQueries(recordingQueries);
let queryResults: MediaQueriesResults | null;
try {
+20 -16
View File
@@ -7,7 +7,7 @@ import { ClipsOrSnapshotsOrAll, RecordingSegment } from '../types';
import { CameraManager } from '../camera/manager';
import { EventQuery } from '../camera/types';
import { capEndDate, convertRangeToCacheFriendlyTimes } from '../camera/util';
import { EventMediaQueries } from "../view/media-queries";
import { EventMediaQueries } from '../view/media-queries';
import { ViewMedia } from '../view/media';
import { compressRanges, ExpiringMemoryRangeSet, MemoryRangeSet } from '../camera/range';
import { errorToConsole, ModifyInterface } from './basic.js';
@@ -85,10 +85,7 @@ export class TimelineDataSource {
}
}
public async refresh(
hass: HomeAssistant,
window: TimelineWindow,
): Promise<void> {
public async refresh(hass: HomeAssistant, window: TimelineWindow): Promise<void> {
try {
await Promise.all([
this._refreshEvents(hass, window),
@@ -110,7 +107,7 @@ export class TimelineDataSource {
});
}
public getTimelineEventQueries(window: TimelineWindow): EventQuery[] {
public getTimelineEventQueries(window: TimelineWindow): EventQuery[] | null {
return this._cameraManager.generateDefaultEventQueries(this._cameraIDs, {
start: window.start,
end: window.end,
@@ -135,9 +132,11 @@ export class TimelineDataSource {
}
const cacheFriendlyWindow = this.getCacheFriendlyEventWindow(window);
const query = new EventMediaQueries(
this.getTimelineEventQueries(cacheFriendlyWindow),
);
const eventQueries = this.getTimelineEventQueries(cacheFriendlyWindow)
if (!eventQueries) {
return;
}
const query = new EventMediaQueries(eventQueries);
const results = await this._cameraManager.executeMediaQueries(hass, query);
for (const media of results?.getResults() ?? []) {
@@ -224,7 +223,7 @@ export class TimelineDataSource {
endCap: true,
});
const queries = this._cameraManager.generateDefaultRecordingSegmentsQueries(
const recordingQueries = this._cameraManager.generateDefaultRecordingSegmentsQueries(
this._cameraIDs,
{
start: cacheFriendlyWindow.start,
@@ -232,16 +231,21 @@ export class TimelineDataSource {
},
);
const results = await this._cameraManager.getRecordingSegments(hass, queries);
if (!recordingQueries) {
return;
}
const results = await this._cameraManager.getRecordingSegments(hass, recordingQueries);
const newSegments: Map<string, RecordingSegment[]> = new Map();
for (const [query, result] of results) {
let destination: RecordingSegment[] | undefined = newSegments.get(query.cameraID);
if (!destination) {
destination = [];
newSegments.set(query.cameraID, destination);
for (const cameraID of query.cameraIDs) {
let destination: RecordingSegment[] | undefined = newSegments.get(cameraID);
if (!destination) {
destination = [];
newSegments.set(cameraID, destination);
}
result.segments.forEach((segment) => destination?.push(segment));
}
result.segments.forEach((segment) => destination?.push(segment));
}
for (const [cameraID, segments] of newSegments.entries()) {