mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-14 23:25:25 +03:00
Simplify similarity searching
This commit is contained in:
parent
b58e3fdf9b
commit
ecbc2f1a14
@ -3,12 +3,7 @@ import { useCameraPreviews } from "@/hooks/use-camera-previews";
|
|||||||
import { useOverlayState, useSearchEffect } from "@/hooks/use-overlay-state";
|
import { useOverlayState, useSearchEffect } from "@/hooks/use-overlay-state";
|
||||||
import { FrigateConfig } from "@/types/frigateConfig";
|
import { FrigateConfig } from "@/types/frigateConfig";
|
||||||
import { RecordingStartingPoint } from "@/types/record";
|
import { RecordingStartingPoint } from "@/types/record";
|
||||||
import {
|
import { SearchFilter, SearchResult } from "@/types/search";
|
||||||
PartialSearchResult,
|
|
||||||
SearchFilter,
|
|
||||||
SearchResult,
|
|
||||||
SearchSource,
|
|
||||||
} from "@/types/search";
|
|
||||||
import { TimeRange } from "@/types/timeline";
|
import { TimeRange } from "@/types/timeline";
|
||||||
import { RecordingView } from "@/views/recording/RecordingView";
|
import { RecordingView } from "@/views/recording/RecordingView";
|
||||||
import SearchView from "@/views/search/SearchView";
|
import SearchView from "@/views/search/SearchView";
|
||||||
@ -31,62 +26,26 @@ export default function Explore() {
|
|||||||
|
|
||||||
// search filter
|
// search filter
|
||||||
|
|
||||||
const [similaritySearch, setSimilaritySearch] =
|
const similaritySearch = useMemo(() => {
|
||||||
useState<PartialSearchResult>();
|
if (!searchTerm.includes("similarity:")) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return searchTerm.split(":")[1];
|
||||||
|
}, [searchTerm]);
|
||||||
|
|
||||||
const [searchFilter, setSearchFilter, searchSearchParams] =
|
const [searchFilter, setSearchFilter, searchSearchParams] =
|
||||||
useApiFilterArgs<SearchFilter>();
|
useApiFilterArgs<SearchFilter>();
|
||||||
|
|
||||||
const onUpdateFilter = useCallback(
|
|
||||||
(newFilter: SearchFilter) => {
|
|
||||||
setSearchFilter(newFilter);
|
|
||||||
|
|
||||||
if (similaritySearch && !newFilter.search_type?.includes("similarity")) {
|
|
||||||
setSimilaritySearch(undefined);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[similaritySearch, setSearchFilter],
|
|
||||||
);
|
|
||||||
|
|
||||||
// search api
|
// search api
|
||||||
|
|
||||||
const updateFilterWithSimilarity = useCallback(
|
|
||||||
(similaritySearch: PartialSearchResult) => {
|
|
||||||
let newFilter = searchFilter;
|
|
||||||
setSimilaritySearch(similaritySearch);
|
|
||||||
if (similaritySearch) {
|
|
||||||
newFilter = {
|
|
||||||
...searchFilter,
|
|
||||||
// @ts-expect-error we want to set this
|
|
||||||
similarity_search_id: undefined,
|
|
||||||
search_type: ["similarity"] as SearchSource[],
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
if (searchFilter?.search_type?.includes("similarity" as SearchSource)) {
|
|
||||||
newFilter = {
|
|
||||||
...searchFilter,
|
|
||||||
// @ts-expect-error we want to set this
|
|
||||||
similarity_search_id: undefined,
|
|
||||||
search_type: undefined,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (newFilter) {
|
|
||||||
setSearchFilter(newFilter);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[searchFilter, setSearchFilter],
|
|
||||||
);
|
|
||||||
|
|
||||||
useSearchEffect("similarity_search_id", (similarityId) => {
|
useSearchEffect("similarity_search_id", (similarityId) => {
|
||||||
updateFilterWithSimilarity({ id: similarityId });
|
setSearch(similarityId);
|
||||||
|
// @ts-expect-error we want to clear this
|
||||||
|
setSearchFilter({ ...searchFilter, similarity_search_id: undefined });
|
||||||
});
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (similaritySearch) {
|
|
||||||
setSimilaritySearch(undefined);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (searchTimeout) {
|
if (searchTimeout) {
|
||||||
clearTimeout(searchTimeout);
|
clearTimeout(searchTimeout);
|
||||||
}
|
}
|
||||||
@ -106,7 +65,7 @@ export default function Explore() {
|
|||||||
return [
|
return [
|
||||||
"events/search",
|
"events/search",
|
||||||
{
|
{
|
||||||
query: similaritySearch.id,
|
query: similaritySearch,
|
||||||
cameras: searchSearchParams["cameras"],
|
cameras: searchSearchParams["cameras"],
|
||||||
labels: searchSearchParams["labels"],
|
labels: searchSearchParams["labels"],
|
||||||
sub_labels: searchSearchParams["subLabels"],
|
sub_labels: searchSearchParams["subLabels"],
|
||||||
@ -241,7 +200,7 @@ export default function Explore() {
|
|||||||
allCameras={selectedReviewData.allCameras}
|
allCameras={selectedReviewData.allCameras}
|
||||||
allPreviews={allPreviews}
|
allPreviews={allPreviews}
|
||||||
timeRange={selectedTimeRange}
|
timeRange={selectedTimeRange}
|
||||||
updateFilter={onUpdateFilter}
|
updateFilter={setSearchFilter}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -254,9 +213,8 @@ export default function Explore() {
|
|||||||
searchResults={searchResults}
|
searchResults={searchResults}
|
||||||
isLoading={isLoading}
|
isLoading={isLoading}
|
||||||
setSearch={setSearch}
|
setSearch={setSearch}
|
||||||
similaritySearch={similaritySearch}
|
setSimilaritySearch={(search) => setSearch(`similarity:${search.id}`)}
|
||||||
setSimilaritySearch={updateFilterWithSimilarity}
|
onUpdateFilter={setSearchFilter}
|
||||||
onUpdateFilter={onUpdateFilter}
|
|
||||||
onOpenSearch={onOpenSearch}
|
onOpenSearch={onOpenSearch}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -28,8 +28,6 @@ export type SearchResult = {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export type PartialSearchResult = Partial<SearchResult> & { id: string };
|
|
||||||
|
|
||||||
export type SearchFilter = {
|
export type SearchFilter = {
|
||||||
cameras?: string[];
|
cameras?: string[];
|
||||||
labels?: string[];
|
labels?: string[];
|
||||||
|
|||||||
@ -12,11 +12,7 @@ import {
|
|||||||
} from "@/components/ui/tooltip";
|
} from "@/components/ui/tooltip";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { FrigateConfig } from "@/types/frigateConfig";
|
import { FrigateConfig } from "@/types/frigateConfig";
|
||||||
import {
|
import { SearchFilter, SearchResult } from "@/types/search";
|
||||||
PartialSearchResult,
|
|
||||||
SearchFilter,
|
|
||||||
SearchResult,
|
|
||||||
} from "@/types/search";
|
|
||||||
import { useCallback, useMemo, useState } from "react";
|
import { useCallback, useMemo, useState } from "react";
|
||||||
import { isMobileOnly } from "react-device-detect";
|
import { isMobileOnly } from "react-device-detect";
|
||||||
import { LuImage, LuSearchX, LuText, LuXCircle } from "react-icons/lu";
|
import { LuImage, LuSearchX, LuText, LuXCircle } from "react-icons/lu";
|
||||||
@ -29,7 +25,6 @@ type SearchViewProps = {
|
|||||||
searchFilter?: SearchFilter;
|
searchFilter?: SearchFilter;
|
||||||
searchResults?: SearchResult[];
|
searchResults?: SearchResult[];
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
similaritySearch?: PartialSearchResult;
|
|
||||||
setSearch: (search: string) => void;
|
setSearch: (search: string) => void;
|
||||||
setSimilaritySearch: (search: SearchResult) => void;
|
setSimilaritySearch: (search: SearchResult) => void;
|
||||||
onUpdateFilter: (filter: SearchFilter) => void;
|
onUpdateFilter: (filter: SearchFilter) => void;
|
||||||
@ -41,7 +36,6 @@ export default function SearchView({
|
|||||||
searchFilter,
|
searchFilter,
|
||||||
searchResults,
|
searchResults,
|
||||||
isLoading,
|
isLoading,
|
||||||
similaritySearch,
|
|
||||||
setSearch,
|
setSearch,
|
||||||
setSimilaritySearch,
|
setSimilaritySearch,
|
||||||
onUpdateFilter,
|
onUpdateFilter,
|
||||||
@ -123,7 +117,7 @@ export default function SearchView({
|
|||||||
<Input
|
<Input
|
||||||
className="text-md w-full bg-muted pr-10"
|
className="text-md w-full bg-muted pr-10"
|
||||||
placeholder={"Search for a detected object..."}
|
placeholder={"Search for a detected object..."}
|
||||||
value={similaritySearch ? "" : search}
|
value={search}
|
||||||
onChange={(e) => setSearch(e.target.value)}
|
onChange={(e) => setSearch(e.target.value)}
|
||||||
/>
|
/>
|
||||||
{search && (
|
{search && (
|
||||||
@ -180,7 +174,7 @@ export default function SearchView({
|
|||||||
findSimilar={() => setSimilaritySearch(value)}
|
findSimilar={() => setSimilaritySearch(value)}
|
||||||
onClick={() => onSelectSearch(value)}
|
onClick={() => onSelectSearch(value)}
|
||||||
/>
|
/>
|
||||||
{(searchTerm || similaritySearch) && (
|
{searchTerm && (
|
||||||
<div className={cn("absolute right-2 top-2 z-40")}>
|
<div className={cn("absolute right-2 top-2 z-40")}>
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger>
|
<TooltipTrigger>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user