Skip to content

Commit

Permalink
docs: add samples for transflow
Browse files Browse the repository at this point in the history
  • Loading branch information
phodal committed Dec 26, 2021
1 parent 8331c7b commit eefe047
Showing 1 changed file with 71 additions and 24 deletions.
95 changes: 71 additions & 24 deletions examples/quake_book/0003-transflow.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Transflow
title: "Transflow"
created_date: 2021-12-10 19:21:10
updated_date: 2021-12-10 19:21:10
updated_date: 2021-12-26 23:35:39
order:
author:
---
Expand All @@ -12,6 +12,7 @@ author:

Transflow 的设计起源需要那篇《[类型流(TypeFlow)——世俗化的函数式编程和改进的过程式设计](https://zhuanlan.zhihu.com/p/341089716)》说起。Typeflow 有几个主要的规则:


1. 从可视化模型上就可以看出:共存在4个待实现的函数,其中两个纯函数,参数校验和返回结果包装;一个副作用函数,保存代办事项;还有一个输入端口,即把这个几个函数编排起来完成业务的程序入口。
2. 每个函数有明确的输入输出类型
3. 函数之间通过匹配的输入输出类型连接起来。
Expand All @@ -36,7 +37,6 @@ from('todo','blog').to(<quake-calendar>);

这个 Transflow 的 DSL,最简模式下(即没有函数名、不添加数据映射(mapping)和过滤器(filter)、组件定义的情况下),它可以生成以下的 JavaScript 代码:


```javascript
function from_todo_blog_to_quake_calendar(todos, blogs) {
let results = [];
Expand All @@ -63,6 +63,7 @@ const tl_temp_1 = async (context, commands) => {

代码逻辑上是:


1. 创建一个新的 Quake Calendar 组件(Web Component)
2. 获取 todo、blog 相关的数据
3. 执行对应的数据转换规则
Expand Down Expand Up @@ -107,25 +108,12 @@ Transflow 生成的代码,面临的最大问题是数据量大时的性能问

既然,我们是对数据流进行操作,那么理想情况下,Transflow 的 DSL 就可以设计为向函数式靠齐。不过,当前,我们还没有理由实现这么复杂的功能,可以在后续展开。

### mapping

上述的 `from('todo','blog').to(<quake-calendar>);` 会在转化时生成特定的数据结构。因此,也可以直接从数据结构中读取对应的 Transflow,对它们进行存储:

```yaml
- name: "from_todo_blog_to_quake_calendar_timeline"
from: [ "todo", "blog" ]
to: "<quake-calendar-timeline>"
mapping:
- entry: "todo"
source: ["title", "content", "start_time", "updated_date"]
target: ["title", "content", "created_date", "updated_date"]
- entry: "blog"
source: ["title", "content", "start_time", "updated_date"]
target: ["title", "content", "created_date", "updated_date"]
```
### From

`from` 用于定义数据源,当前支持的方式:

这里的 `map` 是一个尚未在 DSL 设计的功能,也需要进一步验证是否真的需要。除此,这个 YAML 的设计也是有问题的。
* Quake 自定义的 Entry 类型
* RESTful API (待完善)

### Filter

Expand All @@ -137,7 +125,11 @@ Transflow 生成的代码,面临的最大问题是数据量大时的性能问
from('todo','blog').to(<quake-calendar>).filter('created_date > 2021.01.01 AND created_date < 2021.12.31')
```

由于搜索引擎并不支持各种各样的时间处理,所以我们可以替换对应的字符器,然后:
由于搜索引擎并不支持各种各样的时间处理,所以我们可以替换对应的字符器。当前有:

* `quake_time.rs` 的时间转换逻辑。

随后转换为:

```javascript
created_date > 1609459200 AND created_date < 1640908800
Expand All @@ -153,8 +145,63 @@ created_date > 1609459200 AND created_date < 1640908800
from('todo','blog').to(<quake-calendar>).map('blog.content => content | uppercase | substring(1, 150)')
```

生成的数据转换代码示例:

```javascript
results.push({
type: "blog",
title: blog.title,
content: blog.content.uppercase().substring(1,150),
created_date: blog.created_date
})
```

即:`blog.content.uppercase().substring(1,150)`

主要类型:

- string。转换规则:uppercase, substring, date, float, int,
- int。转换规则:sqrt, sin, cos
- date。
* string。转换规则:uppercase, substring, date, float, int,
* int。转换规则:sqrt, sin, cos
* date。

处理逻辑:


1. `quake_parser.rs` 解析 Transflow 中的 map DSL。
2. 生成 `quake.rs` 中对应的数据结构
3. 转换为 Transflow,
4. 通过 `js_flow_codegen.rs` 生成最后的函数 。

转换算子的处理逻辑:

```rust
for operator in &stream.operators {
str = format!(
"{:}.{:}({:})",
str,
operator.operator,
operator.params_stringify().join(",")
);
}
```

### Mapping 函数(临时 API)

上述的 `from('todo','blog').to(<quake-calendar>);` 会在转化时生成特定的数据结构。因此,也可以直接从数据结构中读取对应的 Transflow,对它们进行存储:

```yaml
- name: "from_todo_blog_to_quake_calendar_timeline"
from: [ "todo", "blog" ]
to: "<quake-calendar-timeline>"
mapping:
- entry: "todo"
source: ["title", "content", "start_time", "updated_date"]
target: ["title", "content", "created_date", "updated_date"]
- entry: "blog"
source: ["title", "content", "start_time", "updated_date"]
target: ["title", "content", "created_date", "updated_date"]
```
这里的 `map` 是一个尚未在 DSL 设计的功能,也需要进一步验证是否真的需要。除此,这个 YAML 的设计也是有问题的。

###

0 comments on commit eefe047

Please sign in to comment.