diff --git a/package.json b/package.json index 1e54469..059d180 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "azure-odata-sql", - "version": "0.2.0", + "version": "0.2.4", "description": "Convert OData queries into SQL statements", "main": "src/index.js", "author": "Microsoft", @@ -10,8 +10,7 @@ "test": "npm run lint & mocha", "lint": "jshint src" }, - "dependencies": { - }, + "dependencies": {}, "devDependencies": { "chai": "^3.0.0", "jshint": "^2.9.1", diff --git a/src/booleanize.js b/src/booleanize.js index faef242..4181753 100644 --- a/src/booleanize.js +++ b/src/booleanize.js @@ -110,6 +110,7 @@ function isBooleanExpression(expr) { switch (expr.memberInfo.memberName) { case 'startswith': case 'endswith': + case 'contains': case 'substringof': return true; default: diff --git a/src/format.js b/src/format.js index f677392..946f88c 100644 --- a/src/format.js +++ b/src/format.js @@ -491,6 +491,19 @@ var SqlFormatter = types.deriveClass(ExpressionVisitor, ctor, { this.visit(args[0]); this.statement.sql += " + '%')"; + this.statement.sql += ')'; + } + else if (functionName == 'contains') { + this.statement.sql += '('; + this.visit(instance); + + this.statement.sql += ' LIKE '; + + // form '%' + + '%' + this.statement.sql += "('%' + "; + this.visit(args[0]); + this.statement.sql += " + '%')"; + this.statement.sql += ')'; } else if (functionName == 'startswith') { diff --git a/src/parseOData.js b/src/parseOData.js index 38df82a..0ec81ee 100644 --- a/src/parseOData.js +++ b/src/parseOData.js @@ -290,6 +290,7 @@ var ODataParser = types.defineClass(ctor, { this._validateFunctionParameters(functionName, functionArgs, 1); break; case 'substringof': + case 'contains': case 'startswith': case 'endswith': case 'concat': @@ -371,6 +372,9 @@ var ODataParser = types.defineClass(ctor, { else if (functionName == 'endswith') { return new expressions.MappedMemberInfo('string', functionName, false, true); } + else if (functionName == 'contains') { + return new expressions.MappedMemberInfo('string', functionName, false, true); + } else if (functionName == 'length') { return new expressions.MappedMemberInfo('string', functionName, false, false); }