计算模型是一种虚拟模型。它是通过处理来自其他模型或外部资源的数据而创建的。数据在处理后将存储在应用制作工具服务器或客户端上,而不是存储在数据库中。
计算模型可以执行以下操作:
- 根据其他模型的数据合成自定义报告
- 从外部 Web 服务获取数据
计算模型类型
应用制作工具提供三种计算模型:
- 计算 SQL 模型:该模型通过对应用的 Cloud SQL 数据库运行 SQL 查询来填充其记录。详细了解 SQL 计算模型。
- 计算模型:该模型使用服务器端查询脚本执行特定逻辑并返回一组记录。详细了解查询脚本和示例。
- 客户端计算模型:该模型使用客户端查询脚本来同步提取数据,或使用回调函数返回异步结果。
客户端计算模型
客户端计算模型运行自定义查询脚本,而非常规数据源查询,并通过查询参数传入任何过滤条件。
如需使用自定义查询脚本,请执行以下操作:
- 转到客户端计算模型的 Datasources 标签页。
- 在查询代码框中,输入自定义查询脚本。您的脚本必须包含 return 语句。
- 如需呈现从第三方服务中检索到的数据,请执行以下操作:
- 使用第三方 API 查询映射您的脚本查询。
- 将返回的数据映射到模型记录。
如何选择模型?
您可以根据下表和计算模型限制来确定最适合使用的模型类型。
目标 | 要使用的模型 |
---|---|
通过应用中的模型重新构建数据。 | 计算 SQL 模型或计算(服务器端)模型。 如果计算模型使用的字段大部分与现有模型相同,请使用查询数据源来代替服务器端计算模型。查询数据源通常会更简单一些。 |
使用 API 和客户端库提取数据。 | 客户端计算模型 在此模型中,您可以使用 Google API 或第三方服务(例如 Facebook SDK 或 SalesForce API)获取数据。 |
快速显示应用组件(例如图表和动态菜单),而不查询服务器。 | 客户端计算模型 |
限制
服务器端计算模型存在如下限制:
- 您无法修改或删除服务器端计算模型的记录(记录为只读状态)。
- 您无法在客户端上创建服务器端计算模型的记录。
- 您无法将服务器端计算模型与其他应用制作工具模型(包括服务器端计算模型本身)关联起来。
- 计算 SQL 模型查询不受针对所查询模型设定的安全限制约束。请在 Security 标签页中为 SQL 计算模型本身设置安全限制。
客户端计算模型存在如下限制:
- 您无法修改或删除客户端计算模型的记录(记录为只读状态)。
- 无法将客户端计算模型与其他应用制作工具模型(包括客户端计算模型本身)关联起来。
- 客户端计算模型不支持分页或排序配置。
- 客户端计算模型不支持事件或安全配置。
- 如果某一结果被多次返回,例如双回调调用或执行返回和回调的调用,则客户端计算模型会返回错误。
计算模型示例
计算 SQL 模型
如需查看计算 SQL 模型的示例,请参阅 Cloud SQL。
服务器端查询脚本
以下查询脚本使用 Employee
模型的 Location
字段来计算各个位置的员工数量:
var calculatedModelRecords = [];
var recordsByLocation = {};
var allEmployees = app.models.Employee.newQuery().run();
for (var i = 0; i < allEmployees.length; i++) {
var employee = allEmployees[i];
if (!recordsByLocation[employee.Location]) {
var calculatedModelRecord = app.models.EmployeesByLocation.newRecord();
calculatedModelRecord.NumberOfEmployees = 1;
calculatedModelRecord.Location = employee.Location;
calculatedModelRecords.push(calculatedModelRecord);
recordsByLocation[employee.Location] = calculatedModelRecord;
} else {
recordsByLocation[employee.Location].NumberOfEmployees++;
}
}
return calculatedModelRecords;
该脚本会迭代 Employee
模型中的每条记录,并执行以下操作:
- 为发现的每个新位置创建一条记录。
- 针对具有重复位置的任何记录增加员工计数。
该脚本使用 newRecord()
创建计算模型记录,但实际上,这种方法并不会在数据后端创建记录。模型会直接将记录返回给客户端。
如需查看更多示例,请参阅查询脚本。
客户端计算模型
示例 1:执行同步应用制作工具客户端 API 查询
以下脚本返回 Fibonacci 系列。其他应用制作工具操作要等到结果之后才会继续。
var limit = 10;
var result = [];
for (var i=0; i < limit; i++) {
var record = recordFactory.create();
if (i < 2) {
record.Value = 1;
} else {
record.Value = result[i-1].Value + result[i-2].Value;
}
result.push(record);
}
return result;
示例 2:向第三方 API 发出异步请求
以下脚本使用 Google Books API 搜索与用户输入 (SearchString
) 匹配的图书,并使用回调函数返回结果。
// Note: Include JQuery library for the application
// Search for a book matching the user's search string
var searchString = query.parameters.SearchString;
$.getJSON('https://www.googleapis.com/books/v1/volumes?q=' + encodeURI(searchString), function(result){
var records = result.items.map(function(bookData){
// Create a record from the book's data
var record = recordFactory.create();
record.Title = bookData.volumeInfo.title || null;
return record;
});
// Return results
callback.success(records);
});
示例 3:使用 success 和 failure 回调函数执行异步应用制作工具客户端 API 查询
以下脚本会在不立即提供结果的情况下异步返回结果。
externalApi.execute(function(results) {
if (results.length) {
сallback.success(mapResultsToRecords(results));
} else {
сallback.failure(‘No results were found');
}
});