Add views of the field in the loading strategy

This strategy limits the selection of other fields to load in bunch to those
sharing at least one common view.

issue7359
review47351002
This commit is contained in:
Cédric Krier
2018-06-20 11:22:18 +02:00
parent d687d6e0ac
commit 1d8798da2a
4 changed files with 60 additions and 31 deletions
+1
View File
@@ -1,3 +1,4 @@
* Improve loading strategy by using views
* Add support of width attribute on tree view
* Use non conflicting keyboard shortcuts
* Use the context to get the suffix of window name
+27 -22
View File
@@ -566,42 +566,46 @@
}
var id2record = {};
id2record[this.id] = this;
var loading;
var loading, views, field;
if (name == '*') {
loading = 'eager';
views = new Set();
var views_add = function(view) {
views.add(view);
};
for (fname in this.model.fields) {
if (!this.model.fields.hasOwnProperty(fname)) {
continue;
}
var field_loading = (
this.model.fields[fname].description.loading ||
'eager');
if (field_loading != 'eager') {
field = this.model.fields[fname];
if ((field.description.loading || 'eager') == 'lazy') {
loading = 'lazy';
break;
}
field.views.forEach(views_add);
}
} else {
loading = (this.model.fields[name].description.loading ||
'eager');
loading = this.model.fields[name].description.loading || 'eager';
views = this.model.fields[name].views;
}
var fnames = [];
var fields = {};
if (loading == 'eager') {
for (fname in this.model.fields) {
if (!this.model.fields.hasOwnProperty(fname)) {
continue;
}
if ((this.model.fields[fname].description.loading ||
'eager') == 'eager') {
fnames.push(fname);
field = this.model.fields[fname];
if ((field.description.loading || 'eager') == 'eager') {
fields[fname] = field;
}
}
} else {
fnames = Object.keys(this.model.fields);
fields = this.model.fields;
}
var fnames = [];
for (fname in fields) {
field = fields[fname];
if (!(fname in this._loaded) &&
(!views.size ||
Sao.common.intersect(
Array.from(views).sort(),
Array.from(field.views).sort()))) {
fnames.push(fname);
}
}
fnames = fnames.filter(function(e, i, a) {
return !(e in this._loaded);
}.bind(this));
var fnames_to_fetch = fnames.slice();
var rec_named_fields = ['many2one', 'one2one', 'reference'];
for (var i in fnames) {
@@ -1368,6 +1372,7 @@
init: function(description) {
this.description = description;
this.name = description.name;
this.views = new Set();
},
set: function(record, value) {
record._values[this.name] = value;
+17 -6
View File
@@ -793,6 +793,9 @@
}
}
this.group.add_fields(fields);
for (field in fields) {
this.group.model.fields[field].views.add(view_id);
}
var view_widget = Sao.View.parse(this, xml_view, view.field_childs);
view_widget.view_id = view_id;
this.views.push(view_widget);
@@ -1009,13 +1012,14 @@
return context;
},
set_group: function(group) {
var fields = {};
var fields = {},
fields_views = {},
name;
if (this.group) {
for (var name in this.group.model.fields) {
if (!this.group.model.fields.hasOwnProperty(name)) {
continue;
}
fields[name] = this.group.model.fields[name].description;
for (name in this.group.model.fields) {
var field = this.group.model.fields[name];
fields[name] = field.description;
fields_views[name] = field.views;
}
this.group.screens.splice(
this.group.screens.indexOf(this), 1);
@@ -1037,6 +1041,13 @@
this.set_current_record(null);
}
this.group.add_fields(fields);
var views_add = function(view) {
this.group.model.fields[name].views.add(view);
}.bind(this);
for (name in fields_views) {
var views = fields_views[name];
views.forEach(views_add);
}
},
new_group: function(context) {
if (!context) {
+15 -3
View File
@@ -314,14 +314,26 @@ function eval_pyson(value){
var promesses = [];
if (record) {
// Force to set fields in record
// Get first the lazy one to reduce number of requests
// Get first the lazy one from the view to reduce number of requests
var fields = [];
for (name in record.model.fields) {
field = record.model.fields[name];
fields.push([name, field.description.loading || 'eager']);
if (field.views.has(this.view_id)) {
fields.push([
name,
field.description.loading || 'eager' == 'eager',
field.views.size,
]);
}
}
fields.sort(function(a, b) {
return a[1].localeCompare(b[1]);
if (!a[1] && b[1]) {
return -1;
} else if (a[1] && !b[1]) {
return 1;
} else {
return a[2] - b[2];
}
});
fields.forEach(function(e) {
var name = e[0];