# mergeFrom详述

## 概述
mergeFrom是Cascade中根据规则将source级联表元素分配至另一个target级联表的
操作。这个匹配操作从顺序上可分为三个部分（三步匹配）。

1. 找到source中符合分配条件的元素。

2. 根据规则匹配到对应的target中的元素。

3. 匹配成功的元素之间进行后续操作。

在第一步操作中，不一定是所有元素都符合分配条件，那么就不会触发第二步操作，而是
会保存在一个unrecognized列表中。如果符合分配条件并进行至第二步操作，在第二步
操作中也未必会匹配到对应的target中的元素，那么会送往unmatched列表中。只有匹
配成功的才会进入第三步操作，这里的后续操作也可能是将source元素的某些属性赋值
给target元素，也可能是将source元素添加到target元素的下一级中。但这些操作是
作为mergeFrom的参数传入的，mergeFrom不为后续操作负责。

## 简化的匹配过程
作为基础数据结构，我们在很多地方已经用到了mergeFrom，比如

1. 按照voucherID匹配将明细序时账汇总至总序时账

2. 按照科目名称匹配将明细科目汇入总科目余额表

3. 按照科目名称将归类后的明细序时账汇入总科目余额表中的明细科目

以上操作其实是匹配操作的一个简化特例，在上述的三步匹配中，

1. 第一步source中所有的元素都要被分配

2. 第二步匹配方法是将source和target的元素分别形成索引，并且比较索引值是否严格相等

因此这种方法并不需要一个特定的规则集，而是先将source和target通过各自方法形成索引，
然后再逐个比较索引即可完成匹配任务（前两步）。

## 一般的匹配过程
但是在不满足以上需求的情形下，我们就需要一个规则集。并且这个过程会繁琐很多。

1. 对source和target进行索引

2. 遍历source中每一条记录，同时对于每一条记录，检查索引值是否能与规则集中任何一个
   source pattern匹配。匹配的方法未必是严格相等，由规则集来指定。如果没能匹配到，
   则送入uncategorized并结束，否则则继续进行。

3. 在规则集中使用source pattern所对应的target pattern在target中检查有无记录
   的索引值能匹配。如果没能匹配到，则送入unmatched并结束，否则继续进行。需要注意
   的是，规则集中可能并不是source pattern直接associate到target pattern，而
   是历经了某些中间结果判断。

   中间判断的机制需要查询protomap中的实现细节。具体的判断过程需要交给rule的具体
   实现。

4. 进行后续操作。