You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ko...@apache.org on 2014/06/24 10:58:59 UTC

git commit: [OLINGO-324] modify context type detection and first tests for this II

Repository: olingo-odata4-js
Updated Branches:
  refs/heads/OLINGO-324 ab2587ef3 -> b45ddd74d


[OLINGO-324] modify context type detection and first tests for this II


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/commit/b45ddd74
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/tree/b45ddd74
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/diff/b45ddd74

Branch: refs/heads/OLINGO-324
Commit: b45ddd74d4390c66f37bd30dc03d9d1e8006c476
Parents: ab2587e
Author: Sven Kobler <sv...@sap.com>
Authored: Tue Jun 24 10:58:07 2014 +0200
Committer: Sven Kobler <sv...@sap.com>
Committed: Tue Jun 24 10:58:19 2014 +0200

----------------------------------------------------------------------
 datajs/src/lib/odata/json-light.js     | 234 ++++++++++------------------
 datajs/tests/odata-json-parse-tests.js |  49 +++---
 2 files changed, 113 insertions(+), 170 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/b45ddd74/datajs/src/lib/odata/json-light.js
----------------------------------------------------------------------
diff --git a/datajs/src/lib/odata/json-light.js b/datajs/src/lib/odata/json-light.js
index 12c5d84..eddd58c 100644
--- a/datajs/src/lib/odata/json-light.js
+++ b/datajs/src/lib/odata/json-light.js
@@ -56,6 +56,7 @@ var lookupComplexType = oDataUtils.lookupComplexType;
 var lookupDefaultEntityContainer = oDataUtils.lookupDefaultEntityContainer;
 var lookupEntityContainer = oDataUtils.lookupEntityContainer;
 var lookupEntitySet = oDataUtils.lookupEntitySet;
+var lookupSingleton = oDataUtils.lookupSingleton;
 var lookupEntityType = oDataUtils.lookupEntityType;
 var lookupFunctionImport = oDataUtils.lookupFunctionImport;
 var lookupNavigationPropertyType = oDataUtils.lookupNavigationPropertyType;
@@ -66,7 +67,6 @@ var parseBool = oDataUtils.parseBool;
 var parseDateTime = oDataUtils.parseDateTime;
 var parseDateTimeOffset = oDataUtils.parseDateTimeOffset;
 var parseDuration = oDataUtils.parseDuration;
-
 // CONTENT START
 
 var PAYLOADTYPE_FEED = "f";
