|
240 | 240 | COMMENT ON FUNCTION public.author_of_concept(public.my_concepts) |
241 | 241 | IS 'Computed one-to-one: returns the PlatformAccount which authored a given Concept.'; |
242 | 242 |
|
| 243 | +CREATE OR REPLACE FUNCTION public.rid_to_space_id_and_local_id(rid VARCHAR) |
| 244 | +RETURNS public.accessible_resource STRICT STABLE |
| 245 | +SET search_path = '' |
| 246 | +LANGUAGE plpgsql AS $$ |
| 247 | +DECLARE |
| 248 | + uri VARCHAR; |
| 249 | + source_local_id VARCHAR; |
| 250 | + source_id BIGINT; |
| 251 | +BEGIN |
| 252 | +source_local_id := split_part(rid, '/', -1); |
| 253 | +IF length(source_local_id) = length(rid) THEN |
| 254 | + RETURN (null, 'Not a Rid')::public.accessible_resource; |
| 255 | +END IF; |
| 256 | +uri := substr(rid, 1, length(rid) - length(source_local_id) - 1); |
| 257 | +IF rid ~ '^orn:\w+\.\w+:.*$' THEN |
| 258 | + uri := concat(split_part(split_part(uri, ':', 2), '.', 1), ':', split_part(uri, ':', 3)); |
| 259 | +ELSE |
| 260 | + IF rid ~ '^orn:\w+:.*$' THEN |
| 261 | + uri := substr(uri, 5); |
| 262 | + END IF; |
| 263 | +END IF; |
| 264 | +SELECT id INTO source_id FROM public."Space" where url=uri; |
| 265 | +IF source_id IS NULL THEN |
| 266 | + RETURN (null, concat('Cannot find ', uri))::public.accessible_resource; |
| 267 | +END IF; |
| 268 | +RETURN (source_id, source_local_id); |
| 269 | +END; |
| 270 | +$$; |
| 271 | + |
| 272 | +CREATE OR REPLACE FUNCTION public.rid_or_local_id_to_concept_db_id(rid VARCHAR, default_space_id BIGINT) |
| 273 | +RETURNS BIGINT STRICT STABLE |
| 274 | +SET search_path = '' |
| 275 | +LANGUAGE plpgsql AS $$ |
| 276 | +DECLARE r public.accessible_resource; |
| 277 | +BEGIN |
| 278 | + r := (SELECT public.rid_to_space_id_and_local_id(rid)); |
| 279 | + IF r.space_id IS NULL THEN |
| 280 | + RETURN (SELECT id FROM public."Concept" WHERE space_id = default_space_id AND source_local_id = rid); |
| 281 | + ELSE |
| 282 | + RETURN (SELECT id FROM public."Concept" WHERE space_id = r.space_id AND source_local_id = r.source_local_id); |
| 283 | + END IF; |
| 284 | +END; |
| 285 | +$$; |
243 | 286 |
|
244 | 287 | CREATE TYPE public.concept_local_input AS ( |
245 | 288 | -- concept columns |
@@ -292,37 +335,34 @@ BEGIN |
292 | 335 | SELECT id FROM public."Space" |
293 | 336 | WHERE url = data.space_url INTO concept.space_id; |
294 | 337 | END IF; |
295 | | - IF data.schema_represented_by_local_id IS NOT NULL THEN |
296 | | - SELECT cpt.id FROM public."Concept" cpt |
297 | | - WHERE cpt.source_local_id = data.schema_represented_by_local_id |
298 | | - AND cpt.space_id = concept.space_id INTO concept.schema_id; |
299 | | - END IF; |
300 | 338 | IF concept.source_local_id = '' THEN |
301 | 339 | concept.source_local_id := NULL; |
302 | 340 | END IF; |
303 | 341 | IF data.represented_by_local_id = '' THEN |
304 | 342 | data.represented_by_local_id := NULL; |
305 | 343 | END IF; |
| 344 | + IF data.schema_represented_by_local_id IS NOT NULL THEN |
| 345 | + SELECT public.rid_or_local_id_to_concept_db_id( |
| 346 | + data.schema_represented_by_local_id, concept.space_id) INTO concept.schema_id; |
| 347 | + END IF; |
306 | 348 | concept.source_local_id = COALESCE(concept.source_local_id, data.represented_by_local_id); -- legacy input field |
| 349 | + concept.reference_content := coalesce(data.reference_content, '{}'::jsonb); |
307 | 350 | IF data.local_reference_content IS NOT NULL THEN |
308 | 351 | FOR key, value IN SELECT * FROM jsonb_each(data.local_reference_content) LOOP |
309 | 352 | IF jsonb_typeof(value) = 'array' THEN |
310 | 353 | WITH el AS (SELECT jsonb_array_elements_text(value) as x), |
311 | | - ela AS (SELECT array_agg(x) AS a FROM el) |
312 | | - SELECT array_agg(DISTINCT cpt.id) INTO STRICT ref_array_val |
313 | | - FROM public."Concept" AS cpt |
314 | | - JOIN ela ON (true) WHERE cpt.source_local_id = ANY(ela.a) AND cpt.space_id=concept.space_id; |
| 354 | + el2 AS (SELECT public.rid_or_local_id_to_concept_db_id(x, concept.space_id) AS id FROM el) |
| 355 | + SELECT array_agg(DISTINCT el2.id) INTO STRICT ref_array_val |
| 356 | + FROM el2 WHERE el2.id IS NOT NULL; |
315 | 357 | reference_content := jsonb_set(reference_content, ARRAY[key], to_jsonb(ref_array_val)); |
316 | 358 | ELSIF jsonb_typeof(value) = 'string' THEN |
317 | | - SELECT cpt.id INTO STRICT ref_single_val |
318 | | - FROM public."Concept" AS cpt |
319 | | - WHERE cpt.source_local_id = (value #>> '{}') AND cpt.space_id=concept.space_id; |
| 359 | + SELECT public.rid_or_local_id_to_concept_db_id(value #>> '{}', concept.space_id) INTO STRICT ref_single_val; |
320 | 360 | reference_content := jsonb_set(reference_content, ARRAY[key], to_jsonb(ref_single_val)); |
321 | 361 | ELSE |
322 | 362 | RAISE EXCEPTION 'Invalid value in local_reference_content % %', value, jsonb_typeof(value); |
323 | 363 | END IF; |
324 | 364 | END LOOP; |
325 | | - SELECT reference_content INTO concept.reference_content; |
| 365 | + concept.reference_content := concept.reference_content || reference_content; |
326 | 366 | END IF; |
327 | 367 | RETURN concept; |
328 | 368 | END; |
|
0 commit comments