计算模型

计算模型是一种虚拟模型。它是通过处理来自其他模型或外部资源的数据而创建的。数据在处理后将存储在应用制作工具服务器或客户端上,而不是存储在数据库中。

计算模型可以执行以下操作:

  • 根据其他模型的数据合成自定义报告
  • 从外部 Web 服务获取数据

计算模型类型

应用制作工具提供三种计算模型:

  • 计算 SQL 模型:该模型通过对应用的 Cloud SQL 数据库运行 SQL 查询来填充其记录。详细了解 SQL 计算模型
  • 计算模型:该模型使用服务器端查询脚本执行特定逻辑并返回一组记录。详细了解查询脚本示例
  • 客户端计算模型:该模型使用客户端查询脚本来同步提取数据,或使用回调函数返回异步结果。

客户端计算模型

客户端计算模型运行自定义查询脚本,而非常规数据源查询,并通过查询参数传入任何过滤条件。

如需使用自定义查询脚本,请执行以下操作:

  1. 转到客户端计算模型的 Datasources 标签页。
  2. 查询代码框中,输入自定义查询脚本。您的脚本必须包含 return 语句。
  3. 如需呈现从第三方服务中检索到的数据,请执行以下操作:
    1. 使用第三方 API 查询映射您的脚本查询。
    2. 将返回的数据映射到模型记录。

如何选择模型?

您可以根据下表和计算模型限制来确定最适合使用的模型类型。

目标 要使用的模型
通过应用中的模型重新构建数据。 计算 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 模型中的每条记录,并执行以下操作:

  1. 为发现的每个新位置创建一条记录。
  2. 针对具有重复位置的任何记录增加员工计数。

该脚本使用 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');
        }
      });