|
|
|
export const looksLikeRegex = (str) => { |
|
const regexSpecialChars = /[\\^$.*+?()[\]{}|]/; |
|
return regexSpecialChars.test(str); |
|
}; |
|
|
|
|
|
const getFieldPath = (field) => { |
|
const fieldMappings = { |
|
precision: "model.precision", |
|
architecture: "model.architecture", |
|
license: "metadata.hub_license", |
|
type: "model.type", |
|
}; |
|
return fieldMappings[field] || field; |
|
}; |
|
|
|
|
|
export const parseSearchQuery = (query) => { |
|
const specialSearches = []; |
|
let remainingText = query; |
|
|
|
|
|
const prefixRegex = /@\w+:/g; |
|
const matches = query.match(prefixRegex) || []; |
|
|
|
matches.forEach((prefix) => { |
|
const regex = new RegExp(`${prefix}([^\\s@]+)`, "g"); |
|
remainingText = remainingText.replace(regex, (match, value) => { |
|
const field = prefix.slice(1, -1); |
|
specialSearches.push({ |
|
field: getFieldPath(field), |
|
displayField: field, |
|
value, |
|
}); |
|
return ""; |
|
}); |
|
}); |
|
|
|
return { |
|
specialSearches, |
|
textSearch: remainingText.trim(), |
|
}; |
|
}; |
|
|
|
|
|
export const extractTextSearch = (searchValue) => { |
|
return searchValue |
|
.split(";") |
|
.map((query) => { |
|
const { textSearch } = parseSearchQuery(query); |
|
return textSearch; |
|
}) |
|
.filter(Boolean) |
|
.join(";"); |
|
}; |
|
|
|
|
|
export const getValueByPath = (obj, path) => { |
|
return path.split(".").reduce((acc, part) => acc?.[part], obj); |
|
}; |
|
|
|
|
|
export const generateSearchDescription = (searchValue) => { |
|
if (!searchValue) return null; |
|
|
|
const searchGroups = searchValue |
|
.split(";") |
|
.map((group) => group.trim()) |
|
.filter(Boolean); |
|
|
|
return searchGroups.map((group, index) => { |
|
const { specialSearches, textSearch } = parseSearchQuery(group); |
|
|
|
let parts = []; |
|
if (textSearch) { |
|
parts.push(textSearch); |
|
} |
|
|
|
if (specialSearches.length > 0) { |
|
const specialParts = specialSearches.map( |
|
({ displayField, value }) => `@${displayField}:${value}` |
|
); |
|
parts = parts.concat(specialParts); |
|
} |
|
|
|
return { |
|
text: parts.join(" "), |
|
index, |
|
}; |
|
}); |
|
}; |
|
|