| 714 | } |
| 715 | |
| 716 | TExpressionVariable TExpressionImpl::CalcVariantExpression(const IExpressionAdaptor& data) const { |
| 717 | TVector<TExpressionVariable> values(Operations.size()); |
| 718 | TExpressionVariable v; |
| 719 | for (size_t i = Operations.size(); i > 0; --i) { |
| 720 | switch (Operations[i - 1].Oper) { |
| 721 | case O_CONST: |
| 722 | values[i - 1] = Consts[Operations[i - 1].Input.front()]; |
| 723 | break; |
| 724 | case O_TOKEN: |
| 725 | if (data.FindValue(Tokens[Operations[i - 1].Input.front()], v)) |
| 726 | values[i - 1] = v; |
| 727 | else |
| 728 | values[i - 1] = Tokens[Operations[i - 1].Input.front()]; |
| 729 | break; |
| 730 | case O_IS_TOKEN: |
| 731 | values[i - 1] = data.FindValue(Tokens[Operations[i - 1].Input.front()], v) ? 1.0 : 0.0; |
| 732 | break; |
| 733 | case O_NOT: |
| 734 | values[i - 1] = values[Operations[i - 1].Input.front()].Not(); |
| 735 | break; |
| 736 | case O_MINUS: |
| 737 | values[i - 1] = values[Operations[i - 1].Input.front()].Minus(); |
| 738 | break; |
| 739 | case O_MIN: |
| 740 | values[i - 1] = values[Operations[i - 1].Input.front()].Min(values[Operations[i - 1].Input.back()]); |
| 741 | break; |
| 742 | case O_MAX: |
| 743 | values[i - 1] = values[Operations[i - 1].Input.front()].Max(values[Operations[i - 1].Input.back()]); |
| 744 | break; |
| 745 | case O_HISTOGRAM_PERCENTILE: |
| 746 | values[i - 1] = values[Operations[i - 1].Input.front()].HistogramPercentile(values[Operations[i - 1].Input.back()]); |
| 747 | break; |
| 748 | case O_OR: |
| 749 | values[i - 1] = values[Operations[i - 1].Input.front()].Or(values[Operations[i - 1].Input.back()]); |
| 750 | break; |
| 751 | case O_AND: |
| 752 | values[i - 1] = values[Operations[i - 1].Input.front()].And(values[Operations[i - 1].Input.back()]); |
| 753 | break; |
| 754 | case O_COND: |
| 755 | values[i - 1] = values[Operations[i - 1].Input[0]].Cond( |
| 756 | values[Operations[i - 1].Input[1]], |
| 757 | values[Operations[i - 1].Input[2]] |
| 758 | ); |
| 759 | break; |
| 760 | case O_STR_COND: |
| 761 | values[i - 1] = values[Operations[i - 1].Input[0]].StrCond( |
| 762 | values[Operations[i - 1].Input[1]], |
| 763 | values[Operations[i - 1].Input[2]] |
| 764 | ); |
| 765 | break; |
| 766 | case O_LE: |
| 767 | values[i - 1] = values[Operations[i - 1].Input.front()].Le(values[Operations[i - 1].Input.back()]); |
| 768 | break; |
| 769 | case O_L: |
| 770 | values[i - 1] = values[Operations[i - 1].Input.front()].L(values[Operations[i - 1].Input.back()]); |
| 771 | break; |
| 772 | case O_GE: |
| 773 | values[i - 1] = values[Operations[i - 1].Input.front()].Ge(values[Operations[i - 1].Input.back()]); |