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:
@@ -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
@@ -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
@@ -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
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user