diff options
Diffstat (limited to 'acf')
-rw-r--r-- | acf/model/field.lua | 3 | ||||
-rw-r--r-- | acf/model/init.lua | 2 | ||||
-rw-r--r-- | acf/model/model.lua | 12 | ||||
-rw-r--r-- | acf/model/node.lua | 4 | ||||
-rw-r--r-- | acf/model/root.lua | 11 |
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 |