jaydata
Version:
Cross-platform HTML5 data-management, JavaScript Language Query (JSLQ) support for OData, SQLite, WebSQL, IndexedDB, YQL and Facebook (packaged for Node.JS)
815 lines (695 loc) • 37.3 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/facebook",["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.storageProviders.Facebook.EntitySets.Command', null, null, {
constructor: function constructor(cfg) {
this.Config = _core2.default.typeSystem.extend({
CommandValue: ""
}, cfg);
},
toString: function toString() {
return this.Config.CommandValue;
},
Config: {}
}, {
'to$data.Integer': function to$dataInteger(value) {
return value;
},
'to$data.Number': function to$dataNumber(value) {
return value;
}
});
_core2.default.Class.define("$data.Facebook.FQLContext", _core2.default.EntityContext, null, {
constructor: function constructor() {
var friendsQuery = this.Friends.where(function (f) {
return f.uid1 == this.me;
}, { me: _core2.default.Facebook.FQLCommands.me }).select(function (f) {
return f.uid2;
});
this.MyFriends = this.Users.where(function (u) {
return u.uid in this.friends;
}, { friends: friendsQuery });
},
Users: {
dataType: _core2.default.EntitySet,
tableName: 'user',
elementType: _core2.default.Facebook.types.FbUser
},
Friends: {
dataType: _core2.default.EntitySet,
tableName: 'friend',
elementType: _core2.default.Facebook.types.FbFriend
},
Pages: {
dataType: _core2.default.EntitySet,
tableName: 'page',
elementType: _core2.default.Facebook.types.FbPage
}
}, null);
_core2.default.Facebook.FQLCommands = {
__namespace: true,
me: new _core2.default.storageProviders.Facebook.EntitySets.Command({ CommandValue: "me()" }),
now: new _core2.default.storageProviders.Facebook.EntitySets.Command({ CommandValue: "now()" })
};
},{"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.Facebook.types.FbFriend", _core2.default.Entity, null, {
uid1: { type: "number", key: true, searchable: true },
uid2: { type: "number", key: true, searchable: true }
}, null);
},{"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 }; }
_core2.default.Class.define("$data.Facebook.types.FbPage", _core2.default.Entity, null, {
page_id: { type: "number", key: true, isPublic: true, searchable: true },
name: { type: "string", isPublic: true, searchable: true },
username: { type: "string", isPublic: true, searchable: true },
description: { type: "string", isPublic: true },
categories: { type: "array", isPublic: true }, //array The categories
is_community_page: { type: "bool", isPublic: true }, //string Indicates whether the Page is a community Page.
pic_small: { type: "string", isPublic: true },
pic_big: { type: "string", isPublic: true },
pic_square: { type: "string", isPublic: true },
pic: { type: "string", isPublic: true },
pic_large: { type: "string", isPublic: true },
pic_cover: { type: "object", isPublic: true }, //object The JSON object containing three fields:�cover_id�(the ID of the cover photo),�source�(the URL for the cover photo), andoffset_y�(indicating percentage offset from top [0-100])
unread_notif_count: { type: "number", isPublic: false },
new_like_count: { type: "number", isPublic: false },
fan_count: { type: "number", isPublic: true },
type: { type: "string", isPublic: true },
website: { type: "string", isPublic: true },
has_added_app: { type: "bool", isPublic: true },
general_info: { type: "string", isPublic: true },
can_post: { type: "bool", isPublic: true },
checkins: { type: "number", isPublic: true },
is_published: { type: "bool", isPublic: true },
founded: { type: "string", isPublic: true },
company_overview: { type: "string", isPublic: true },
mission: { type: "string", isPublic: true },
products: { type: "string", isPublic: true },
location: { type: "object", isPublic: true }, // array Applicable to all�Places.
parking: { type: "object", isPublic: true }, // array Applicable to�Businesses�and�Places. Can be one of�street,�lot�orvalet
hours: { type: "array", isPublic: true }, // array Applicable to�Businesses�and�Places.
pharma_safety_info: { type: "string", isPublic: true },
public_transit: { type: "string", isPublic: true },
attire: { type: "string", isPublic: true },
payment_options: { type: "object", isPublic: true }, //array Applicable to�Restaurants�or�Nightlife.
culinary_team: { type: "string", isPublic: true },
general_manager: { type: "string", isPublic: true },
price_range: { type: "string", isPublic: true },
restaurant_services: { type: "object", isPublic: true }, // array Applicable to�Restaurants.
restaurant_specialties: { type: "object", isPublic: true }, // array Applicable to�Restaurants.
phone: { type: "string", isPublic: true },
release_date: { type: "string", isPublic: true },
genre: { type: "string", isPublic: true },
starring: { type: "string", isPublic: true },
screenplay_by: { type: "string", isPublic: true },
directed_by: { type: "string", isPublic: true },
produced_by: { type: "string", isPublic: true },
studio: { type: "string", isPublic: true },
awards: { type: "string", isPublic: true },
plot_outline: { type: "string", isPublic: true },
season: { type: "string", isPublic: true },
network: { type: "string", isPublic: true },
schedule: { type: "string", isPublic: true },
written_by: { type: "string", isPublic: true },
band_members: { type: "string", isPublic: true },
hometown: { type: "string", isPublic: true },
current_location: { type: "string", isPublic: true },
record_label: { type: "string", isPublic: true },
booking_agent: { type: "string", isPublic: true },
press_contact: { type: "string", isPublic: true },
artists_we_like: { type: "string", isPublic: true },
influences: { type: "string", isPublic: true },
band_interests: { type: "string", isPublic: true },
bio: { type: "string", isPublic: true },
affiliation: { type: "string", isPublic: true },
birthday: { type: "string", isPublic: true },
personal_info: { type: "string", isPublic: true },
personal_interests: { type: "string", isPublic: true },
built: { type: "string", isPublic: true },
features: { type: "string", isPublic: true },
mpg: { type: "string", isPublic: true }
}, 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.Class.define("$data.Facebook.types.FbUser", _core2.default.Entity, null, {
uid: { type: "number", key: true, isPublic: true, searchable: true },
username: { type: "string", isPublic: true, searchable: true },
first_name: { type: "string", isPublic: true },
middle_name: { type: "string", isPublic: true },
last_name: { type: "string", isPublic: true },
name: { type: "string", isPublic: true, searchable: true },
pic_small: { type: "string" },
pic_big: { type: "string" },
pic_square: { type: "string" },
pic: { type: "string" },
affiliations: { type: "Array", elementType: "Object" },
profile_update_time: { type: "datetime" },
timezone: { type: "number" },
religion: { type: "string" },
birthday: { type: "string" },
birthday_date: { type: "string" },
sex: { type: "string", isPublic: true },
hometown_location: { type: "Array", elementType: "Object" },
meeting_sex: { type: "Array", elementType: "Object" },
meeting_for: { type: "Array", elementType: "Object" },
relationship_status: { type: "string" },
significant_other_id: { type: "number" /*uid*/ },
political: { type: "string" },
current_location: { type: "Array", elementType: "Object" },
activities: { type: "string" },
interests: { type: "string" },
is_app_user: { type: "bool" },
music: { type: "string" },
tv: { type: "string" },
movies: { type: "string" },
books: { type: "string" },
quotes: { type: "string" },
about_me: { type: "string" },
hs_info: { type: "Array", elementType: "Object" },
education_history: { type: "Array", elementType: "Object" },
work_history: { type: "Array", elementType: "Object" },
notes_count: { type: "number" },
wall_count: { type: "number" },
status: { type: "string" },
has_added_app: { type: "bool" },
online_presence: { type: "string" },
locale: { type: "string", isPublic: true },
proxied_email: { type: "string" },
profile_url: { type: "string" },
email_hashes: { type: "Array", elementType: "Object" },
pic_small_with_logo: { type: "string", isPublic: true },
pic_big_with_logo: { type: "string", isPublic: true },
pic_square_with_logo: { type: "string", isPublic: true },
pic_with_logo: { type: "string", isPublic: true },
allowed_restrictions: { type: "string" },
verified: { type: "bool" },
profile_blurb: { type: "string" },
family: { type: "Array", elementType: "Object" },
website: { type: "string" },
is_blocked: { type: "bool" },
contact_email: { type: "string" },
email: { type: "string" },
third_party_id: { type: "string", searchable: true },
name_format: { type: "string" },
video_upload_limits: { type: "Array", elementType: "Object" },
games: { type: "string" },
work: { type: "Array", elementType: "Object" },
education: { type: "Array", elementType: "Object" },
sports: { type: "Array", elementType: "Object" },
favorite_athletes: { type: "Array", elementType: "Object" },
favorite_teams: { type: "Array", elementType: "Object" },
inspirational_people: { type: "Array", elementType: "Object" },
languages: { type: "Array", elementType: "Object" },
likes_count: { type: "number" },
friend_count: { type: "number" },
mutual_friend_count: { type: "number" },
can_post: { type: "bool" }
}, null);
},{"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 }; }
//"use strict"; // suspicious code
(0, _core.$C)('$data.storageProviders.Facebook.FacebookCompiler', _core2.default.Expressions.EntityExpressionVisitor, null, {
constructor: function constructor() {
this.provider = {};
},
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);
var autoGeneratedSelect = false;
if (!context.projectionSql.sql) {
context.projectionSql = this.autoGenerateProjection(query);
autoGeneratedSelect = true;
}
if (context.filterSql.sql == '') _core.Guard.raise(new _core.Exception('Filter/where statement is required', 'invalid operation'));
return {
queryText: context.projectionSql.sql + ' FROM ' + context.tableName + context.filterSql.sql + context.orderSql.sql + context.takeSql.sql + (context.takeSql.sql ? context.skipSql.sql : ''),
selectMapping: autoGeneratedSelect == false ? context.projectionSql.selectFields : null,
params: []
};
},
autoGenerateProjection: function autoGenerateProjection(query) {
var entitySet = query.context.getEntitySetFromElementType(query.defaultType);
var newQueryable = new _core2.default.Queryable(query.context, entitySet.expression);
//newQueryable._checkRootExpression(entitySet.collectionName);
var codeExpression = _core.Container.createCodeExpression(this.generateProjectionFunc(query));
var exp = _core.Container.createProjectionExpression(newQueryable.expression, codeExpression);
var q = _core.Container.createQueryable(newQueryable, exp);
var expression = q.expression;
var preparator = _core.Container.createQueryExpressionCreator(query.context);
expression = preparator.Visit(expression);
var databaseQuery = {
projectionSql: { sql: '' }
};
this.Visit(expression, databaseQuery);
return databaseQuery.projectionSql;
},
generateProjectionFunc: function generateProjectionFunc(query) {
var isAuthenticated = this.provider.AuthenticationProvider.Authenticated || this.provider.providerConfiguration.Access_Token;
var publicMemberDefinitions = query.defaultType.memberDefinitions.getPublicMappedProperties();
if (!isAuthenticated && publicMemberDefinitions.some(function (memDef) {
return memDef.isPublic == true;
})) {
publicMemberDefinitions = publicMemberDefinitions.filter(function (memDef) {
return memDef.isPublic == true;
});
}
var selectStr = 'function (s){ return {';
publicMemberDefinitions.forEach(function (memDef, i) {
if (i != 0) selectStr += ', ';
selectStr += memDef.name + ': s.' + memDef.name;
});
selectStr += '}; }';
//var projectionFunc = null;
//eval(selectStr);
return selectStr;
},
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;
if (context.orderSql.sql == '') context.orderSql.sql = ' ORDER BY ';else _core.Guard.raise(new _core.Exception('Multiple sorting not supported', 'not supported'));
this.Visit(expression.selector, context.orderSql);
context.orderSql.sql += expression.nodeType == _core2.default.Expressions.ExpressionType.OrderByDescending ? " DESC" : " ASC";
},
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.sql = ' OFFSET ';
this.Visit(expression.amount, context.skipSql);
} else if (expression.nodeType == _core2.default.Expressions.ExpressionType.Take) {
context.takeSql.type = expression.nodeType;
context.takeSql.sql = ' LIMIT ';
this.Visit(expression.amount, context.takeSql);
}
},
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) {
var source = this.Visit(expression.selector, context);
},
VisitMemberInfoExpression: function VisitMemberInfoExpression(expression, context) {
var memberName = expression.memberName;
context.sql += memberName;
//context.fieldName = memberName;
context.fieldData = { name: memberName, dataType: expression.memberDefinition.dataType };
if (context.type == 'Projection' && !context.selectFields) {
if (context.fieldOperation === true) context.selectFields = [{ from: 'anon' }];else 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) {
if (expression.value instanceof _core2.default.storageProviders.Facebook.EntitySets.Command) {
context.sql += "" + expression.value + "";
} else if (expression.value instanceof _core2.default.Queryable) {
context.sql += '(' + expression.value.toTraceString().queryText + ')';
} else {
var expressionValueType = _core.Container.resolveType(expression.type);
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) {
var exp = this.Visit(expression.expression, context);
context.parameters = expression.parameters;
},
VisitEntitySetExpression: function VisitEntitySetExpression(expression, context) {
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 toProperty = context.mappingPrefix instanceof Array ? context.mappingPrefix.join('.') + '.' + member.fieldName : member.fieldName;
context.selectFields.push({ from: context.fieldData.name, to: toProperty, dataType: context.fieldData.dataType });
}
});
},
VisitObjectFieldExpression: function VisitObjectFieldExpression(expression, context) {
return this.Visit(expression.expression, context);
},
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;
context.sql += "(";
var paramCounter = 0;
var params = opDef.parameters || [];
var args = params.map(function (item, index) {
var result = { dataType: item.dataType };
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 += ", ";
};
if (context.type == 'Projection') context.fieldOperation = true;
this.Visit(arg.value, context);
if (context.type == 'Projection') context.fieldOperation = undefined;
} else _core.Guard.raise(new _core.Exception(arg.dataType + " not allowed in '" + expression.operation.memberName + "' statement", "invalid operation"));
}, this);
if (context.fieldData && context.fieldData.name) context.fieldData.name = 'anon';
if (opDef.rigthValue) context.sql += opDef.rigthValue;else context.sql += ")";
context.sql += ')';
}
}, null);
},{"jaydata/core":"jaydata/core"}],6:[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.FacebookConverter = {
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.Int64': _core2.default.Container.proxyConverter,
'$data.Number': _core2.default.Container.proxyConverter,
'$data.Integer': _core2.default.Container.proxyConverter,
'$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.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"}],7:[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.Facebook.FacebookProvider', _core2.default.StorageProviderBase, null, {
constructor: function constructor(cfg) {
var provider = this;
this.SqlCommands = [];
this.context = {};
this.providerConfiguration = _core2.default.typeSystem.extend({
FQLFormat: "format=json",
FQLQueryUrl: "https://graph.facebook.com/fql?q=",
Access_Token: ''
}, 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: "strpos",
parameters: [{ name: "@expression", dataType: _core2.default.String }, { name: "strFragment", dataType: _core2.default.String }],
rigthValue: ') >= 0'
},
'startsWith': {
dataType: _core2.default.String,
allowedIn: _core2.default.Expressions.FilterExpression,
mapTo: "strpos",
parameters: [{ name: "@expression", dataType: _core2.default.String }, { name: "strFragment", dataType: _core2.default.String }],
rigthValue: ') = 0'
},
'strpos': {
dataType: _core2.default.Integer,
allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.ProjectionExpression],
mapTo: "strpos",
parameters: [{ name: "@expression", dataType: _core2.default.String }, { name: "strFragment", dataType: _core2.default.String }]
},
'substr': {
dataType: _core2.default.String,
allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.ProjectionExpression],
mapTo: "substr",
parameters: [{ name: "@expression", dataType: _core2.default.String }, { name: "startIdx", dataType: _core2.default.Number }, { name: "length", dataType: _core2.default.Number }]
},
'strlen': {
dataType: _core2.default.Integer,
allowedIn: [_core2.default.Expressions.FilterExpression, _core2.default.Expressions.ProjectionExpression],
mapTo: "strlen",
parameters: [{ name: "@expression", dataType: _core2.default.String }]
}
},
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.Booleanv },
'in': { mapTo: ' IN ', dataType: _core2.default.Boolean, resolvableType: [_core2.default.Array, _core2.default.Queryable], allowedIn: _core2.default.Expressions.FilterExpression }
}
},
supportedUnaryOperators: {
value: {}
},
fieldConverter: { value: _core2.default.FacebookConverter },
supportedSetOperations: {
value: {
filter: {},
length: {},
map: {},
forEach: {},
toArray: {},
single: {},
take: {},
skip: {},
orderBy: {},
orderByDescending: {},
first: {}
},
enumerable: true,
writable: true
},
executeQuery: function executeQuery(query, callBack) {
callBack = _core2.default.PromiseHandlerBase.createCallbackSettings(callBack);
if (!this.AuthenticationProvider) this.AuthenticationProvider = new _core2.default.Authentication.Anonymous({});
var sql;
try {
sql = this._compile(query);
} catch (e) {
callBack.error(e);
return;
}
var schema = query.defaultType;
var ctx = this.context;
var includes = [];
if (!sql.selectMapping) this._discoverType('', schema, includes);
var requestUrl = this.providerConfiguration.FQLQueryUrl + encodeURIComponent(sql.queryText) + "&" + this.providerConfiguration.FQLFormat;
if (this.providerConfiguration.Access_Token) {
requestUrl += '&access_token=' + this.providerConfiguration.Access_Token;
}
var requestData = {
url: requestUrl,
dataType: "JSON",
success: function success(data, textStatus, jqXHR) {
query.rawDataList = data.data;
var compiler = _core.Container.createModelBinderConfigCompiler(query, []);
compiler.Visit(query.expression);
if (query.expression instanceof _core2.default.Expressions.CountExpression) {
query.rawDataList = [{ cnt: data.data.length }];
}
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);
},
_discoverType: function _discoverType(dept, type, result) {
type.memberDefinitions.getPublicMappedProperties().forEach(function (memDef) {
var type = _core.Container.resolveType(memDef.dataType);
if (type.isAssignableTo || type == Array) {
var name = dept ? dept + '.' + memDef.name : memDef.name;
if (type == Array || type.isAssignableTo(_core2.default.EntitySet)) {
if (memDef.inverseProperty) type = _core.Container.resolveType(memDef.elementType);else return;
}
result.push({ name: name, type: type });
this._discoverType(name, type, result);
}
}, this);
},
_compile: function _compile(query) {
var sqlText = _core.Container.createFacebookCompiler().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("Facebook", _core2.default.storageProviders.Facebook.FacebookProvider);
},{"jaydata/core":"jaydata/core"}],8:[function(_dereq_,module,exports){
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _core = _dereq_('jaydata/core');
var _core2 = _interopRequireDefault(_core);
var _FacebookConverter = _dereq_('./FacebookConverter.js');
var _FacebookConverter2 = _interopRequireDefault(_FacebookConverter);
var _FacebookProvider = _dereq_('./FacebookProvider.js');
var _FacebookProvider2 = _interopRequireDefault(_FacebookProvider);
var _FacebookCompiler = _dereq_('./FacebookCompiler.js');
var _FacebookCompiler2 = _interopRequireDefault(_FacebookCompiler);
var _user = _dereq_('./EntitySets/FQL/user.js');
var _user2 = _interopRequireDefault(_user);
var _friend = _dereq_('./EntitySets/FQL/friend.js');
var _friend2 = _interopRequireDefault(_friend);
var _page = _dereq_('./EntitySets/FQL/page.js');
var _page2 = _interopRequireDefault(_page);
var _FQLContext = _dereq_('./EntitySets/FQLContext.js');
var _FQLContext2 = _interopRequireDefault(_FQLContext);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = _core2.default;
module.exports = exports['default'];
},{"./EntitySets/FQL/friend.js":2,"./EntitySets/FQL/page.js":3,"./EntitySets/FQL/user.js":4,"./EntitySets/FQLContext.js":1,"./FacebookCompiler.js":5,"./FacebookConverter.js":6,"./FacebookProvider.js":7,"jaydata/core":"jaydata/core"}]},{},[8])(8)
});