Public
Edited
Feb 23, 2023
Insert cell
Insert cell
filtered_data_types = { return {
"Created By": "text",
"Created Date": "date",
"Modified Date": "date",
"Slug": "text",
"all_versions_rating": "number",
"authorized_apps": "list.text",
"categories": "list.text",
"deleted": "boolean",
"description": "option.role",
"first_publish_date": "date",
"git_repo": "text",
"git_repo_default_branch_name": "text",
"git_repo_url": "text",
"image": "image",
"instructions": "text",
"last_version": "text",
"last_version_rating": "number",
"licence": "text",
"link": "text",
"name": "text",
"official_badge": "boolean",
"one_time_price": "number",
"payment_type": "text",
"price_number": "number",
"published_commercial": "boolean",
"published_open_source": "boolean",
"show_as_integration": "boolean",
"test_appname": "text",
"types": "list.text",
"usage_count": "number",
"version_history": "list.text"
} }
Insert cell
option_fields = Object.keys(Object.keys(filtered_data_types).reduce((p, key) => {
if (filtered_data_types[key].includes('option.')) p[key] = filtered_data_types[key];
return p;
}, {}))
Insert cell
// sort_by_objects = [
// {
// "field": "usage_count",
// "descending": true,
// },
// {
// "field": "test_appname",
// "descending": true,
// },
// {
// "field": "description",
// "descending": true,
// },
// ]

sort_by_objects = []
Insert cell
Insert cell
Insert cell
process_sort_fields_typesense(sort_by_objects, option_fields)
Insert cell
Insert cell
Insert cell
search_index = "Bubble @#$^T%&SWplugin"
Insert cell
Insert cell
process_sort_fields_algolia(sort_by_objects, option_fields)
Insert cell
Insert cell
function process_sort_fields(sort_by_objects, option_fields, search_provider) {
// TODO: Assuming that all sort_by fields are actually available (to be validated above)
function set_sort_defaults(_object) {
return {
descending: _object.descending || true,
..._object
}
}
function stringify_descending(_boolean) {
if (typeof (_boolean) == 'string') {
return (_boolean.toLowerCase() == 'yes') ? 'desc' : 'asc'
} else {
return _boolean ? 'desc' : 'asc'
}
}
function convert_option_field(field) {
if (option_fields.includes(field)) {
return field + '_sort'
} else return field
}
sort_by_objects = sort_by_objects.map(e => set_sort_defaults(e))

if (search_provider == "Typesense") {
sort_by_objects = sort_by_objects.slice(0, 3) //Take up to at most 3 sort fields
let sort_by_string = ''
for (const key in sort_by_objects) {
sort_by_string = `${sort_by_string},${convert_option_field(sort_by_objects[key].field)}(missing_values: last):${stringify_descending(sort_by_objects[key].descending)}`
}
return sort_by_string.replace(',', '')
} else if (search_provider == "Algolia") {
sort_by_objects = sort_by_objects.slice(0, 1) //Take up to at most 1 sort field
let sort_by_string = ''
for (const key in sort_by_objects) {
sort_by_string = `${sort_by_string},${normalize_index_name(search_index + "_" + convert_option_field(sort_by_objects[key].field),'Algolia')}_${stringify_descending(sort_by_objects[key].descending)}`
}
return sort_by_string.replace(',', '')
}
}
Insert cell
process_sort_fields(sort_by_objects, option_fields, "Typesense")
Insert cell
process_sort_fields(sort_by_objects, option_fields, "Algolia")
Insert cell
{ if (process_sort_fields(sort_by_objects, option_fields, "Algolia") == "") {return 2} }
Insert cell

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more