|
66 | 66 | const allowed_objects = ref({}) |
67 | 67 | const toggle_loading = useToggle(loading) |
68 | 68 |
|
| 69 | + function select_geode_object(object_map) { |
| 70 | + const object_keys = Object.keys(object_map) |
| 71 | + if (!object_keys.length) { |
| 72 | + return undefined |
| 73 | + } |
| 74 | + if ( |
| 75 | + object_keys.length === 1 && |
| 76 | + object_map[object_keys[0]].is_loadable > 0 |
| 77 | + ) { |
| 78 | + return object_keys[0] |
| 79 | + } |
| 80 | + const highest_load_score = Math.max( |
| 81 | + ...object_keys.map((key) => object_map[key].is_loadable), |
| 82 | + ) |
| 83 | + if (highest_load_score <= 0) { |
| 84 | + return undefined |
| 85 | + } |
| 86 | + const best_score_objects = object_keys.filter( |
| 87 | + (key) => object_map[key].is_loadable === highest_load_score, |
| 88 | + ) |
| 89 | + if (best_score_objects.length === 1) { |
| 90 | + return best_score_objects[0] |
| 91 | + } |
| 92 | + const highest_priority = Math.max( |
| 93 | + ...best_score_objects.map( |
| 94 | + (key) => object_map[key].object_priority ?? -Infinity, |
| 95 | + ), |
| 96 | + ) |
| 97 | + const best_priority_objects = best_score_objects.filter( |
| 98 | + (key) => object_map[key].object_priority === highest_priority, |
| 99 | + ) |
| 100 | + if (highest_priority !== -Infinity && best_priority_objects.length === 1) { |
| 101 | + return best_priority_objects[0] |
| 102 | + } |
| 103 | + return undefined |
| 104 | + } |
| 105 | +
|
69 | 106 | async function get_allowed_objects() { |
70 | 107 | toggle_loading() |
71 | 108 | allowed_objects.value = {} |
72 | | - var promise_array = [] |
73 | | - for (const filename of filenames) { |
| 109 | + const promise_array = filenames.map((filename) => { |
74 | 110 | const params = { filename, supported_feature } |
75 | | - const promise = api_fetch({ schema, params }) |
76 | | - promise_array.push(promise) |
77 | | - } |
| 111 | + return api_fetch({ schema, params }) |
| 112 | + }) |
78 | 113 | const responses = await Promise.all(promise_array) |
79 | | - let values = [] |
80 | | - for (const response of responses) { |
81 | | - values.push(response.data.value.allowed_objects) |
82 | | - } |
83 | | - const all_keys = [...new Set(values.flatMap((value) => Object.keys(value)))] |
84 | | - const common_keys = all_keys.filter( |
85 | | - (i) => !values.some((j) => !Object.keys(j).includes(i)), |
| 114 | + const allowed_objects_list = responses.map( |
| 115 | + (response) => response.data.value.allowed_objects, |
| 116 | + ) |
| 117 | + const all_keys = [...new Set(allowed_objects_list.flatMap(Object.keys))] |
| 118 | + const common_keys = all_keys.filter((key) => |
| 119 | + allowed_objects_list.every((obj) => key in obj), |
86 | 120 | ) |
87 | | - var final_object = {} |
| 121 | + const final_object = {} |
88 | 122 | for (const key of common_keys) { |
89 | | - for (const value of values) { |
90 | | - if (value[key].is_loadable == false) { |
91 | | - final_object[key] = { is_loadable: false } |
92 | | - } else { |
93 | | - final_object[key] = { is_loadable: true } |
94 | | - } |
| 123 | + const load_scores = allowed_objects_list.map( |
| 124 | + (obj) => obj[key].is_loadable, |
| 125 | + ) |
| 126 | + const priorities = allowed_objects_list |
| 127 | + .map((obj) => obj[key].object_priority) |
| 128 | + .filter((p) => p !== undefined && p !== null) |
| 129 | + final_object[key] = { is_loadable: Math.min(...load_scores) } |
| 130 | + if (priorities.length) { |
| 131 | + final_object[key].object_priority = Math.max(...priorities) |
95 | 132 | } |
96 | 133 | } |
97 | | -
|
98 | 134 | allowed_objects.value = final_object |
99 | | - if (Object.keys(allowed_objects.value).length == 1) { |
100 | | - set_geode_object(Object.keys(allowed_objects.value)[0]) |
| 135 | + const selected_object = select_geode_object(final_object) |
| 136 | + if (selected_object) { |
| 137 | + set_geode_object(selected_object) |
101 | 138 | } |
102 | 139 | toggle_loading() |
103 | 140 | } |
|
0 commit comments