jaydata
Version:
Cross-platform HTML5 data-management, JavaScript Language Query (JSLQ) support for OData, SQLite, WebSQL, IndexedDB, YQL and Facebook (packaged for Node.JS)
935 lines (812 loc) • 43.5 kB
JavaScript
// JayData 1.5.10
// Dual licensed under MIT and GPL v2
// Copyright JayStack Technologies (http://jaydata.org/licensing)
//
// JayData is a standards-based, cross-platform Javascript library and a set of
// practices to access and manipulate data from various online and offline sources.
//
// Credits:
// Hajnalka Battancs, Dániel József, János Roden, László Horváth, Péter Nochta
// Péter Zentai, Róbert Bónay, Szabolcs Czinege, Viktor Borza, Viktor Lázár,
// Zoltán Gyebrovszki, Gábor Dolla
//
// More info: http://jaydata.org
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define("jaydata/yql",["jaydata/core"],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.$data = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
;
var _core = _dereq_('jaydata/core');
var _core2 = _interopRequireDefault(_core);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_core2.default.Class.define("$data.Yahoo.YQLContext", _core2.default.EntityContext, null, {
//Geo
Continents: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.continent, tableName: 'geo.continents' },
Counties: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.county, tableName: 'geo.counties' },
Countries: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.country, tableName: 'geo.countries' },
Districts: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.district, tableName: 'geo.districts' },
Oceans: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.ocean, tableName: 'geo.oceans' },
Places: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.place, tableName: 'geo.places' },
PlaceTypes: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.placetype, tableName: 'geo.placetypes' },
PlaceSiblings: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.sibling, tableName: 'geo.places.siblings' },
PlaceParents: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.parent, tableName: 'geo.places.parent' },
PlaceNeighbors: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.neighbor, tableName: 'geo.places.neighbors' },
PlaceCommons: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.common, tableName: 'geo.places.common' },
PlaceChildrens: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.children, tableName: 'geo.places.children' },
PlaceBelongtos: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.belongto, tableName: 'geo.places.belongtos' },
PlaceAncestors: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.ancestor, tableName: 'geo.places.ancestors' },
Seas: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.sea, tableName: 'geo.seas' },
States: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.state, tableName: 'geo.states' },
PlaceDescendants: { type: _core2.default.EntitySet, elementType: _core2.default.Yahoo.types.Geo.descendant, tableName: 'geo.places.descendants' },
placeTypeNameRef: { value: _core2.default.Yahoo.types.Geo.placeTypeNameCf },
centroidRef: { value: _core2.default.Yahoo.types.Geo.centroidCf },
countryRef: { value: _core2.default.Yahoo.types.Geo.countryCf },
adminRef: { value: _core2.default.Yahoo.types.Geo.adminCf },
localityRef: { value: _core2.default.Yahoo.types.Geo.localityCf },
postalRef: { value: _core2.default.Yahoo.types.Geo.postalCf },
boundingBoxRef: { value: _core2.default.Yahoo.types.Geo.boundingBoxCf },
//Data
Atom: {
anonymousResult: true,
tableName: 'atom',
resultPath: ["query", "results"],
resultSkipFirstLevel: true,
type: _core2.default.EntitySet,
elementType: _core2.default.Class.define("$data.Yahoo.types.YQLAtom", _core2.default.Entity, null, {
url: { type: 'string', required: true, searchable: true }
}, null)
},
Csv: {
anonymousResult: true,
tableName: 'csv',
resultPath: ["query", "results"],
resultSkipFirstLevel: true,
type: _core2.default.EntitySet,
elementType: _core2.default.Class.define("$data.Yahoo.types.YQLCsv", _core2.default.Entity, null, {
url: { type: 'string', required: true, searchable: true },
charset: { type: 'string', searchable: true },
columns: { type: 'string', searchable: true }
}, null)
},
DataUri: {
anonymousResult: true,
tableName: 'data.uri',
resultPath: ["query", "results"],
resultSkipFirstLevel: true,
type: _core2.default.EntitySet,
elementType: _core2.default.Class.define("$data.Yahoo.types.YQLDataUri", _core2.default.Entity, null, {
url: { type: 'string', required: true, searchable: true }
}, null)
},
Feed: {
anonymousResult: true,
tableName: 'feed',
resultPath: ["query", "results"],
resultSkipFirstLevel: true,
type: _core2.default.EntitySet,
elementType: _core2.default.Class.define("$data.Yahoo.types.YQLFeed", _core2.default.Entity, null, {
url: { type: 'string', required: true, searchable: true }
}, null)
},
FeedNormalizer: {
anonymousResult: true,
tableName: 'feednormalizer',
resultPath: ["query", "results"],
resultSkipFirstLevel: true,
type: _core2.default.EntitySet,
elementType: _core2.default.Class.define("$data.Yahoo.types.YQLFeedNormalizer", _core2.default.Entity, null, {
url: { type: 'string', required: true, searchable: true },
output: { type: 'string', searchable: true },
prexslurl: { type: 'string', searchable: true },
postxslurl: { type: 'string', searchable: true },
timeout: { type: 'string', searchable: true }
}, null)
},
Html: {
anonymousResult: true,
tableName: 'html',
resultPath: ["query", "results"],
resultSkipFirstLevel: true,
type: _core2.default.EntitySet,
elementType: _core2.default.Class.define("$data.Yahoo.types.YQLHtml", _core2.default.Entity, null, {
url: { type: 'string', required: true, searchable: true },
charset: { type: 'string', searchable: true },
browser: { type: 'bool', searchable: true },
xpath: { type: 'string', searchable: true },
compat: { type: 'string', searchable: true, description: "valid values for compat is 'html5' and 'html4'" },
Result: { type: 'string', searchable: true }
}, null)
},
Json: {
anonymousResult: true,
tableName: 'json',
resultPath: ["query", "results"],
resultSkipFirstLevel: true,
type: _core2.default.EntitySet,
elementType: _core2.default.Class.define("$data.Yahoo.types.YQLJson", _core2.default.Entity, null, {
url: { type: 'string', required: true, searchable: true },
itemPath: { type: 'string', searchable: true }
}, null)
},
Rss: {
anonymousResult: false,
tableName: 'rss',
resultPath: ["query", "results"],
resultSkipFirstLevel: true,
type: _core2.default.EntitySet,
elementType: _core2.default.Class.define("$data.Yahoo.types.YQLRss", _core2.default.Entity, null, {
url: { type: 'string', required: true, searchable: true },
guid: { type: 'GuidField' },
title: { type: 'string' },
description: { type: 'string' },
link: { type: 'string' },
pubDate: { type: 'string' }
}, null)
},
GuidField: {
type: _core2.default.Class.define("GuidField", _core2.default.Entity, null, {
isPermaLink: { type: 'string' },
content: { type: 'string' }
}, null)
},
Xml: {
anonymousResult: true,
tableName: 'xml',
resultPath: ["query", "results"],
resultSkipFirstLevel: true,
type: _core2.default.EntitySet,
elementType: _core2.default.Class.define("$data.Yahoo.types.YQLXml", _core2.default.Entity, null, {
url: { type: 'string', required: true, searchable: true },
itemPath: { type: 'string', searchable: true }
}, null)
},
Xslt: {
anonymousResult: true,
tableName: 'xslt',
resultPath: ["query", "results"],
resultSkipFirstLevel: true,
type: _core2.default.EntitySet,
elementType: _core2.default.Class.define("$data.Yahoo.types.YQLXslt", _core2.default.Entity, null, {
url: { type: 'string', searchable: true },
xml: { type: 'string', searchable: true },
stylesheet: { type: 'string', searchable: true },
stylesheetliteral: { type: 'string', searchable: true },
wrapperelement: { type: 'string', searchable: true }
}, null)
}
}, null);
},{"jaydata/core":"jaydata/core"}],2:[function(_dereq_,module,exports){
;
var _core = _dereq_('jaydata/core');
var _core2 = _interopRequireDefault(_core);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_core2.default.Class.define('$data.Yahoo.types.Geo.placeTypeNameCf', _core2.default.Entity, null, {
code: { type: 'string' },
content: { type: 'string' }
}, null);
_core2.default.Class.define('$data.Yahoo.types.Geo.countryCf', _core2.default.Entity, null, {
code: { type: 'string' },
type: { type: 'string' },
content: { type: 'string' }
}, null);
_core2.default.Class.define('$data.Yahoo.types.Geo.adminCf', _core2.default.Entity, null, {
code: { type: 'string' },
type: { type: 'string' },
content: { type: 'string' }
}, null);
_core2.default.Class.define('$data.Yahoo.types.Geo.localityCf', _core2.default.Entity, null, {
code: { type: 'string' },
content: { type: 'string' }
}, null);
_core2.default.Class.define('$data.Yahoo.types.Geo.centroidCf', _core2.default.Entity, null, {
latitude: { type: 'string' },
longitude: { type: 'string' }
}, null);
_core2.default.Class.define('$data.Yahoo.types.Geo.postalCf', _core2.default.Entity, null, {
type: { type: 'string' },
content: { type: 'string' }
}, null);
_core2.default.Class.define('$data.Yahoo.types.Geo.boundingBoxCf', _core2.default.Entity, null, {
southWest: { type: 'centroidRef' },
northEast: { type: 'centroidRef' }
}, null);
_core2.default.Class.define('$data.Yahoo.types.Geo.PlaceMeta', null, null, {
woeid: { type: 'int', key: true },
name: { type: 'string' },
uri: { type: 'string' },
placeTypeName: { type: 'placeTypeNameRef' },
lang: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.PlaceMetaFull', [{ type: null }, { type: _core2.default.Yahoo.types.Geo.PlaceMeta }], null, {
country: { type: 'countryRef' },
admin1: { type: 'adminRef' },
admin2: { type: 'adminRef' },
admin3: { type: 'adminRef' },
locality1: { type: 'localityRef' },
locality2: { type: 'localityRef' },
postal: { type: 'postalRef' },
centroid: { type: 'centroidRef' },
boundingBox: { type: 'boundingBoxRef' },
areaRank: { type: 'int' },
popRank: { type: 'int' }
}, null);
_core2.default.Class.define('$data.Yahoo.types.Geo.placetype', _core2.default.Entity, null, {
placeTypeDescription: { type: 'string' },
uri: { type: 'string', key: true },
placeTypeName: { type: 'placeTypeNameRef' },
lang: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.sibling', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMetaFull }], null, {
sibling_woeid: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.parent', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMetaFull }], null, {
child_woeid: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.neighbor', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMetaFull }], null, {
neighbor_woeid: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.common', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMetaFull }], null, {
woeid1: { type: 'string' },
woeid2: { type: 'string' },
woeid3: { type: 'string' },
woeid4: { type: 'string' },
woeid5: { type: 'string' },
woeid6: { type: 'string' },
woeid7: { type: 'string' },
woeid8: { type: 'string' },
'long': { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.children', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMetaFull }], null, {
parent_woeid: { type: 'string' },
placetype: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.belongto', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMetaFull }], null, {
member_woeid: { type: 'string' },
placetype: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.ancestor', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMetaFull }], null, {
descendant_woeid: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.place', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMetaFull }], null, {
text: { type: 'string' },
focus: { type: 'string' },
placetype: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.county', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMeta }], null, {
place: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.country', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMeta }], null, {
place: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.district', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMeta }], null, {
place: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.sea', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMeta }], null, {
place: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.state', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMeta }], null, {
place: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.continent', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMeta }], null, {
place: { type: 'string' },
view: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.ocean', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMeta }], null, {
place: { type: 'string' },
view: { type: 'string' }
}, null);
_core2.default.Class.defineEx('$data.Yahoo.types.Geo.descendant', [{ type: _core2.default.Entity }, { type: _core2.default.Yahoo.types.Geo.PlaceMeta }], null, {
ancestor_woeid: { type: 'string' },
placetype: { type: 'string' },
degree: { type: 'string' },
view: { type: 'string' }
}, null);
_core.Container.registerType('placeTypeNameRef', _core2.default.Yahoo.types.Geo.placeTypeNameCf);
_core.Container.registerType('centroidRef', _core2.default.Yahoo.types.Geo.centroidCf);
_core.Container.registerType('countryRef', _core2.default.Yahoo.types.Geo.countryCf);
_core.Container.registerType('adminRef', _core2.default.Yahoo.types.Geo.adminCf);
_core.Container.registerType('localityRef', _core2.default.Yahoo.types.Geo.localityCf);
_core.Container.registerType('postalRef', _core2.default.Yahoo.types.Geo.postalCf);
_core.Container.registerType('boundingBoxRef', _core2.default.Yahoo.types.Geo.boundingBoxCf);
},{"jaydata/core":"jaydata/core"}],3:[function(_dereq_,module,exports){
;
var _core = _dereq_('jaydata/core');
var _core2 = _interopRequireDefault(_core);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
//"use strict" // suspicious code;
(0, _core.$C)('$data.storageProviders.YQL.YQLCompiler', _core2.default.Expressions.EntityExpressionVisitor, null, {
constructor: function constructor() {
this.provider = {};
this.cTypeCache = {};
},
compile: function compile(query) {
this.provider = query.context.storageProvider;
var context = {
filterSql: { sql: '' },
projectionSql: { sql: '' },
orderSql: { sql: '' },
skipSql: { sql: '' },
takeSql: { sql: '' },
tableName: ''
};
this.Visit(query.expression, context);
if (context.projectionSql.sql == '') context.projectionSql.sql = "SELECT *";
if (context.orderSql.sql) context.orderSql.sql = " | sort(" + context.orderSql.sql + ')';
//special skip-take logic
if (context.skipSql.value && context.takeSql.value) {
var skipVal = context.skipSql.value;
context.skipSql.value = context.takeSql.value;
context.takeSql.value = context.takeSql.value + skipVal;
}
if (context.skipSql.value) context.skipSql.sql = context.skipSql.sqlPre + context.skipSql.value + context.skipSql.sqlSuf;
if (context.takeSql.value) context.takeSql.sql = context.takeSql.sqlPre + context.takeSql.value + context.takeSql.sqlSuf;
return {
queryText: context.projectionSql.sql + ' FROM ' + context.tableName + context.filterSql.sql + context.orderSql.sql + context.takeSql.sql + (context.takeSql.sql ? context.skipSql.sql : ''),
selectMapping: context.projectionSql.selectFields,
params: []
};
},
VisitFilterExpression: function VisitFilterExpression(expression, context) {
///<param name="expression" type="$data.Expressions.FilterExpression" />
this.Visit(expression.source, context);
context.filterSql.type = expression.nodeType;
if (context.filterSql.sql == '') context.filterSql.sql = ' WHERE ';else context.filterSql.sql += ' AND ';
this.Visit(expression.selector, context.filterSql);
},
VisitProjectionExpression: function VisitProjectionExpression(expression, context) {
///<param name="expression" type="$data.Expressions.ProjectionExpression" />
this.Visit(expression.source, context);
context.projectionSql.type = expression.nodeType;
if (context.projectionSql.sql == '') context.projectionSql.sql = 'SELECT ';else _core.Guard.raise(new _core.Exception('multiple select error'));
this.Visit(expression.selector, context.projectionSql);
},
VisitOrderExpression: function VisitOrderExpression(expression, context) {
///<param name="expression" type="$data.Expressions.OrderExpression" />
this.Visit(expression.source, context);
context.orderSql.type = expression.nodeType;
var orderContext = { sql: '' };
this.Visit(expression.selector, orderContext);
context.orderSql.sql = "field='" + orderContext.sql + "', descending='" + (expression.nodeType == _core2.default.Expressions.ExpressionType.OrderByDescending) + "'" + (context.orderSql.sql != '' ? ', ' + context.orderSql.sql : '');
},
VisitPagingExpression: function VisitPagingExpression(expression, context) {
///<param name="expression" type="$data.Expressions.PagingExpression" />
this.Visit(expression.source, context);
if (expression.nodeType == _core2.default.Expressions.ExpressionType.Skip) {
context.skipSql.type = expression.nodeType;
context.skipSql.sqlPre = ' | tail(count=';
this.Visit(expression.amount, context.skipSql);
context.skipSql.sqlSuf = ')';
} else if (expression.nodeType == _core2.default.Expressions.ExpressionType.Take) {
context.takeSql.type = expression.nodeType;
context.takeSql.sqlPre = ' | truncate(count=';
this.Visit(expression.amount, context.takeSql);
context.takeSql.sqlSuf = ')';
}
},
VisitSimpleBinaryExpression: function VisitSimpleBinaryExpression(expression, context) {
context.sql += "(";
var left = this.Visit(expression.left, context);
context.sql += expression.resolution.mapTo;
if (expression.resolution.resolvableType && !_core.Guard.requireType(expression.resolution.mapTo + ' expression.right.value', expression.right.value, expression.resolution.resolvableType)) {
_core.Guard.raise(new _core.Exception(expression.right.type + " not allowed in '" + expression.resolution.mapTo + "' statement", "invalid operation"));
}
if (expression.resolution.name === 'in' && expression.right.value instanceof Array) {
var self = this;
context.sql += "(";
expression.right.value.forEach(function (item, i) {
if (i > 0) context.sql += ", ";
self.Visit(item, context);
});
context.sql += ")";
} else {
var right = this.Visit(expression.right, context);
}
context.sql += ")";
},
VisitEntityFieldExpression: function VisitEntityFieldExpression(expression, context) {
this.Visit(expression.source, context);
this.Visit(expression.selector, context);
},
VisitMemberInfoExpression: function VisitMemberInfoExpression(expression, context) {
var memberName;
if (context.wasComplex === true) context.sql += '.';
context.sql += expression.memberName;
if (context.isComplex == true) {
context.complex += expression.memberName;
context.wasComplex = true;
} else {
context.wasComplex = false;
if (context.complex) memberName = context.complex + expression.memberName;else memberName = expression.memberName;
context.complex = null;
//context.sql += memberName;
//context.fieldName = memberName;
context.fieldData = { name: memberName, dataType: expression.memberDefinition.dataType };
if (context.type == 'Projection' && !context.selectFields) context.selectFields = [{ from: memberName, dataType: expression.memberDefinition.dataType }];
}
},
VisitConstantExpression: function VisitConstantExpression(expression, context) {
if (context.type == 'Projection') _core.Guard.raise(new _core.Exception('Constant value is not supported in Projection.', 'Not supported!'));
this.VisitQueryParameterExpression(expression, context);
},
VisitQueryParameterExpression: function VisitQueryParameterExpression(expression, context) {
context.value = expression.value;
var expressionValueType = _core.Container.resolveType(expression.type); //Container.resolveType(Container.getTypeName(expression.value));
if (expression.value instanceof _core2.default.Queryable) {
context.sql += '(' + expression.value.toTraceString().queryText + ')';
} else if (this.provider.supportedDataTypes.indexOf(expressionValueType) != -1) context.sql += this.provider.fieldConverter.toDb[_core.Container.resolveName(expressionValueType)](expression.value);else {
context.sql += "" + expression.value + "";
}
},
VisitParametricQueryExpression: function VisitParametricQueryExpression(expression, context) {
if (context.type == 'Projection') {
this.Visit(expression.expression, context);
if (expression.expression instanceof _core2.default.Expressions.ComplexTypeExpression) {
context.selectFields = context.selectFields || [];
var type = expression.expression.entityType;
var includes = this._getComplexTypeIncludes(type);
context.selectFields.push({ from: context.complex, type: type, includes: includes });
}
} else {
var exp = this.Visit(expression.expression, context);
context.parameters = expression.parameters;
}
},
VisitEntitySetExpression: function VisitEntitySetExpression(expression, context) {
if (context.type) {
if (!context.complex) context.complex = '';
} else {
context.tableName = expression.instance.tableName;
}
},
VisitObjectLiteralExpression: function VisitObjectLiteralExpression(expression, context) {
var self = this;
context.selectFields = context.selectFields || [];
expression.members.forEach(function (member) {
if (member.expression instanceof _core2.default.Expressions.ObjectLiteralExpression) {
context.mappingPrefix = context.mappingPrefix || [];
context.mappingPrefix.push(member.fieldName);
self.Visit(member, context);
context.mappingPrefix.pop();
} else {
if (context.selectFields.length > 0) context.sql += ', ';
self.Visit(member, context);
var mapping = { from: context.fieldData.name, to: context.mappingPrefix instanceof Array ? context.mappingPrefix.join('.') + '.' + member.fieldName : member.fieldName };
if (context.selectType) {
mapping.type = context.selectType;
var includes = this._getComplexTypeIncludes(context.selectType);
mapping.includes = includes;
} else {
mapping.dataType = context.fieldData.dataType;
}
context.selectFields.push(mapping);
delete context.fieldData;
delete context.selectType;
}
}, this);
},
VisitObjectFieldExpression: function VisitObjectFieldExpression(expression, context) {
this.Visit(expression.expression, context);
if (expression.expression instanceof _core2.default.Expressions.ComplexTypeExpression) {
context.fieldData = context.fieldData || {};
context.fieldData.name = context.complex;
context.selectType = expression.expression.entityType;
}
},
VisitEntityFieldOperationExpression: function VisitEntityFieldOperationExpression(expression, context) {
_core.Guard.requireType("expression.operation", expression.operation, _core2.default.Expressions.MemberInfoExpression);
var opDef = expression.operation.memberDefinition;
var opName = opDef.mapTo || opDef.name;
context.sql += '(';
if (opDef.expressionInParameter == false) this.Visit(expression.source, context);
context.sql += opName;
var paramCounter = 0;
var params = opDef.parameters || [];
var args = params.map(function (item, index) {
var result = { dataType: item.dataType, prefix: item.prefix, suffix: item.suffix };
if (item.value) {
result.value = item.value;
} else if (item.name === "@expression") {
result.value = expression.source;
} else {
result.value = expression.parameters[paramCounter];
result.itemType = expression.parameters[paramCounter++].type;
};
return result;
});
args.forEach(function (arg, index) {
var itemType = arg.itemType ? _core.Container.resolveType(arg.itemType) : null;
if (!itemType || arg.dataType instanceof Array && arg.dataType.indexOf(itemType) != -1 || arg.dataType == itemType) {
if (index > 0) {
context.sql += ", ";
};
var funcContext = { sql: '' };
this.Visit(arg.value, funcContext);
if (opName == ' LIKE ') {
var valueType = _core.Container.getTypeName(funcContext.value);
context.sql += valueType == 'string' ? "'" : "";
context.sql += (arg.prefix ? arg.prefix : '') + funcContext.value + (arg.suffix ? arg.suffix : '');
context.sql += valueType == 'string' ? "'" : "";
} else {
context.sql += funcContext.sql;
}
} else _core.Guard.raise(new _core.Exception(itemType + " not allowed in '" + expression.operation.memberName + "' statement", "invalid operation"));
}, this);
if (opDef.rigthValue) context.sql += opDef.rigthValue;else context.sql += "";
context.sql += ')';
},
VisitComplexTypeExpression: function VisitComplexTypeExpression(expression, context) {
this.Visit(expression.source, context);
context.isComplex = true;
this.Visit(expression.selector, context);
context.isComplex = false;
if (context.complex != '' /*&& context.isComplex*/) context.complex += '.';
},
VisitEntityExpression: function VisitEntityExpression(expression, context) {
this.Visit(expression.source, context);
},
_findComplexType: function _findComplexType(type, result, depth) {
type.memberDefinitions.getPublicMappedProperties().forEach(function (memDef) {
var dataType = _core.Container.resolveType(memDef.dataType);
if (dataType.isAssignableTo && !dataType.isAssignableTo(_core2.default.EntitySet)) {
var name = depth ? depth + '.' + memDef.name : memDef.name;
result.push({ name: name, type: dataType });
this._findComplexType(dataType, result, name);
}
}, this);
},
_getComplexTypeIncludes: function _getComplexTypeIncludes(type) {
if (!this.cTypeCache[type.name]) {
var inc = [];
this._findComplexType(type, inc);
this.cTypeCache[type.name] = inc;
}
return this.cTypeCache[type.name];
}
}, null);
},{"jaydata/core":"jaydata/core"}],4:[function(_dereq_,module,exports){
;
var _core = _dereq_('jaydata/core');
var _core2 = _interopRequireDefault(_core);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_core2.default.YQLConverter = {
fromDb: {
'$data.Byte': _core2.default.Container.proxyConverter,
'$data.SByte': _core2.default.Container.proxyConverter,
'$data.Decimal': _core2.default.Container.proxyConverter,
'$data.Float': _core2.default.Container.proxyConverter,
'$data.Int16': _core2.default.Container.proxyConverter,
'$data.Int32': _core2.default.Container.proxyConverter,
'$data.Int64': _core2.default.Container.proxyConverter,
'$data.Number': function $dataNumber(value) {
return typeof value === "number" ? value : parseInt(value);
},
'$data.Integer': function $dataInteger(value) {
return typeof value === "number" ? value : parseFloat(value);
},
'$data.String': _core2.default.Container.proxyConverter,
'$data.Date': function $dataDate(value) {
return new Date(typeof value === "string" ? parseInt(value) : value);
},
'$data.Boolean': function $dataBoolean(value) {
return !!value;
},
'$data.Blob': _core2.default.Container.proxyConverter,
'$data.Array': function $dataArray(value) {
if (value === undefined) {
return new _core2.default.Array();
}return value;
}
},
toDb: {
'$data.Byte': _core2.default.Container.proxyConverter,
'$data.SByte': _core2.default.Container.proxyConverter,
'$data.Decimal': _core2.default.Container.proxyConverter,
'$data.Float': _core2.default.Container.proxyConverter,
'$data.Int16': _core2.default.Container.proxyConverter,
'$data.Int32': _core2.default.Container.proxyConverter,
'$data.Int64': _core2.default.Container.proxyConverter,
'$data.Number': _core2.default.Container.proxyConverter,
'$data.Integer': _core2.default.Container.proxyConverter,
'$data.String': function $dataString(value) {
return "'" + value + "'";
},
'$data.Date': function $dataDate(value) {
return value ? value.valueOf() : null;
},
'$data.Boolean': _core2.default.Container.proxyConverter,
'$data.Blob': _core2.default.Container.proxyConverter,
'$data.Array': function $dataArray(value) {
return '(' + value.join(', ') + ')';
}
}
};
},{"jaydata/core":"jaydata/core"}],5:[function(_dereq_,module,exports){
;
var _core = _dereq_('jaydata/core');
var _core2 = _interopRequireDefault(_core);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_core2.default.Class.define('$data.storageProviders.YQL.YQLProvider', _core2.default.StorageProviderBase, null, {
constructor: function constructor(cfg) {
var provider = this;
this.SqlCommands = [];
this.context = {};
this.extendedCreateNew = [];
this.providerConfiguration = _core2.default.typeSystem.extend({
YQLFormat: "format=json",
YQLQueryUrl: "http://query.yahooapis.com/v1/public/yql?q=",
YQLEnv: '',
resultPath: ["query", "results"],
resultSkipFirstLevel: true
}, cfg);
this.initializeStore = function (callBack) {
callBack = _core2.default.PromiseHandlerBase.createCallbackSettings(callBack);
callBack.success(this.context);
};
},
AuthenticationProvider: { dataType: '$data.Authentication.AuthenticationBase', enumerable: false },
supportedDataTypes: { value: [_core2.default.Integer, _core2.default.Number, _core2.default.Date, _core2.default.String, _core2.default.Boolean, _core2.default.Blob, _core2.default.Array], writable: false },
supportedFieldOperations: {
value: {
'contains': {
dataType: _core2.default.String,
allowedIn: _core2.default.Expressions.FilterExpression,
mapTo: ' LIKE ',
expressionInParameter: false,
parameters: [{ name: 'inStatement', dataType: _core2.default.String, prefix: '%', suffix: '%' }]
},
'startsWith': {
dataType: _core2.default.String,
allowedIn: _core2.default.Expressions.FilterExpression,
mapTo: ' LIKE ',
expressionInParameter: false,
parameters: [{ name: 'inStatement', dataType: _core2.default.String, suffix: '%' }]
},
'endsWith': {
dataType: _core2.default.String,
allowedIn: _core2.default.Expressions.FilterExpression,
mapTo: ' LIKE ',
expressionInParameter: false,
parameters: [{ name: 'inStatement', dataType: _core2.default.String, prefix: '%' }]
}
},
enumerable: true,
writable: true
},
supportedBinaryOperators: {
value: {
equal: { mapTo: ' = ', dataType: _core2.default.Boolean, allowedIn: _core2.default.Expressions.FilterExpression },
notEqual: { mapTo: ' != ', dataType: _core2.default.Boolean, allowedIn: _core2.default.Expressions.FilterExpression },
equalTyped: { mapTo: ' = ', dataType: _core2.default.Boolean, allowedIn: _core2.default.Expressions.FilterExpression },
notEqualTyped: { mapTo: ' != ', dataType: _core2.default.Boolean, allowedIn: _core2.default.Expressions.FilterExpression },
greaterThan: { mapTo: ' > ', dataType: _core2.default.Boolean, allowedIn: _core2.default.Expressions.FilterExpression },
greaterThanOrEqual: { mapTo: ' >= ', dataType: _core2.default.Boolean, allowedIn: _core2.default.Expressions.FilterExpression },
lessThan: { mapTo: ' < ', dataType: _core2.default.Boolean, allowedIn: _core2.default.Expressions.FilterExpression },
lessThenOrEqual: { mapTo: ' <= ', dataType: _core2.default.Boolean, allowedIn: _core2.default.Expressions.FilterExpression },
or: { mapTo: ' OR ', dataType: _core2.default.Boolean, allowedIn: _core2.default.Expressions.FilterExpression },
and: { mapTo: ' AND ', dataType: _core2.default.Boolean, allowedIn: _core2.default.Expressions.FilterExpression },
"in": { mapTo: " IN ", dataType: _core2.default.Boolean, resolvableType: [_core2.default.Array, _core2.default.Queryable], allowedIn: _core2.default.Expressions.FilterExpression }
}
},
supportedUnaryOperators: {
value: {}
},
supportedSetOperations: {
value: {
filter: {},
map: {},
forEach: {},
toArray: {},
single: {},
take: {},
skip: {},
orderBy: {},
orderByDescending: {},
first: {}
},
enumerable: true,
writable: true
},
fieldConverter: { value: _core2.default.YQLConverter },
executeQuery: function executeQuery(query, callBack) {
var self = this;
callBack = _core2.default.PromiseHandlerBase.createCallbackSettings(callBack);
var schema = query.defaultType;
var entitSetDefinition = query.context.getType().memberDefinitions.asArray().filter(function (m) {
return m.elementType == schema;
})[0] || {};
var ctx = this.context;
if (!this.AuthenticationProvider) this.AuthenticationProvider = new _core2.default.Authentication.Anonymous({});
var sql;
try {
sql = this._compile(query);
} catch (e) {
callBack.error(e);
return;
}
var includes = [];
var requestData = {
url: this.providerConfiguration.YQLQueryUrl + encodeURIComponent(sql.queryText) + "&" + this.providerConfiguration.YQLFormat + (this.providerConfiguration.YQLEnv ? "&env=" + this.providerConfiguration.YQLEnv : ""),
dataType: "JSON",
success: function success(data, textStatus, jqXHR) {
var resultData = self._preProcessData(data, entitSetDefinition);
if (resultData == false) {
callBack.success(query);
return;
}
query.rawDataList = resultData;
if (entitSetDefinition.anonymousResult) {
query.rawDataList = resultData;
callBack.success(query);
return;
} else {
var compiler = _core.Container.createModelBinderConfigCompiler(query, []);
compiler.Visit(query.expression);
}
callBack.success(query);
},
error: function error(jqXHR, textStatus, errorThrow) {
var errorData = {};
try {
errorData = JSON.parse(jqXHR.responseText).error;
} catch (e) {
errorData = errorThrow + ': ' + jqXHR.responseText;
}
callBack.error(errorData);
}
};
this.context.prepareRequest.call(this, requestData);
this.AuthenticationProvider.CreateRequest(requestData);
},
_preProcessData: function _preProcessData(jsonResult, entityDef) {
var resultData = jsonResult;
var depths = entityDef.resultPath != undefined ? entityDef.resultPath : this.providerConfiguration.resultPath;
for (var i = 0; i < depths.length; i++) {
if (resultData[depths[i]]) resultData = resultData[depths[i]];else {
return false;
}
}
var skipFirstLevel = entityDef.resultSkipFirstLevel != undefined ? entityDef.resultSkipFirstLevel : this.providerConfiguration.resultSkipFirstLevel;
if (skipFirstLevel == true) {
var keys = Object.keys(resultData);
if (keys.length == 1 && (resultData[keys[0]] instanceof Array || !entityDef.anonymousResult)) resultData = resultData[keys[0]];
}
if (resultData.length) {
return resultData;
} else return [resultData];
},
_compile: function _compile(query) {
var sqlText = _core.Container.createYQLCompiler().compile(query);
return sqlText;
},
getTraceString: function getTraceString(query) {
if (!this.AuthenticationProvider) this.AuthenticationProvider = new _core2.default.Authentication.Anonymous({});
var sqlText = this._compile(query);
return sqlText;
},
setContext: function setContext(ctx) {
this.context = ctx;
},
saveChanges: function saveChanges(callBack) {
_core.Guard.raise(new _core.Exception("Not Implemented", "Not Implemented"));
}
}, null);
_core2.default.StorageProviderBase.registerProvider("YQL", _core2.default.storageProviders.YQL.YQLProvider);
},{"jaydata/core":"jaydata/core"}],6:[function(_dereq_,module,exports){
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _core = _dereq_('jaydata/core');
var _core2 = _interopRequireDefault(_core);
var _YQLConverter = _dereq_('./YQLConverter.js');
var _YQLConverter2 = _interopRequireDefault(_YQLConverter);
var _YQLProvider = _dereq_('./YQLProvider.js');
var _YQLProvider2 = _interopRequireDefault(_YQLProvider);
var _YQLCompiler = _dereq_('./YQLCompiler.js');
var _YQLCompiler2 = _interopRequireDefault(_YQLCompiler);
var _geo = _dereq_('./EntitySets/geo.js');
var _geo2 = _interopRequireDefault(_geo);
var _YQLContext = _dereq_('./EntitySets/YQLContext.js');
var _YQLContext2 = _interopRequireDefault(_YQLContext);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = _core2.default;
module.exports = exports['default'];
},{"./EntitySets/YQLContext.js":1,"./EntitySets/geo.js":2,"./YQLCompiler.js":3,"./YQLConverter.js":4,"./YQLProvider.js":5,"jaydata/core":"jaydata/core"}]},{},[6])(6)
});