Browse Source

WIP bricks: add implicit bricks from LL.

scossu 2 tuần trước cách đây
mục cha
commit
4506660abc

+ 1 - 0
config/model/typedef/artifact.lua

@@ -24,6 +24,7 @@ return {
                 a thumbnail (for a visual item) or sample (for non-visual
                 materials such as audio).]],
             type = "resource",
+            range = {file = true},
         },
         has_file = {
             uri = "pas:hasFile",

+ 5 - 0
config/model/typedef/brick.lua

@@ -40,5 +40,10 @@ return {
             type = "resource",
             max_cardinality = 1,
         },
+        has_member = {
+            uri = "pas:hasMember",
+            label = "Member",
+            type = "resource",
+        },
     }
 }

+ 0 - 5
config/model/typedef/collection.lua

@@ -5,11 +5,6 @@ return {
     broader = "brick",
 
     properties = {
-        has_member = {
-            uri = "pas:hasMember",
-            label = "Member",
-            type = "resource",
-        },
         pref_rep = {
             uri = "pas:hasPreferredRepresentation",
             label = "Preferred representation",

+ 46 - 15
src/submission.lua

@@ -159,39 +159,70 @@ M.rsrc_to_graph = function(rsrc)
     local gr = graph.new(nil)
 
     it = gr:add_init()
-    for k, v in pairs(rsrc) do
-        if k == "id" then goto skip end
-        logger:debug(("Adding attribute: %s = %s"):format(k, pp.write(v)))
-        local p = model.id_to_uri[k]
+    for prop, v in pairs(rsrc) do
+        if prop == "id" then goto skip end
+        logger:debug(("Adding attribute: %s = %s"):format(prop, pp.write(v)))
+        local p = model.id_to_uri[prop]
         if not p then
             logger:warn(
                 ("Term %s has no URI mapped. Assigning `pas:%s`.")
-                :format(k, k))
-            p = term.new_iriref_ns("pas:" .. k)
+                :format(prop, prop))
+            p = term.new_iriref_ns("pas:" .. prop)
         end
-        local datatype = ((rmod.properties or NT)[k] or NT).type
-        local rdf_type_str = pkar.config.md.datatypes[datatype]
+        local pconf = (rmod.properties or NT)[prop] or NT
+        local rdf_type_str = pkar.config.md.datatypes[pconf.type]
         local rdf_type
         if rdf_type_str then
             rdf_type = term.new_iriref_ns(rdf_type_str).data
         end
         -- Force all fields to be multi-valued.
         if type(v) ~= "table" then v = {v} end
+
+        -- Convert values to URIs.
         local o
+        --if prop == "has_member" then dbg() end
         for i, vv in ipairs(v) do
-            if k == "content_type" then
-                vv = rmod.uri
-            end
-            if datatype == "resource" then
+            if prop == "content_type" then
+                o = term.new_iriref_ns(rmod.uri)
+            elseif pconf.type == "resource" then
                 if not vv:match("^[a-z]*:") then
                     -- Convert local path to URIs.
-                    vv = assert(path_to_uri[vv]) end
-                o = term.new_iriref_ns(vv)
-            elseif datatype == "ext_resource" then
+                    v[i] = assert(path_to_uri[vv]) end
+                o = term.new_iriref_ns(v[i])
+            elseif pconf.type == "ext_resource" then
                 o = term.new_iriref(vv)
             else o = term.new_lit(vv, rdf_type) end
             it:add_iter(triple.new(s, p, o))
         end
+
+        -- Create implicit bricks for "has_member" property.
+        if prop == "has_member" then
+            local proxy_s
+            for i, vv in ipairs(v) do
+                -- Add linked list proxies.
+                local brick_uri = term.new_iriref_ns("par:" .. M.idgen())
+                if i == 1 then
+                    proxy_s = s
+                    it:add_iter(triple.new(proxy_s, pkar.FIRST_P, brick_uri))
+
+                    -- Add the "has member" property.
+                    it:add_iter(triple.new(
+                        s,
+                        term.new_iriref_ns(pconf.uri),
+                        term.new_iriref_ns(vv)))
+                else
+                    it:add_iter(triple.new(proxy_s, pkar.NEXT_P, brick_uri))
+                end
+                -- Add the reference.
+                it:add_iter(triple.new(
+                    brick_uri,
+                    term.new_iriref_ns("pas:ref"),
+                    term.new_iriref_ns(vv)))
+                proxy_s = brick_uri
+            end
+
+            goto skip
+        end
         ::skip::
     end
     for i, m in ipairs(rmod.lineage) do