From 76b4d37fec67081228dcedcaf2b70d2b48b544c4 Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Thu, 29 Dec 2016 16:16:47 +0200 Subject: model: optimize fetching of collection members avoid unnecessary initialization of collection metadata --- aconf/model/model.lua | 4 +++- aconf/model/node.lua | 35 ++++++++++++++++------------------- 2 files changed, 19 insertions(+), 20 deletions(-) (limited to 'aconf') diff --git a/aconf/model/model.lua b/aconf/model/model.lua index 8c62535..eee05c7 100644 --- a/aconf/model/model.lua +++ b/aconf/model/model.lua @@ -1,5 +1,5 @@ --[[ -Copyright (c) 2012-2016 Kaarle Ritvanen +Copyright (c) 2012-2017 Kaarle Ritvanen See LICENSE file for license details --]] @@ -207,6 +207,8 @@ function M.Model:init(context) function mt.mmeta(name) return mt.member(name):meta() end + function mt.member_ui_name(name) return mt.mmeta(name)['ui-name'] end + function mt.save(k, v) k = normalize_name(k) local field = mt.member(k, false, Field) diff --git a/aconf/model/node.lua b/aconf/model/node.lua index 70aa4fc..b3a5ab0 100644 --- a/aconf/model/node.lua +++ b/aconf/model/node.lua @@ -1,5 +1,5 @@ --[[ -Copyright (c) 2012-2016 Kaarle Ritvanen +Copyright (c) 2012-2017 Kaarle Ritvanen See LICENSE file for license details --]] @@ -244,14 +244,8 @@ function M.TreeNode:init(context, params) function mt.meta() if not mt._meta then - mt._meta = {type=params.dtype} - if mt.txn then - if mt.parent then - mt._meta['ui-name'] = - getmetatable(mt.parent).mmeta(mt.name)['ui-name'] - end - mt.init_meta(mt._meta) - end + mt._meta = {type=params.dtype, ['ui-name']=mt.ui_name} + if mt.txn then mt.init_meta(mt._meta) end end local res = copy(mt._meta) @@ -264,6 +258,8 @@ function M.TreeNode:init(context, params) if not mt.txn then return end + mt.ui_name = mt.parent and getmetatable(mt.parent).member_ui_name(mt.name) + function mt.save(k, v) rawset(self, k, v) end function mt.__index(t, k) return mt.get(k, {private=true}) end function mt.__newindex(t, k, v) mt.save(k, v) end @@ -302,6 +298,16 @@ function M.Collection:init(context, params) if not mt.txn then return end + mt.ui_member = params.ui_member or mt.ui_name:gsub('s$', '') + + function mt.member_ui_name(name) + return name ~= pth.wildcard and mt.ui_member..' '..name or nil + end + + function mt.mmeta(name) + return update(mt.field:meta(), {['ui-name']=mt.member_ui_name(name)}) + end + function mt.init_meta(meta) update( meta, @@ -309,21 +315,12 @@ function M.Collection:init(context, params) editable=params.editable and mt.has_permission('create'), members=mt.field:meta(), required=params.required, - ['ui-member']=params.ui_member or meta['ui-name']:gsub('s$', ''), + ['ui-member']=mt.ui_member, widget=params.layout } ) end - function mt.mmeta(name) - local meta = mt.meta() - local res = copy(meta.members) - if name ~= pth.wildcard then - res['ui-name'] = meta['ui-member']..' '..name - end - return res - end - local function validate_key(k) if params.key then local kf = M.BoundMember(self, k, object.toinstance(params.key)) -- cgit v1.2.3