summaryrefslogtreecommitdiffstats
path: root/acf
diff options
context:
space:
mode:
Diffstat (limited to 'acf')
-rw-r--r--acf/model/field.lua3
-rw-r--r--acf/model/init.lua2
-rw-r--r--acf/model/model.lua12
-rw-r--r--acf/model/node.lua4
-rw-r--r--acf/model/root.lua11
5 files changed, 18 insertions, 14 deletions
diff --git a/acf/model/field.lua b/acf/model/field.lua
index beb6b28..a784b44 100644
--- a/acf/model/field.lua
+++ b/acf/model/field.lua
@@ -84,6 +84,7 @@ function Field:topology(context)
end
function Field:load(context)
+ if not context.txn then return setmetatable({}, context) end
local value = context.txn:get(context.addr, self:btype(context))
if value == nil then return self.default end
return value
@@ -183,7 +184,7 @@ function TreeNode:topology(context)
end
function TreeNode:load(context, create)
- if not (
+ if context.txn and not (
create or self.create or context.txn:get(context.addr, 'table')
) then return end
return self.itype(context, self.iparams)
diff --git a/acf/model/init.lua b/acf/model/init.lua
index ba3eae5..7a51652 100644
--- a/acf/model/init.lua
+++ b/acf/model/init.lua
@@ -84,7 +84,7 @@ end
function Reference:load(context)
local ref = super(self, Reference):load(context)
- return ref and self:follow(context, ref) or nil
+ return (context.txn and ref) and self:follow(context, ref) or ref
end
function Reference:_validate(context, value)
diff --git a/acf/model/model.lua b/acf/model/model.lua
index e4cffa4..575df99 100644
--- a/acf/model/model.lua
+++ b/acf/model/model.lua
@@ -137,11 +137,6 @@ function Model:init(context)
function mt.valid_member(name) return member(name) end
- if not mt.txn then return end
-
-
- function mt.mmeta(name) return member(name, true):meta() end
-
function mt.load(k, create)
local v = mt.class[k]
@@ -151,6 +146,8 @@ function Model:init(context)
return v:load(create)
end
+ assert(mt.txn)
+
if isinstance(v, Action) then
local f = v.field and BoundMember(self, v.field)
if create then return f and f:load(true) end
@@ -172,6 +169,11 @@ function Model:init(context)
return v
end
+ if not mt.txn then return end
+
+
+ function mt.mmeta(name) return member(name, true):meta() end
+
function mt.save(k, v) return member(k, true, Field):save(v) end
local function tmeta(tpe)
diff --git a/acf/model/node.lua b/acf/model/node.lua
index eb06b2d..4b4808d 100644
--- a/acf/model/node.lua
+++ b/acf/model/node.lua
@@ -56,6 +56,7 @@ function TreeNode:init(context)
util.update(mt, context)
mt.meta = {}
+ function mt.get(k, create) return mt.load(k, create) end
if not mt.txn then return end
@@ -66,7 +67,6 @@ function TreeNode:init(context)
end
function mt.save(k, v) rawset(self, k, v) end
- function mt.get(k, create) return mt.load(k, create) end
function mt.__index(t, k) return mt.get(k) end
function mt.__newindex(t, k, v) mt.save(k, v) end
@@ -123,6 +123,7 @@ function Collection:init(context, params)
local mt = getmetatable(self)
function mt.topology() return field:topology(pth.wildcard) end
function mt.valid_member(name) return true end
+ function mt.load(k, create) return field:load(k, create) end
if not mt.txn then return end
@@ -149,7 +150,6 @@ function Collection:init(context, params)
end
end
- function mt.load(k, create) return field:load(k, create) end
function mt.save(k, v) field:save(k, v) end
end
diff --git a/acf/model/root.lua b/acf/model/root.lua
index f273c4a..0c8d866 100644
--- a/acf/model/root.lua
+++ b/acf/model/root.lua
@@ -32,6 +32,7 @@ end
local _topology = {}
+local order = 0
function topology(addr, create)
local top = _topology
@@ -59,12 +60,12 @@ function register(name, field, params)
params.create = true
RootModel[name] = model.to_field(field, params)
- _topology = {}
-
- -- TODO optimize: do not traverse already registered models
- for i, record in ipairs(node.topology(RootModel())) do
+ for _, record in ipairs(node.topology(RootModel():search(name))) do
local top = topology(record.addr, true)
- setdefault(top, 'order', i)
+
+ setdefault(top, 'order', order)
+ order = order + 1
+
table.insert(top.paths, record.path)
end
end