From 4e254c05ee231740360b09ba1517ed2f329438e9 Mon Sep 17 00:00:00 2001 From: alonr619 Date: Mon, 10 Apr 2023 18:36:28 -0700 Subject: [PATCH 1/2] Finished up the new search. Adds double quote, not, start, and end filtering. --- .../TranscriptSearch/TranscriptSearch.tsx | 94 ++++++++++++++++++- 1 file changed, 89 insertions(+), 5 deletions(-) diff --git a/src/components/Details/TranscriptSearch/TranscriptSearch.tsx b/src/components/Details/TranscriptSearch/TranscriptSearch.tsx index dd534330..72954601 100644 --- a/src/components/Details/TranscriptSearch/TranscriptSearch.tsx +++ b/src/components/Details/TranscriptSearch/TranscriptSearch.tsx @@ -12,6 +12,7 @@ import { strings } from "../../../assets/LocalizedStrings"; import { fontSizes } from "../../../styles/fonts"; import { screenWidths } from "../../../styles/mediaBreakpoints"; import cleanText from "../../../utils/cleanText"; +import { varietyRoles } from "../../../stories/model-mocks/role"; const Container = styled.div({ display: "flex", @@ -100,14 +101,97 @@ const TranscriptSearch: FC = ({ if (!searchedTerm.trim()) { return sentences.data; } - const cleanedQuery = cleanText(searchedTerm); - const tokenizedQuery = removeStopwords(cleanedQuery.split(" ")); + + let newTerm = searchedTerm; + + // get beginning restricter + let beginIndStart = newTerm.indexOf('^"'); + let beginRestriction = ""; + if (beginIndStart !== -1) { + let beginIndFinal = newTerm.substring(beginIndStart + 2).indexOf('"') + beginIndStart + 2; + beginRestriction = newTerm.substring(beginIndStart + 2, beginIndFinal); + newTerm = newTerm.substring(0, beginIndStart) + newTerm.substring(beginIndFinal + 1); + } + + // get ending restricter + let endIndStart = newTerm.indexOf('$"'); + let endRestriction = ""; + if (endIndStart !== -1) { + let endIndFinal = newTerm.substring(endIndStart + 2).indexOf('"') + endIndStart + 2; + endRestriction = newTerm.substring(endIndStart + 2, endIndFinal); + newTerm = newTerm.substring(0, endIndStart) + newTerm.substring(endIndFinal + 1); + } + + // get all indices of double quotes + let regex = /"/gi, + result, + indices = [], + required = [], + banned = []; + while ((result = regex.exec(newTerm))) { + indices.push(result.index); + } + + // find everything inside these double quotes and remove them + for (let i = Math.floor(indices.length / 2) - 1; i >= 0; i--) { + if (newTerm.substring(indices[i * 2] - 1, indices[i * 2]) === "!") { + banned.push(newTerm.substring(indices[i * 2] + 1, indices[i * 2 + 1])); + } else { + required.push(newTerm.substring(indices[i * 2] + 1, indices[i * 2 + 1])); + } + newTerm = + newTerm.substring(0, indices[i * 2]) + + newTerm.substring(indices[i * 2 + 1] + 1, newTerm.length); + } + + let ans = []; + console.log("1"); + let cleanedQuery = cleanText(newTerm); + console.log("2"); + let tokenizedQuery = removeStopwords(cleanedQuery.split(" ")); + console.log("3"); if (!cleanedQuery || tokenizedQuery.length === 0) { // empty query or no valid tokens to search - return []; + ans = [...sentences.data]; + console.log("4"); + } else { + let stemmedQuery = tokenizedQuery.map((token) => stem(token.toLowerCase())); + // the list before filtering out entries according to double quote rules + ans = sentences.data.filter((_, i) => stemmedQuery.some((q) => stemmedSentences[i].has(q))); + console.log("5"); + } + console.log("6"); + // filter out everything in prevAns that doesn't follow the double quote rules + for (let i = ans.length - 1; i >= 0; i--) { + console.log("7"); + if ( + beginRestriction !== "" && + ans[i].text.substring(0, beginRestriction.length) !== beginRestriction + ) { + ans.splice(i, 1); + continue; + } + if ( + endRestriction !== "" && + ans[i].text.substring(ans[i].text.length - endRestriction.length) !== endRestriction + ) { + ans.splice(i, 1); + continue; + } + for (let j = 0; j < required.length; j++) { + if (!ans[i].text.includes(required[j])) { + ans.splice(i, 1); + continue; + } + } + for (let j = 0; j < banned.length; j++) { + if (ans[i].text.includes(banned[j])) { + ans.splice(i, 1); + continue; + } + } } - const stemmedQuery = tokenizedQuery.map((token) => stem(token.toLowerCase())); - return sentences.data.filter((_, i) => stemmedQuery.some((q) => stemmedSentences[i].has(q))); + return ans; } return []; }, [sentences.data, stemmedSentences, searchedTerm]); From b64195f2cc2b27825108d69050bc816dd51f02c7 Mon Sep 17 00:00:00 2001 From: alonr619 Date: Tue, 11 Apr 2023 09:58:28 -0700 Subject: [PATCH 2/2] Fixing lint. Changing let to const in some places --- .../TranscriptSearch/TranscriptSearch.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/Details/TranscriptSearch/TranscriptSearch.tsx b/src/components/Details/TranscriptSearch/TranscriptSearch.tsx index 72954601..3a8eeaaa 100644 --- a/src/components/Details/TranscriptSearch/TranscriptSearch.tsx +++ b/src/components/Details/TranscriptSearch/TranscriptSearch.tsx @@ -105,29 +105,29 @@ const TranscriptSearch: FC = ({ let newTerm = searchedTerm; // get beginning restricter - let beginIndStart = newTerm.indexOf('^"'); + const beginIndStart = newTerm.indexOf('^"'); let beginRestriction = ""; if (beginIndStart !== -1) { - let beginIndFinal = newTerm.substring(beginIndStart + 2).indexOf('"') + beginIndStart + 2; + const beginIndFinal = newTerm.substring(beginIndStart + 2).indexOf('"') + beginIndStart + 2; beginRestriction = newTerm.substring(beginIndStart + 2, beginIndFinal); newTerm = newTerm.substring(0, beginIndStart) + newTerm.substring(beginIndFinal + 1); } // get ending restricter - let endIndStart = newTerm.indexOf('$"'); + const endIndStart = newTerm.indexOf('$"'); let endRestriction = ""; if (endIndStart !== -1) { - let endIndFinal = newTerm.substring(endIndStart + 2).indexOf('"') + endIndStart + 2; + const endIndFinal = newTerm.substring(endIndStart + 2).indexOf('"') + endIndStart + 2; endRestriction = newTerm.substring(endIndStart + 2, endIndFinal); newTerm = newTerm.substring(0, endIndStart) + newTerm.substring(endIndFinal + 1); } // get all indices of double quotes - let regex = /"/gi, - result, + const regex = /"/gi, indices = [], required = [], banned = []; + let result; while ((result = regex.exec(newTerm))) { indices.push(result.index); } @@ -146,16 +146,16 @@ const TranscriptSearch: FC = ({ let ans = []; console.log("1"); - let cleanedQuery = cleanText(newTerm); + const cleanedQuery = cleanText(newTerm); console.log("2"); - let tokenizedQuery = removeStopwords(cleanedQuery.split(" ")); + const tokenizedQuery = removeStopwords(cleanedQuery.split(" ")); console.log("3"); if (!cleanedQuery || tokenizedQuery.length === 0) { // empty query or no valid tokens to search ans = [...sentences.data]; console.log("4"); } else { - let stemmedQuery = tokenizedQuery.map((token) => stem(token.toLowerCase())); + const stemmedQuery = tokenizedQuery.map((token) => stem(token.toLowerCase())); // the list before filtering out entries according to double quote rules ans = sentences.data.filter((_, i) => stemmedQuery.some((q) => stemmedSentences[i].has(q))); console.log("5");