@@ -1055,62 +1055,15 @@ var jsonLightMakePayloadInfo = function (kind, type) {
 /// <summary>Creates an object containing information for the context</summary>
 /// ...
 /// <returns type="Object">Object with type information
-/// attribute detectedPayloadKind: see constants starting with PAYLOADTYPE_
-/// attribute deltaKind: deltainformation, one of the following valus DELTATYPE_FEED | DELTATYPE_DELETED_ENTRY | DELTATYPE_LINK | DELTATYPE_DELETED_LINK
-/// attribute typeName: name of the type
-/// attribute type: object containing type information for entity- and complex-types
+/// attribute detectedPayloadKind(optional): see constants starting with PAYLOADTYPE_
+/// attribute deltaKind(optional): deltainformation, one of the following valus DELTATYPE_FEED | DELTATYPE_DELETED_ENTRY | DELTATYPE_LINK | DELTATYPE_DELETED_LINK
+/// attribute typeName(optional): name of the type
+/// attribute type(optional): object containing type information for entity- and complex-types ( null if a typeName is a primitive)
 ///  </returns>
 var parseContextUriFragment = function( fragment, model ) {
     var ret = {};
 
-    ret.deltaKind = undefined;
-    if (utils.endsWith(fragment, '/$delta')) {
-        ret.deltaKind = DELTATYPE_FEED;
-        fragment = fragment.substring(fragment.lenght - 7);
-    } else if (utils.endsWith(fragment, '/$deletedEntity')) {
-        ret.deltaKind = DELTATYPE_DELETED_ENTRY;
-        fragment = fragment.substring(fragment.lenght - 15);
-    } else if (utils.endsWith(fragment, '/$link')) {
-        ret.deltaKind = DELTATYPE_LINK;
-        fragment = fragment.substring(fragment.lenght - 6);
-    } else if (utils.endsWith(fragment, '/$deletedLink')) {
-        ret.deltaKind = DELTATYPE_DELETED_LINK;
-        fragment = fragment.substring(fragment.lenght - 13);
-    }
-
-    if (utils.endsWith(fragment,")")) {
-        //remove the query function, cut fragment to matching '('
-        var index = fragment.lenght - 2 ;
-        for ( var rCount = 1; rcount > 0 && index > 0; --index) {
-            if ( fragment.charAt(index)=='(') {
-                rCount ++;
-            } else if ( fragment.charAt(index)==')') {
-                rCount --;    
-            }
-        }
-
-        if (index === 0) {
-            //TODO throw error
-        }
-
-        var previous = fragment.substring(0, index + 1);
-
-
-        if (previous !== 'Collection') { // Don't treat Collection(Edm.Type) as SelectExpand segment
-            var selectExpandStr = fragment.substring(index+2, fragment.length - 1);
-            var keyPattern = /^(?:-{0,1}\d+?|\w*'.+?'|[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}|.+?=.+?)$/;
-            var matches = keyPattern.exec(selectExpandStr);
-            if ( matches ) {
-                 //TODO throw error
-            }
-
-            ret.selectQueryOptionString = selectExpandStr;
-            fragment = previous;
-        }
-
-    }
-
-    ret.detectedPayloadKind = undefined;
+    
     if (fragment.indexOf('/') === -1 ) {
         if (fragment.length === 0) {
             // Capter 10.1
@@ -1118,7 +1071,7 @@ var parseContextUriFragment = function( fragment, model ) {
             return ret;
         } else if (fragment === 'Edm.Null') {
             // Capter 10.15
-            ret.detectedPayloadKind = PAYLOADTYPE_PROPERTY;
+            ret.detectedPayloadKind = PAYLOADTYPE_VALUE;
             ret.isNullProperty = true;
             return ret;
         } else if (fragment === 'Collection($ref)') {
@@ -1134,34 +1087,54 @@ var parseContextUriFragment = function( fragment, model ) {
         }
     } 
 
-    ret.lastType = undefined;
-    ret.lastTypeName = undefined;
-    ret.detectedPayloadKind = undefined;
+    ret.type = undefined;
+    ret.typeName = undefined;
 
-    // split fragment at '/'
-    //TODO changes
     var fragmentParts = fragment.split("/");
     
-
     for(var i = 0; i < fragmentParts.length; ++i) {
         var fragment = fragmentParts[i];
-        if (ret.lastTypeName === undefined) {
+        if (ret.typeName === undefined) {
             //preparation
-            var startPharen = fragment.indexOf('(')
-            var inPharenthesis = undefined;
-            if ( startPharen !== -1 ) {
+            if ( fragment.indexOf('(') !== -1 ) {
+                //remove the query function, cut fragment to matching '('
+                var index = fragment.length - 2 ;
+                for ( var rCount = 1; rCount > 0 && index > 0; --index) {
+                    if ( fragment.charAt(index)=='(') {
+                        rCount --;
+                    } else if ( fragment.charAt(index)==')') {
+                        rCount ++;    
+                    }
+                }
+
+                if (index === 0) {
+                    //TODO throw error
+                }
+
                 //remove the projected entity from the fragment; TODO decide if we want to store the projected entity 
-                inPharenthesis = fragment.substring(startPharen+1,fragment.length - 1);
-                // projection: Capter 10.7, 10.8 and 10.9
-                fragment = fragment.substring(0,startPharen);
+                var inPharenthesis = fragment.substring(index+2,fragment.length - 1);
+                fragment = fragment.substring(0,index+1);
 
                 if (utils.startsWith(fragment, 'Collection')) {
                     ret.detectedPayloadKind = PAYLOADTYPE_COLLECTION;
                     // Capter 10.14
-                    ret.lastTypeName = inPharenthesis;
+                    ret.typeName = inPharenthesis;
 
-                    ret.lastType = lookupEntityType( ret.lastTypeName, model);
+                    var type = lookupEntityType(ret.typeName, model);
+                    if ( type !== null) {
+                        ret.type = type;
+                        continue;
+                    }
+                    type = lookupComplexType(ret.typeName, model);
+                    if ( type !== null) {
+                        ret.type = type;
+                        continue;
+                    }
+
+                    ret.type = null;//in case of #Collection(Edm.String) only lastTypeName is filled
+                    continue;
                 } else {
+                    // projection: Capter 10.7, 10.8 and 10.9
                     ret.projection = inPharenthesis;
                 }
             }
@@ -1170,9 +1143,9 @@ var parseContextUriFragment = function( fragment, model ) {
 
             //check for entity
             var entitySet = lookupEntitySet(container.entitySet, fragment);
-            if ( entitySet !== undefined) {
-                ret.lastTypeName = entitySet.entityType;
-                ret.lastType = lookupEntityType( ret.lastTypeName, model);
+            if ( entitySet !== null) {
+                ret.typeName = entitySet.entityType;
+                ret.type = lookupEntityType( ret.typeName, model);
                 ret.detectedPayloadKind = PAYLOADTYPE_FEED;
                 // Capter 10.2
                 continue;
@@ -1180,14 +1153,22 @@ var parseContextUriFragment = function( fragment, model ) {
 
             //check for singleton
             var singleton = lookupSingleton(container.singleton, fragment);
-            if ( singleton !== undefined) {
-                ret.lastTypeName = singleton.entityType;
-                ret.lastType = lookupEntityType( ret.lastTypeName, model);
+            if ( singleton !== null) {
+                ret.typeName = singleton.entityType;
+                ret.type = lookupEntityType( ret.typeName, model);
                 ret.detectedPayloadKind =  PAYLOADTYPE_ENTRY;
                 // Capter 10.4
                 continue;
             }
 
+            if (jsonLightIsPrimitiveType(fragment)) {
+                ret.typeName = fragment;
+                ret.type = null;
+                ret.detectedPayloadKind = PAYLOADTYPE_VALUE;
+                continue;
+            }
+
+            //TODO throw ERROR
         } else {
             //check for $entity
             if (utils.endsWith(fragment, '$entity') && (ret.detectedPayloadKind === PAYLOADTYPE_FEED)) {
@@ -1199,99 +1180,50 @@ var parseContextUriFragment = function( fragment, model ) {
             //check for derived types
             if (fragment.indexOf('.') !== -1) {
                 // Capter 10.6
-                ret.lastTypeName = fragment;
-                var type = lookupEntityType(ret.lastTypeName, model);
-                if ( entitySet !== undefined) {
-                    ret.lastType = type;
+                ret.typeName = fragment;
+                var type = lookupEntityType(ret.typeName, model);
+                if ( type !== null) {
+                    ret.type = type;
                     continue;
                 }
-                type = lookupComplexType(ret.lastTypeName, model);
-                if ( entitySet !== undefined) {
-                    ret.lastType = type;
+                type = lookupComplexType(ret.typeName, model);
+                if ( type !== null) {
+                    ret.type = type;
                     continue;
                 }
 
-                //ERROR invalid type
+                //TODO throw ERROR invalid type
             }
 
             //check for property value
             if ( ret.detectedPayloadKind === PAYLOADTYPE_FEED || ret.detectedPayloadKind === PAYLOADTYPE_ENTRY) {
-                var property = lookupProperty(ret.lastType.properties, fragment);
-                if (property !== undefined) {
-                    ret.lastTypeName = property.type;
-                    if (!jsonLightIsPrimitiveType(ret.lastTypeName)) {
-                        ret.lastType = lookupComplexType(ret.lastTypeName, model);
-                    } else {
-                        ret.lastType = undefined;
-                    }
-                    ret.detectedPayloadKind === PAYLOADTYPE_PROPERTY;
+                var property = lookupProperty(ret.type.property, fragment);
+                if (property !== null) {
+                    ret.typeName = property.type;
+                    ret.type = lookupComplexType(ret.typeName, model);
+                    ret.detectedPayloadKind = PAYLOADTYPE_PROPERTY;
                     // Capter 10.15
                 }
                 continue;
             }
-        }
-    }
-    return ret;
-
-/*
-        var qualifiedName = fragmentParts[0];
-        var typeCast = fragmentParts[1];
-
-        if () {
-            ret.detectedPayloadKind  = PAYLOADTYPE_VALUE;
-            return ret;
-        }
-
-        if (isCollectionType(qualifiedName)) {
-            return ret;
-        }
-
-        var entityType = typeCast;
-        var entitySet, functionImport, containerName;
-        if (!typeCast) {
-            var nsEnd = qualifiedName.lastIndexOf(".");
-            var simpleName = qualifiedName.substring(nsEnd + 1);
-            var container = (simpleName === qualifiedName) ?
-                lookupDefaultEntityContainer(model) :
-                lookupEntityContainer(qualifiedName.substring(0, nsEnd), model);
-
-            if (container) {
-                entitySet = lookupEntitySet(container.entitySet, simpleName);
-                functionImport = container.functionImport;
-                containerName = container.name;
-                entityType = !!entitySet ? entitySet.entityType : null;
-            }
-        }
-
-        var info;
-        if (d > 0) {
-            info = jsonLightMakePayloadInfo(PAYLOADTYPE_OBJECT, entityType);
-            info.entitySet = entitySet;
-            info.functionImport = functionImport;
-            info.containerName = containerName;
-            return info;
-        }
 
-        if (entityType) {
-            info = jsonLightMakePayloadInfo(PAYLOADTYPE_FEED, entityType);
-            info.entitySet = entitySet;
-            info.functionImport = functionImport;
-            info.containerName = containerName;
-            return info;
-        }
-
-        if (isArray(data.value) && !lookupComplexType(qualifiedName, model)) {
-            var item = data.value[0];
-            if (!isPrimitive(item)) {
-                if (jsonLightIsEntry(item) || !inferFeedAsComplexType) {
-                    return jsonLightMakePayloadInfo(PAYLOADTYPE_FEED, null);
-                }
+            if (fragment === '$delta') {
+                ret.deltaKind = DELTATYPE_FEED;
+                continue;
+            } else if (utils.endsWith(fragment, '/$deletedEntity')) {
+                ret.deltaKind = DELTATYPE_DELETED_ENTRY;
+                continue;
+            } else if (utils.endsWith(fragment, '/$link')) {
+                ret.deltaKind = DELTATYPE_LINK;
+                continue;
+            } else if (utils.endsWith(fragment, '/$deletedLink')) {
+                ret.deltaKind = DELTATYPE_DELETED_LINK;
+                continue;
             }
+            //TODO throw ERROr
         }
-
-        return jsonLightMakePayloadInfo(PAYLOADTYPE_OBJECT, qualifiedName);
     }
-*/
+    return ret;
 };
 
 var jsonLightPayloadInfo = function (data, model) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/b45ddd74/datajs/tests/odata-json-parse-tests.js
----------------------------------------------------------------------
diff --git a/datajs/tests/odata-json-parse-tests.js b/datajs/tests/odata-json-parse-tests.js
index c2dd33a..eaeefa8 100644
--- a/datajs/tests/odata-json-parse-tests.js
+++ b/datajs/tests/odata-json-parse-tests.js
@@ -24,8 +24,6 @@
     }
 
     function runWithMetadata(metaDatasuccess) {
-
-        
         var oHeaders = {
             'Accept': 'text/html,application/xhtml+xml,application/xml,application/json;odata.metadata=full',
             "Odata-Version": "4.0",
@@ -43,57 +41,70 @@
     };
 
     djstest.addTest(function test1() {
-        var checkLastTypeName = function (metadata, input, expected) {
+        var checkAll = function (metadata, input, expected) {
+            var info = OData.jsonLight.jsonLightPayloadInfo({ "@odata.context" : input}, metadata)
+            djstest.assertAreEqual(info,expected, "Test context fragment: "+ input);
+        };
+
+        var checkLastTypeName = function (metadata, input, expectedKind, expectedLastTypeName) {
             var info = OData.jsonLight.jsonLightPayloadInfo({ "@odata.context" : input}, metadata)
-            djstest.assertAreEqual(info.lastTypeName,expected, "Test context fragment: "+ input);
+            djstest.assertAreEqual(info.detectedPayloadKind,expectedKind, "Test context fragment: "+ input);
+            djstest.assertAreEqual(info.typeName,expectedLastTypeName, "Test context fragment: "+ input);
+        };
 
+        var checkProjection = function (metadata, input, expectedKind, expectedLastTypeName, projection) {
+            var info = OData.jsonLight.jsonLightPayloadInfo({ "@odata.context" : input}, metadata)
+            djstest.assertAreEqual(info.detectedPayloadKind,expectedKind, "Test context fragment: "+ input);
+            djstest.assertAreEqual(info.typeName,expectedLastTypeName, "Test context fragment: "+ input);
+            djstest.assertAreEqual(info.projection,projection, "Test context fragment: "+ input);
         };
 
         var checkKind = function (metadata, input, expected) {
             var info = OData.jsonLight.jsonLightPayloadInfo({ "@odata.context" : input}, metadata)
             djstest.assertAreEqual(info.detectedPayloadKind,expected, "Test context fragment: "+ input);
         };
+
         var success = function(metadata){
             //Chapter 10.1
             checkKind(metadata, '#', 's');
             //Chapter 10.2
-            checkKind(metadata, '#Foods', 'f');
+            checkLastTypeName(metadata, '#Foods', 'f', 'DataJS.Tests.V4.Food');
             //Chapter 10.3
-            checkKind(metadata, '#Foods/$entity', 'e');
+            checkLastTypeName(metadata, '#Foods/$entity', 'e', 'DataJS.Tests.V4.Food');
             //Chapter 10.4
             //checkKind(metadata, '#Singleton', '');
             //Chapter 10.5
-            checkKind(metadata, '#Foods/DataJS.Tests.V4.Food', 'f');
+            checkLastTypeName(metadata, '#Foods/DataJS.Tests.V4.Food', 'f', 'DataJS.Tests.V4.Food');
             //Chapter 10.6
-            checkKind(metadata, '#Foods/DataJS.Tests.V4.Food/$entity', 'e');
+            checkLastTypeName(metadata, '#Foods/DataJS.Tests.V4.Food/$entity', 'e', 'DataJS.Tests.V4.Food');
             //Chapter 10.7
-            checkKind(metadata, '#Foods(FoodID,Name)', 'f');
+            checkProjection(metadata, '#Foods(FoodID,Name)', 'f', 'DataJS.Tests.V4.Food','FoodID,Name');
             //Chapter 10.8
-            checkKind(metadata, '#Foods(FoodID,Name)/$entity', 'e');
+            checkProjection(metadata, '#Foods(FoodID,Name)/$entity', 'e', 'DataJS.Tests.V4.Food','FoodID,Name');
             //Chapter 10.9
-            checkKind(metadata, '#Foods(FoodID,Name,Category,Category+(CategoryID,Name))', 'f');
+            checkProjection(metadata, '#Foods(FoodID,Name,Category,Category+(CategoryID,Name))', 'f', 
+                'DataJS.Tests.V4.Food','FoodID,Name,Category,Category+(CategoryID,Name)');
             //Chapter 10.10
-            checkKind(metadata, '#Foods(FoodID,Name,Category,Category+(CategoryID,Name))/$entity', 'e');
+            checkProjection(metadata, '#Foods(FoodID,Name,Category,Category+(CategoryID,Name))/$entity', 'e',
+                'DataJS.Tests.V4.Food','FoodID,Name,Category,Category+(CategoryID,Name)');
             //Chapter 10.11
             checkKind(metadata, '#Collection($ref)', 'erls');
             //Chapter 10.12
             checkKind(metadata, '#$ref', 'erl');
             //Chapter 10.13
-            checkKind(metadata, '#Foods(0)/Packaging', 'p');
+            checkKind(metadata, '#Foods(0)/Packaging', 'p', 'DataJS.Tests.V4.Package');
             //Chapter 10.14
-            checkKind(metadata, '#Collection(Edm.String)', 'c');
+            checkKind(metadata, '#Collection(Edm.String)', 'c',  'Edm.String');
             //Chapter 10.15
             checkKind(metadata, '#Edm.String', 'v');
-            //TODO add tests for delta tokens
-
 
-
-            checkLastTypeName(metadata, '#Foods', 'DataJS.Tests.V4.Food');
+            checkKind(metadata, '#Edm.Null', 'v');
+            //TODO add tests for delta tokens
             djstest.done();
         };
 
         runWithMetadata(success);
-    },'simple');
+    },'test jsonLightPayloadInfo');
 
 
 })(this);