Skip to content
This repository was archived by the owner on Apr 11, 2023. It is now read-only.

Commit fc1346b

Browse files
committed
add: storage model changes
1 parent d57b3f4 commit fc1346b

File tree

13 files changed

+144
-42
lines changed

13 files changed

+144
-42
lines changed

src/TypeSystem/TypeSystem.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,23 @@ $data.setGlobal = function(obj){
341341
getMember: function(name) {
342342
return this[memberDefinitionPrefix + name];
343343
},
344+
getDeepMember: function(name) {
345+
var member = this[memberDefinitionPrefix + name];
346+
347+
if(!member && name.indexOf('.') >= 0) {
348+
var path = name.split('.');
349+
var deepMember = deepMember = this[memberDefinitionPrefix + path[0]];
350+
var i = 1;
351+
for (; i < path.length; i++) {
352+
var type = Container.resolveType(deepMember.elementType || deepMember.type);
353+
deepMember = type.memberDefinitions.getMember(path[i]);
354+
}
355+
356+
if (i >= path.length) member = deepMember;
357+
}
358+
359+
return member;
360+
},
344361
setMember: function(value) {
345362
this[memberDefinitionPrefix + value.name] = value;
346363
}

src/Types/EntityContext.js

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ $data.Class.define('$data.StorageModel', null, null, {
1717
this.ComplexTypes = [];
1818
this.Enums = [];
1919
this.Associations = [];
20+
this.IsComplexType = false;
2021
},
2122
LogicalType: {},
2223
LogicalTypeName: {},
@@ -29,7 +30,8 @@ $data.Class.define('$data.StorageModel', null, null, {
2930
Enums: {},
3031
Associations: {},
3132
ContextType: {},
32-
Roles: {}
33+
Roles: {},
34+
IsComplexType: {}
3335
}, null);
3436
$data.Class.define('$data.Association', null, null, {
3537
constructor: function (initParam) {
@@ -42,6 +44,7 @@ $data.Class.define('$data.Association', null, null, {
4244
this.ToType = initParam.ToType;
4345
this.ToMultiplicity = initParam.ToMultiplicity;
4446
this.ToPropertyName = initParam.ToPropertyName;
47+
this.ReferentialConstraint = [].concat(initParam.ReferentialConstraint || []);
4548
}
4649
},
4750
From: {},
@@ -303,25 +306,29 @@ $data.Class.define('$data.EntityContext', null, null,
303306
},
304307
_createNavPropStorageModel: function(logicalType){
305308
var ctx = this;
306-
logicalType.memberDefinitions.getPublicMappedProperties().filter(function(it){ return it.inverseProperty; }).forEach(function(memDef){
307-
var item = Container.resolveType(memDef.elementType || memDef.dataType);
308-
if (!ctx._storageModel.filter(function(it){ return it.LogicalType == item; })[0]){
309-
var storageModel = new $data.StorageModel();
310-
storageModel.TableName = memDef.name;
311-
storageModel.TableOptions = item.tableOptions;
312-
storageModel.ItemName = item.name;
313-
storageModel.LogicalType = item;
314-
storageModel.LogicalTypeName = item.name;
315-
storageModel.PhysicalTypeName = $data.EntityContext._convertLogicalTypeNameToPhysical(storageModel.LogicalTypeName);
316-
storageModel.ContextType = ctx.getType();
309+
logicalType.memberDefinitions.getPublicMappedProperties()
310+
// .filter(function(it){ return it.inverseProperty; })
311+
.forEach(function(memDef){
312+
var item = Container.resolveType(memDef.elementType || memDef.dataType);
313+
if (item.isAssignableTo && item.isAssignableTo($data.Entity) && !ctx._storageModel.filter(function(it){ return it.LogicalType == item; })[0]){
314+
var storageModel = new $data.StorageModel();
315+
storageModel.TableName = memDef.name;
316+
storageModel.TableOptions = item.tableOptions;
317+
storageModel.ItemName = item.name;
318+
storageModel.LogicalType = item;
319+
storageModel.LogicalTypeName = item.name;
320+
storageModel.PhysicalTypeName = $data.EntityContext._convertLogicalTypeNameToPhysical(storageModel.LogicalTypeName);
321+
storageModel.ContextType = ctx.getType();
322+
storageModel.IsComplexType = !item.memberDefinitions.getPublicMappedProperties().filter(function(p) {return p.key}).length;
317323

318-
ctx._storageModel.push(storageModel);
319-
var name = Container.resolveName(item);
320-
ctx._storageModel[name] = storageModel;
324+
ctx._storageModel.push(storageModel);
325+
326+
var name = Container.resolveName(item);
327+
ctx._storageModel[name] = storageModel;
321328

322-
ctx._createNavPropStorageModel(storageModel.LogicalType);
323-
}
324-
});
329+
ctx._createNavPropStorageModel(storageModel.LogicalType);
330+
}
331+
});
325332
},
326333
_initStorageModelNavigationProperties: function _initStorageModelNavigationProperties(){
327334
for (var i = 0; i < this._storageModel.length; i++) {

src/Types/Expressions/EntityExpressions/CodeToEntityConverter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ $C('$data.Expressions.CodeToEntityConverter', $data.Expressions.ExpressionVisito
288288
var memDefExp = Container.createMemberInfoExpression(memDef);
289289
var result;
290290
//TODO!!!!
291-
if (Container.isPrimitiveType(Container.resolveType(memDef.dataType))) {
291+
if (Container.isPrimitiveType(Container.resolveType(memDef.dataType)) && !memDef.inverseProperty) {
292292
result = Container.createEntityFieldExpression(exp, memDefExp);
293293
return result;
294294
}

src/Types/Expressions/EntityExpressions/ComplexTypeExpression.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ $C('$data.Expressions.ComplexTypeExpression', $data.Expressions.ExpressionNode,
1414
Guard.requireType("selector", selector, [$data.Expressions.EntityExpression, $data.Expressions.MemberInfoExpression]);
1515
this.source = source;
1616
this.selector = selector;
17-
var dt = source.entityType.getMemberDefinition(selector.memberName).dataType;
17+
var memDef = source.entityType.getMemberDefinition(selector.memberName);
18+
var dt = memDef.elementType || memDef.dataType;
1819
var t = Container.resolveType(dt);
1920
this.entityType = t;
2021
},

src/Types/ModelBinder.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ $data.Class.define('$data.ModelBinder', null, null, {
301301
context.src += '}else{';
302302
}
303303
if (isEntityType) {
304-
context.src += item + ' = new (Container.resolveByIndex(' + typeIndex + '))(undefined, { setDefaultValues: false });';
304+
context.src += item + ' = (typeof ov !== "undefined" && ov) || new (Container.resolveByIndex(' + typeIndex + '))(undefined, { setDefaultValues: false });';
305305
} else if (isEnum) {
306306
context.src += item + ' = Container.resolveByIndex(' + typeIndex + ')[di["' + context.current + '"]];';
307307
} else {
@@ -361,11 +361,11 @@ $data.Class.define('$data.ModelBinder', null, null, {
361361
if (meta[i].$type) context.src += item + '.' + i + ' = fn(di);';else context.src += 'fn(di);';
362362
} else if (meta[i].$type) {
363363
context.meta.push(i);
364-
context.src += 'var fn = function(di){';
364+
context.src += 'var fn = function(di, ov){';
365365
this._buildSelector(meta[i], context);
366366
this.build(meta[i], context);
367367
context.src += 'return ' + context.item + ';};';
368-
if (meta[i].$type === $data.Object) context.src += item + '.' + i + ' = self._deepExtend(' + item + '.' + i + ', fn(di));';else context.src += item + '.' + i + ' = fn(di);';
368+
if (meta[i].$type === $data.Object) context.src += item + '.' + i + ' = self._deepExtend(' + item + '.' + i + ', fn(di));';else context.src += item + '.' + i + ' = fn(di, ' + item + '.' + i + ');';
369369
context.item = item;
370370
context.meta.pop();
371371
} else if (meta.$type) {

src/Types/StorageProviderBase.js

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,10 @@ $data.Class.define('$data.StorageProviderBase', null, null,
222222
keyProperties = [memDef.keys];
223223
} else if (memDef && Array.isArray(memDef.keys)) {
224224
keyProperties = [].concat(memDef.keys);
225+
} else if (memDef && typeof memDef.foreignKeys === "string" && memDef.foreignKeys) {
226+
keyProperties = [memDef.foreignKeys];
227+
} else if (memDef && Array.isArray(memDef.foreignKeys)) {
228+
keyProperties = [].concat(memDef.foreignKeys);
225229
}
226230

227231
association.ReferentialConstraint = association.ReferentialConstraint || [];
@@ -255,8 +259,29 @@ $data.Class.define('$data.StorageProviderBase', null, null,
255259
complexType.ReferentialConstraint = complexType.ReferentialConstraint || [];
256260

257261
complexType.ToType.memberDefinitions.getPublicMappedProperties().forEach(function (d) {
258-
instanceDefinition[complexType.FromPropertyName + '__' + d.name] = buildDbType_copyPropertyDefinition(d);
259-
complexType.ReferentialConstraint.push(buildDbType_createConstrain(complexType.ToType, complexType.FromType, d.name, complexType.FromPropertyName));
262+
if (d.inverseProperty) {
263+
var type = Container.resolveType(d.type);
264+
if (type.isAssignableTo && type.isAssignableTo($data.Entity)) {
265+
var keyProp = type.memberDefinitions.getPublicMappedProperties().filter(function(p) { return p.key })[0];
266+
267+
var keyPropName = (d.keys && d.keys[0]) || d.name + '__' + keyProp.name;
268+
269+
if (!instanceDefinition[complexType.FromPropertyName + '__' + keyPropName]) {
270+
instanceDefinition[complexType.FromPropertyName + '__' + keyPropName] = buildDbType_copyPropertyDefinition(keyProp);
271+
}
272+
273+
var constraint = { complexNavProperty: true };
274+
constraint[complexType.ToType.name] = d.name + '.' + keyProp.name;
275+
constraint[complexType.FromType.name] = complexType.FromPropertyName + '__' + keyPropName;
276+
complexType.ReferentialConstraint.push(constraint);
277+
}
278+
279+
} else {
280+
instanceDefinition[complexType.FromPropertyName + '__' + d.name] = buildDbType_copyPropertyDefinition(d);
281+
instanceDefinition[complexType.FromPropertyName + '__' + d.name].complexType = complexType;
282+
283+
complexType.ReferentialConstraint.push(buildDbType_createConstrain(complexType.ToType, complexType.FromType, d.name, complexType.FromPropertyName));
284+
}
260285
}, this);
261286
}, this);
262287
}
@@ -274,6 +299,33 @@ $data.Class.define('$data.StorageProviderBase', null, null,
274299
}
275300
}, this);
276301

302+
var getProp = function(container, path, throwWhenNoValue) {
303+
var p = path.split(".");
304+
var holder = container;
305+
for(var i = 0; i < p.length; i++) {
306+
holder = holder[p[i]];
307+
if(!holder) {
308+
if (throwWhenNoValue) throw 'no value';
309+
return holder;
310+
}
311+
}
312+
313+
return holder;
314+
}
315+
316+
var setProp = function (dbInstance, complexInstance, constrain, mapping) {
317+
var value = dbInstance[constrain[mapping.From]];
318+
try {
319+
if (!constrain.complexNavProperty || typeof value === "undefined") {
320+
value = getProp(complexInstance, constrain[mapping.To], constrain.complexNavProperty);
321+
}
322+
} catch (e) {
323+
return;
324+
}
325+
326+
dbInstance[constrain[mapping.From]] = value;
327+
}
328+
277329
if (storageModel.Associations) {
278330
storageModel.Associations.forEach(function (association) {
279331
if ((association.FromMultiplicity == "*" && association.ToMultiplicity == "0..1") || (association.FromMultiplicity == "0..1" && association.ToMultiplicity == "1")) {
@@ -285,7 +337,7 @@ $data.Class.define('$data.StorageProviderBase', null, null,
285337
(logicalEntity && !logicalEntity.changedProperties) ||
286338
(logicalEntity && logicalEntity.changedProperties && !logicalEntity.changedProperties.some(function(md){ return md.name == constrain[association.From]; }))
287339
)) {
288-
dbInstance[constrain[association.From]] = complexInstance[constrain[association.To]];
340+
dbInstance[constrain[association.From]] = getProp(complexInstance, constrain[association.To]);
289341
} else if (Guard.isNullOrUndefined(logicalEntity[constrain[association.From]])) {
290342
dbInstance[constrain[association.From]] = null;
291343
}
@@ -299,8 +351,13 @@ $data.Class.define('$data.StorageProviderBase', null, null,
299351
var complexInstance = logicalEntity[cmpType.FromPropertyName];
300352
if (complexInstance !== undefined) {
301353
cmpType.ReferentialConstraint.forEach(function (constrain) {
302-
if (complexInstance !== null) {
303-
dbInstance[constrain[cmpType.From]] = complexInstance[constrain[cmpType.To]];
354+
if (complexInstance !== null &&
355+
(
356+
(logicalEntity && !logicalEntity.changedProperties) ||
357+
(logicalEntity && logicalEntity.changedProperties && !logicalEntity.changedProperties.some(function(md){ return md.name == constrain[cmpType.From]; }))
358+
)) {
359+
setProp(dbInstance, complexInstance, constrain, cmpType);
360+
// dbInstance[constrain[cmpType.From]] = getProp(complexInstance, constrain[cmpType.To]);
304361
} else if (Guard.isNullOrUndefined(logicalEntity[constrain[association.From]])) {
305362
dbInstance[constrain[cmpType.From]] = null;
306363
}

src/Types/StorageProviders/InMemory/InMemoryProvider.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ $C('$data.storageProviders.InMemory.InMemoryProvider', $data.StorageProviderBase
4949
this.dataSource = { 'inmemory_sequence': {} };
5050
for(var index = 0;index<this.context._storageModel.length;index++){
5151
var storageModel = this.context._storageModel[index];
52+
if (storageModel.IsComplexType) continue;
5253
//Create store for EntitySet
5354
this.dataSource[storageModel.TableName] = [];
5455
//Check primary key

src/Types/StorageProviders/IndexedDB/IndexedDBStorageProvider.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ $data.Class.define('$data.storageProviders.indexedDb.IndexedDBStorageProvider',
167167
_getObjectStoreDefinitions: function () {
168168
var objectStoreDefinitions = [];
169169
var self = this;
170-
self.context._storageModel.forEach(function (memDef) {
170+
self.context._storageModel.filter(function(sm) { return !sm.IsComplexType }).forEach(function (memDef) {
171171
var objectStoreDefinition = self._getObjectStoreDefinition(memDef);
172172
objectStoreDefinitions.push(objectStoreDefinition);
173173
});
@@ -342,7 +342,7 @@ $data.Class.define('$data.storageProviders.indexedDb.IndexedDBStorageProvider',
342342
return ret;
343343
};
344344
var newSequences = [];
345-
self.context._storageModel.forEach(function (memDef) {
345+
self.context._storageModel.filter(function(sm) { return !sm.IsComplexType }).forEach(function (memDef) {
346346
function createStore() {
347347
/// <summary>
348348
/// Creates a store for 'memDef'

src/Types/StorageProviders/SqLite/SqLiteStorageProvider.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ $data.Class.define('$data.storageProviders.sqLite.SqLiteStorageProvider', $data.
182182

183183
initializeStore: function (callBack) {
184184
callBack = $data.PromiseHandlerBase.createCallbackSettings(callBack);
185-
this.context._storageModel.forEach(function (item, index) {
185+
this.context._storageModel.filter(function(sm) { return !sm.IsComplexType }).forEach(function (item, index) {
186186
this.SqlCommands.push(this.createSqlFromStorageModel(item) + " ");
187187
}, this);
188188

src/Types/StorageProviders/oData/oDataIncludeCompiler.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ $C('$data.storageProviders.oData.oDataIncludeCompiler', $data.Expressions.Entity
115115

116116
VisitAssociationInfoExpression: function (expression, context) {
117117
var propName = expression.associationInfo.FromPropertyName;
118-
if (this.entityContext._storageModel.getStorageModel(expression.associationInfo.FromType.inheritsFrom)){
118+
var sm = this.entityContext._storageModel.getStorageModel(expression.associationInfo.FromType.inheritsFrom);
119+
if (sm && !sm.IsComplexType) {
119120
propName = expression.associationInfo.FromType.fullName + "/" + propName;
120121
}
121122

0 commit comments

Comments
 (0)