Skip to content

Commit 8ba767f

Browse files
committed
feat(object_priority): changed test and new function
1 parent 92577bf commit 8ba767f

File tree

2 files changed

+50
-82
lines changed

2 files changed

+50
-82
lines changed

components/ObjectSelector.vue

Lines changed: 45 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -69,65 +69,59 @@
6969
async function get_allowed_objects() {
7070
toggle_loading()
7171
allowed_objects.value = {}
72-
var promise_array = []
73-
for (const filename of filenames) {
74-
const params = { filename, supported_feature }
75-
const promise = api_fetch({ schema, params })
76-
promise_array.push(promise)
77-
}
78-
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)),
72+
const responses = await Promise.all(
73+
filenames.map((filename) =>
74+
api_fetch({ schema, params: { filename, supported_feature } }),
75+
)
8676
)
87-
var final_object = {}
88-
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-
}
77+
const values = responses.map((r) => r.data.value.allowed_objects)
78+
const allKeys = [...new Set(values.flatMap((v) => Object.keys(v)))]
79+
const commonKeys = allKeys.filter(
80+
(key) => !values.some((obj) => !Object.prototype.hasOwnProperty.call(obj, key)),
81+
)
82+
const finalObject = {}
83+
for (const key of commonKeys) {
84+
const loadScores = values.map((obj) => obj[key].is_loadable)
85+
const priorities = values
86+
.map((obj) => obj[key].object_priority)
87+
.filter((p) => p !== undefined && p !== null)
88+
finalObject[key] = { is_loadable: Math.min(...loadScores) }
89+
if (priorities.length) {
90+
finalObject[key].object_priority = Math.max(...priorities)
9591
}
9692
}
97-
if (Object.keys(final_object).length > 0) {
98-
const max_loadability_score = Math.max(
99-
...Object.values(final_object).map(obj => obj.is_loadable ? 1 : 0)
93+
allowed_objects.value = finalObject
94+
let alreadySelected = false
95+
const objectKeys = Object.keys(finalObject)
96+
if (objectKeys.length) {
97+
const highestLoadScore = Math.max(
98+
...objectKeys.map((key) => finalObject[key].is_loadable)
10099
)
101-
102-
const best_objects = Object.fromEntries(
103-
Object.entries(final_object).filter(
104-
([object_name, object_info]) => (object_info.is_loadable ? 1 : 0) === max_loadability_score
100+
if (highestLoadScore > 0) {
101+
const bestScoreObjects = objectKeys.filter(
102+
(key) => finalObject[key].is_loadable === highestLoadScore
105103
)
106-
)
107-
108-
if (Object.keys(best_objects).length > 1) {
109-
const priorities = {}
110-
for (const object_name of Object.keys(best_objects)) {
111-
const priority_response = await api_fetch({
112-
schema: schemas.opengeodeweb_back.object_priority,
113-
params: { object_name, filename: filenames[0] }
114-
})
115-
priorities[object_name] = priority_response.data.value.priority
104+
if (bestScoreObjects.length === 1) {
105+
set_geode_object(bestScoreObjects[0])
106+
alreadySelected = true
107+
} else {
108+
const highestPriority = Math.max(
109+
...bestScoreObjects.map(
110+
(key) => finalObject[key].object_priority ?? -Infinity
111+
)
112+
)
113+
const bestPriorityObjects = bestScoreObjects.filter(
114+
(key) => finalObject[key].object_priority === highestPriority
115+
)
116+
if (highestPriority !== -Infinity && bestPriorityObjects.length === 1) {
117+
set_geode_object(bestPriorityObjects[0])
118+
alreadySelected = true
119+
}
116120
}
117-
118-
const best_object_name = Object.keys(best_objects).reduce((a, b) =>
119-
priorities[a] > priorities[b] ? a : b
120-
)
121-
122-
allowed_objects.value = { [best_object_name]: final_object[best_object_name] }
123-
} else {
124-
allowed_objects.value = best_objects
125121
}
126-
} else {
127-
allowed_objects.value = final_object
128122
}
129-
if (Object.keys(allowed_objects.value).length == 1) {
130-
set_geode_object(Object.keys(allowed_objects.value)[0])
123+
if (!alreadySelected && objectKeys.length === 1) {
124+
set_geode_object(objectKeys[0])
131125
}
132126
toggle_loading()
133127
}

test/components/ObjectSelector.nuxt.test.js

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -84,52 +84,26 @@ describe("ObjectSelector.vue", async () => {
8484
})
8585
})
8686

87-
test(`test object_priority with equal is_loadable scores`, async () => {
88-
var response = {
89-
allowed_objects: {},
90-
}
87+
test(`test object_priority when is_loadablescores equal`, async () => {
88+
var response = { allowed_objects: {} }
9189
const geode_object_1 = "BRep"
9290
const geode_object_2 = "EdgedCurve3D"
93-
const geode_object_3 = "PolygonalSurface3D"
94-
response["allowed_objects"][geode_object_1] = { is_loadable: true }
95-
response["allowed_objects"][geode_object_2] = { is_loadable: true }
96-
response["allowed_objects"][geode_object_3] = { is_loadable: true }
91+
response["allowed_objects"][geode_object_1] = { is_loadable: 1.0, object_priority: 2 }
92+
response["allowed_objects"][geode_object_2] = { is_loadable: 1.0, object_priority: 1 }
9793
registerEndpoint(allowed_objects.$id, {
9894
method: allowed_objects.methods[0],
9995
handler: () => response,
10096
})
101-
102-
const object_priority_schema = {
103-
$id: "object_priority",
104-
methods: ["POST"]
105-
}
106-
registerEndpoint(object_priority_schema.$id, {
107-
method: object_priority_schema.methods[0],
108-
handler: ({ body }) => {
109-
const { object_name } = body
110-
const priorities = {
111-
"BRep": 10,
112-
"EdgedCurve3D": 5,
113-
"PolygonalSurface3D": 8
114-
}
115-
return { priority: priorities[object_name] || 0 }
116-
}
117-
})
11897
const wrapper = await mountSuspended(ObjectSelector, {
11998
global: {
12099
plugins: [vuetify, pinia],
121100
},
122101
props: { filenames: ["test.toto"], supported_feature: "test" },
123102
})
124-
await flushPromises()
125-
const v_cards = wrapper.findAllComponents(components.VCard)
126-
expect(v_cards).toHaveLength(1)
127-
const v_img = v_cards[0].findComponent(components.VImg)
128-
expect(v_img.vm.src).toContain(`${geode_object_1}.svg`)
129103
expect(wrapper.emitted()).toHaveProperty("update_values")
130104
expect(wrapper.emitted().update_values).toHaveLength(1)
131105
expect(wrapper.emitted().update_values[0][0]).toEqual({
132106
input_geode_object: geode_object_1,
133107
})
134108
})
135-
})
109+
})

0 commit comments

Comments
 (0)