You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by xx...@apache.org on 2022/08/18 01:15:59 UTC

[kylin] branch doc5.0 updated (830a52f0b2 -> edb8106c51)

This is an automated email from the ASF dual-hosted git repository.

xxyu pushed a change to branch doc5.0
in repository https://gitbox.apache.org/repos/asf/kylin.git


    from 830a52f0b2 KYLIN-5221 minor fix conflict
     new 55e131d671 KYLIN-5221 minor fix markdown links
     new edb8106c51 KYLIN-5221 add query and snapshot doc

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 website/docs/configuration/query_cache.md          |   2 +-
 .../deployment/installation/install_validation.md  |   2 +-
 website/docs/integration/intro.md                  |  19 ++
 .../data-access-control/acl_table.md               |   4 +-
 website/docs/operations/access-control/intro.md    |   8 +-
 .../system-operation/diagnosis/diagnosis.md        |   2 +-
 .../operations/system-operation/limit_query.md     |   2 -
 website/docs/query/data_type.md                    |  35 ++++
 website/docs/query/history.md                      | 136 ++++++++++++++
 .../images/pushdown/multi_check_export.en.png      | Bin 0 -> 323220 bytes
 .../query/images/pushdown/one_click_copy.en.png    | Bin 0 -> 230644 bytes
 website/docs/query/images/pushdown/pushdown.en.png | Bin 0 -> 145785 bytes
 website/docs/query/images/pushdown/sorting.en.png  | Bin 0 -> 376473 bytes
 website/docs/query/images/query_history.en.png     | Bin 0 -> 247654 bytes
 website/docs/query/images/query_history2.en.png    | Bin 0 -> 147978 bytes
 website/docs/query/images/query_history3.en.png    | Bin 0 -> 444360 bytes
 website/docs/query/images/query_history4.en.png    | Bin 0 -> 378233 bytes
 website/docs/query/images/query_history5.en.png    | Bin 0 -> 187080 bytes
 website/docs/query/insight/async_query.md          | 106 +++++++++++
 .../query/insight/images/data_sql/date_sql1.en.png | Bin 0 -> 261426 bytes
 .../query/insight/images/data_sql/date_sql2.en.png | Bin 0 -> 269576 bytes
 .../insight/images/insight/insight_input_query.png | Bin 0 -> 143172 bytes
 .../images/insight/insight_list_history.png        | Bin 0 -> 124844 bytes
 .../images/insight/insight_list_tables.en.png      | Bin 0 -> 162241 bytes
 .../insight/images/insight/insight_save_query.png  | Bin 0 -> 75146 bytes
 .../insight/images/insight/insight_show_result.png | Bin 0 -> 146467 bytes
 .../images/insight/insight_step_duration1.png      | Bin 0 -> 71006 bytes
 .../images/insight/insight_stop_query.en.png       | Bin 0 -> 135510 bytes
 .../insight/insight_stop_query_result.en.png       | Bin 0 -> 129988 bytes
 .../images/insight/insight_visualization.png       | Bin 0 -> 341314 bytes
 .../images/pushdown/multi_check_export.en.png      | Bin 0 -> 323220 bytes
 .../insight/images/pushdown/one_click_copy.en.png  | Bin 0 -> 230644 bytes
 .../query/insight/images/pushdown/pushdown.en.png  | Bin 0 -> 145785 bytes
 .../query/insight/images/pushdown/sorting.en.png   | Bin 0 -> 376473 bytes
 website/docs/query/insight/images/spec/1.png       | Bin 0 -> 187872 bytes
 website/docs/query/insight/images/spec/4.en.png    | Bin 0 -> 72467 bytes
 website/docs/query/insight/images/spec/5.png       | Bin 0 -> 183604 bytes
 website/docs/query/insight/images/spec/6.png       | Bin 0 -> 183680 bytes
 website/docs/query/insight/images/spec/7.png       | Bin 0 -> 170998 bytes
 website/docs/query/insight/images/spec/8.png       | Bin 0 -> 176355 bytes
 .../images/visualization/result_display_bar.png    | Bin 0 -> 115738 bytes
 .../images/visualization/result_display_line.png   | Bin 0 -> 165589 bytes
 .../images/visualization/result_display_pie.png    | Bin 0 -> 73510 bytes
 website/docs/query/insight/insight.md              | 101 +++++++++++
 website/docs/query/insight/intro.md                |  47 +++++
 .../function/aggregate_function.md                 |  27 +++
 .../function/arithmetic_function.md                |  58 ++++++
 .../operator_function/function/bitmap_function.md  | 155 ++++++++++++++++
 .../function/conditional_function.md               |  25 +++
 .../function/datetime_function.md                  |  48 +++++
 .../function/grouping_function.md                  |  95 ++++++++++
 .../function/images/arithmetic_function.en.png     | Bin 0 -> 9573 bytes
 .../function/images/bitmap_uuid.1.en.png           | Bin 0 -> 76211 bytes
 .../function/images/date_string.png                | Bin 0 -> 16860 bytes
 .../function/images/first_last_value_en.png        | Bin 0 -> 355492 bytes
 .../function/images/grouping_en.png                | Bin 0 -> 273305 bytes
 .../function/images/grouping_sets.1.png            | Bin 0 -> 11933 bytes
 .../function/images/grouping_sets.2.png            | Bin 0 -> 11140 bytes
 .../function/images/grouping_sets_function_en.png  | Bin 0 -> 304051 bytes
 .../function/images/intersect_bitmap_uuid.1.en.png | Bin 0 -> 79531 bytes
 .../images/intersect_bitmap_uuid2.1.en.png         | Bin 0 -> 81244 bytes
 .../function/images/intersect_bitmap_uuid2.1.png   | Bin 0 -> 141068 bytes
 .../function/images/intersect_count.1.en.png       | Bin 0 -> 140322 bytes
 .../function/images/intersect_count.2.en.png       | Bin 0 -> 78565 bytes
 .../function/images/intersect_count2.1.en.png      | Bin 0 -> 85828 bytes
 .../images/intersect_count_by_col.1.en.png         | Bin 0 -> 97364 bytes
 .../function/images/intersect_value.1.en.png       | Bin 0 -> 154131 bytes
 .../function/images/intersect_value.2.en.png       | Bin 0 -> 83196 bytes
 .../function/images/intersect_value2.1.en.png      | Bin 0 -> 83837 bytes
 .../function/images/lead_lag_en.png                | Bin 0 -> 300367 bytes
 .../operator_function/function/images/ntile_en.png | Bin 0 -> 283175 bytes
 .../operator_function/function/images/operator.png | Bin 0 -> 24501 bytes
 .../function/images/rank_and_drank_en.png          | Bin 0 -> 118075 bytes
 .../function/images/rollup_function_en.png         | Bin 0 -> 241884 bytes
 .../function/images/row_number_en.png              | Bin 0 -> 53349 bytes
 .../function/images/timestamp_string.png           | Bin 0 -> 19170 bytes
 .../function/intersect_function.md                 | 195 +++++++++++++++++++++
 .../insight/operator_function/function/intro.md    |  30 ++++
 .../function/miscellaneous_function.md             |  23 +++
 .../operator_function/function/string_function.md  |  50 ++++++
 .../operator_function/function/type_function.md    |  30 ++++
 .../operator_function/function/window_function.md  | 165 +++++++++++++++++
 .../docs/query/insight/operator_function/intro.md  |  18 ++
 .../insight/operator_function/model_priority.md    |  40 +++++
 .../operator/arithmetic_operator.md                |  23 +++
 .../operator/comparison_operator.md                |  38 ++++
 .../operator_function/operator/images/string.png   | Bin 0 -> 85727 bytes
 .../insight/operator_function/operator/intro.md    |  21 +++
 .../operator_function/operator/logical_operator.md |  31 ++++
 .../operator_function/operator/string_operator.md} |  14 +-
 website/docs/query/insight/sql_spec.md             | 180 +++++++++++++++++++
 website/docs/query/intro.md                        |  25 +--
 website/docs/query/optimization/intro.md           |  19 ++
 website/docs/query/optimization/query_enhanced.md  | 128 ++++++++++++++
 website/docs/query/optimization/segment_pruning.md |  39 +++++
 .../docs/query/pushdown/images/query_pushdown.png  | Bin 0 -> 51412 bytes
 .../query/pushdown/images/query_pushdown_spark.png | Bin 0 -> 264272 bytes
 website/docs/query/pushdown/intro.md               |  22 +++
 .../query/pushdown/pushdown_to_embedded_spark.md   | 152 ++++++++++++++++
 website/docs/restapi/acl_api/acl_api.md            |   2 +-
 website/docs/restapi/data_source_api.md            |   6 +-
 website/docs/restapi/error_code.md                 |   4 +-
 website/docs/snapshot/images/snapshot_1_en.png     | Bin 0 -> 160171 bytes
 website/docs/snapshot/images/snapshot_2_en.png     | Bin 0 -> 327685 bytes
 website/docs/snapshot/images/snapshot_3_en.png     | Bin 0 -> 313893 bytes
 website/docs/snapshot/images/snapshot_4_en.png     | Bin 0 -> 49314 bytes
 website/docs/snapshot/images/snapshot_5_en.png     | Bin 0 -> 39123 bytes
 website/docs/snapshot/images/snapshot_6_en.png     | Bin 0 -> 53449 bytes
 website/docs/snapshot/images/snapshot_7_en.png     | Bin 0 -> 45056 bytes
 website/docs/snapshot/images/snapshot_8_en.png     | Bin 0 -> 71365 bytes
 website/docs/snapshot/images/snapshot_9_en.png     | Bin 0 -> 38628 bytes
 website/docs/snapshot/intro.md                     |  18 ++
 website/docs/snapshot/snapshot_management.md       | 121 +++++++++++++
 website/docusaurus.config.js                       |  17 +-
 website/sidebars.js                                | 103 +++++++++--
 115 files changed, 2330 insertions(+), 56 deletions(-)
 create mode 100644 website/docs/integration/intro.md
 create mode 100644 website/docs/query/data_type.md
 create mode 100644 website/docs/query/history.md
 create mode 100644 website/docs/query/images/pushdown/multi_check_export.en.png
 create mode 100644 website/docs/query/images/pushdown/one_click_copy.en.png
 create mode 100644 website/docs/query/images/pushdown/pushdown.en.png
 create mode 100644 website/docs/query/images/pushdown/sorting.en.png
 create mode 100644 website/docs/query/images/query_history.en.png
 create mode 100644 website/docs/query/images/query_history2.en.png
 create mode 100644 website/docs/query/images/query_history3.en.png
 create mode 100644 website/docs/query/images/query_history4.en.png
 create mode 100644 website/docs/query/images/query_history5.en.png
 create mode 100644 website/docs/query/insight/async_query.md
 create mode 100644 website/docs/query/insight/images/data_sql/date_sql1.en.png
 create mode 100644 website/docs/query/insight/images/data_sql/date_sql2.en.png
 create mode 100644 website/docs/query/insight/images/insight/insight_input_query.png
 create mode 100644 website/docs/query/insight/images/insight/insight_list_history.png
 create mode 100644 website/docs/query/insight/images/insight/insight_list_tables.en.png
 create mode 100644 website/docs/query/insight/images/insight/insight_save_query.png
 create mode 100644 website/docs/query/insight/images/insight/insight_show_result.png
 create mode 100644 website/docs/query/insight/images/insight/insight_step_duration1.png
 create mode 100644 website/docs/query/insight/images/insight/insight_stop_query.en.png
 create mode 100644 website/docs/query/insight/images/insight/insight_stop_query_result.en.png
 create mode 100644 website/docs/query/insight/images/insight/insight_visualization.png
 create mode 100644 website/docs/query/insight/images/pushdown/multi_check_export.en.png
 create mode 100644 website/docs/query/insight/images/pushdown/one_click_copy.en.png
 create mode 100644 website/docs/query/insight/images/pushdown/pushdown.en.png
 create mode 100644 website/docs/query/insight/images/pushdown/sorting.en.png
 create mode 100644 website/docs/query/insight/images/spec/1.png
 create mode 100644 website/docs/query/insight/images/spec/4.en.png
 create mode 100644 website/docs/query/insight/images/spec/5.png
 create mode 100644 website/docs/query/insight/images/spec/6.png
 create mode 100644 website/docs/query/insight/images/spec/7.png
 create mode 100644 website/docs/query/insight/images/spec/8.png
 create mode 100644 website/docs/query/insight/images/visualization/result_display_bar.png
 create mode 100644 website/docs/query/insight/images/visualization/result_display_line.png
 create mode 100644 website/docs/query/insight/images/visualization/result_display_pie.png
 create mode 100644 website/docs/query/insight/insight.md
 create mode 100644 website/docs/query/insight/intro.md
 create mode 100644 website/docs/query/insight/operator_function/function/aggregate_function.md
 create mode 100644 website/docs/query/insight/operator_function/function/arithmetic_function.md
 create mode 100644 website/docs/query/insight/operator_function/function/bitmap_function.md
 create mode 100644 website/docs/query/insight/operator_function/function/conditional_function.md
 create mode 100644 website/docs/query/insight/operator_function/function/datetime_function.md
 create mode 100644 website/docs/query/insight/operator_function/function/grouping_function.md
 create mode 100644 website/docs/query/insight/operator_function/function/images/arithmetic_function.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/bitmap_uuid.1.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/date_string.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/first_last_value_en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/grouping_en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/grouping_sets.1.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/grouping_sets.2.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/grouping_sets_function_en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid.1.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid2.1.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid2.1.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/intersect_count.1.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/intersect_count.2.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/intersect_count2.1.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/intersect_count_by_col.1.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/intersect_value.1.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/intersect_value.2.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/intersect_value2.1.en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/lead_lag_en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/ntile_en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/operator.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/rank_and_drank_en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/rollup_function_en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/row_number_en.png
 create mode 100644 website/docs/query/insight/operator_function/function/images/timestamp_string.png
 create mode 100644 website/docs/query/insight/operator_function/function/intersect_function.md
 create mode 100644 website/docs/query/insight/operator_function/function/intro.md
 create mode 100644 website/docs/query/insight/operator_function/function/miscellaneous_function.md
 create mode 100644 website/docs/query/insight/operator_function/function/string_function.md
 create mode 100644 website/docs/query/insight/operator_function/function/type_function.md
 create mode 100644 website/docs/query/insight/operator_function/function/window_function.md
 create mode 100644 website/docs/query/insight/operator_function/intro.md
 create mode 100644 website/docs/query/insight/operator_function/model_priority.md
 create mode 100644 website/docs/query/insight/operator_function/operator/arithmetic_operator.md
 create mode 100644 website/docs/query/insight/operator_function/operator/comparison_operator.md
 create mode 100644 website/docs/query/insight/operator_function/operator/images/string.png
 create mode 100644 website/docs/query/insight/operator_function/operator/intro.md
 create mode 100644 website/docs/query/insight/operator_function/operator/logical_operator.md
 copy website/docs/{deployment/on-premises/intro.md => query/insight/operator_function/operator/string_operator.md} (52%)
 create mode 100755 website/docs/query/insight/sql_spec.md
 create mode 100644 website/docs/query/optimization/intro.md
 create mode 100644 website/docs/query/optimization/query_enhanced.md
 create mode 100644 website/docs/query/optimization/segment_pruning.md
 create mode 100644 website/docs/query/pushdown/images/query_pushdown.png
 create mode 100644 website/docs/query/pushdown/images/query_pushdown_spark.png
 create mode 100644 website/docs/query/pushdown/intro.md
 create mode 100644 website/docs/query/pushdown/pushdown_to_embedded_spark.md
 create mode 100644 website/docs/snapshot/images/snapshot_1_en.png
 create mode 100644 website/docs/snapshot/images/snapshot_2_en.png
 create mode 100644 website/docs/snapshot/images/snapshot_3_en.png
 create mode 100644 website/docs/snapshot/images/snapshot_4_en.png
 create mode 100644 website/docs/snapshot/images/snapshot_5_en.png
 create mode 100644 website/docs/snapshot/images/snapshot_6_en.png
 create mode 100644 website/docs/snapshot/images/snapshot_7_en.png
 create mode 100644 website/docs/snapshot/images/snapshot_8_en.png
 create mode 100644 website/docs/snapshot/images/snapshot_9_en.png
 create mode 100644 website/docs/snapshot/intro.md
 create mode 100644 website/docs/snapshot/snapshot_management.md


[kylin] 02/02: KYLIN-5221 add query and snapshot doc

Posted by xx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xxyu pushed a commit to branch doc5.0
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit edb8106c51636ac709495c0ed6b4a132cf2c1dc1
Author: Mukvin <bo...@163.com>
AuthorDate: Wed Aug 17 16:49:07 2022 +0800

    KYLIN-5221 add query and snapshot doc
---
 website/docs/integration/intro.md                  |  19 ++
 website/docs/query/data_type.md                    |  35 ++++
 website/docs/query/history.md                      | 136 ++++++++++++++
 .../images/pushdown/multi_check_export.en.png      | Bin 0 -> 323220 bytes
 .../query/images/pushdown/one_click_copy.en.png    | Bin 0 -> 230644 bytes
 website/docs/query/images/pushdown/pushdown.en.png | Bin 0 -> 145785 bytes
 website/docs/query/images/pushdown/sorting.en.png  | Bin 0 -> 376473 bytes
 website/docs/query/images/query_history.en.png     | Bin 0 -> 247654 bytes
 website/docs/query/images/query_history2.en.png    | Bin 0 -> 147978 bytes
 website/docs/query/images/query_history3.en.png    | Bin 0 -> 444360 bytes
 website/docs/query/images/query_history4.en.png    | Bin 0 -> 378233 bytes
 website/docs/query/images/query_history5.en.png    | Bin 0 -> 187080 bytes
 website/docs/query/insight/async_query.md          | 106 +++++++++++
 .../query/insight/images/data_sql/date_sql1.en.png | Bin 0 -> 261426 bytes
 .../query/insight/images/data_sql/date_sql2.en.png | Bin 0 -> 269576 bytes
 .../insight/images/insight/insight_input_query.png | Bin 0 -> 143172 bytes
 .../images/insight/insight_list_history.png        | Bin 0 -> 124844 bytes
 .../images/insight/insight_list_tables.en.png      | Bin 0 -> 162241 bytes
 .../insight/images/insight/insight_save_query.png  | Bin 0 -> 75146 bytes
 .../insight/images/insight/insight_show_result.png | Bin 0 -> 146467 bytes
 .../images/insight/insight_step_duration1.png      | Bin 0 -> 71006 bytes
 .../images/insight/insight_stop_query.en.png       | Bin 0 -> 135510 bytes
 .../insight/insight_stop_query_result.en.png       | Bin 0 -> 129988 bytes
 .../images/insight/insight_visualization.png       | Bin 0 -> 341314 bytes
 .../images/pushdown/multi_check_export.en.png      | Bin 0 -> 323220 bytes
 .../insight/images/pushdown/one_click_copy.en.png  | Bin 0 -> 230644 bytes
 .../query/insight/images/pushdown/pushdown.en.png  | Bin 0 -> 145785 bytes
 .../query/insight/images/pushdown/sorting.en.png   | Bin 0 -> 376473 bytes
 website/docs/query/insight/images/spec/1.png       | Bin 0 -> 187872 bytes
 website/docs/query/insight/images/spec/4.en.png    | Bin 0 -> 72467 bytes
 website/docs/query/insight/images/spec/5.png       | Bin 0 -> 183604 bytes
 website/docs/query/insight/images/spec/6.png       | Bin 0 -> 183680 bytes
 website/docs/query/insight/images/spec/7.png       | Bin 0 -> 170998 bytes
 website/docs/query/insight/images/spec/8.png       | Bin 0 -> 176355 bytes
 .../images/visualization/result_display_bar.png    | Bin 0 -> 115738 bytes
 .../images/visualization/result_display_line.png   | Bin 0 -> 165589 bytes
 .../images/visualization/result_display_pie.png    | Bin 0 -> 73510 bytes
 website/docs/query/insight/insight.md              | 101 +++++++++++
 website/docs/query/insight/intro.md                |  47 +++++
 .../function/aggregate_function.md                 |  27 +++
 .../function/arithmetic_function.md                |  58 ++++++
 .../operator_function/function/bitmap_function.md  | 155 ++++++++++++++++
 .../function/conditional_function.md               |  25 +++
 .../function/datetime_function.md                  |  48 +++++
 .../function/grouping_function.md                  |  95 ++++++++++
 .../function/images/arithmetic_function.en.png     | Bin 0 -> 9573 bytes
 .../function/images/bitmap_uuid.1.en.png           | Bin 0 -> 76211 bytes
 .../function/images/date_string.png                | Bin 0 -> 16860 bytes
 .../function/images/first_last_value_en.png        | Bin 0 -> 355492 bytes
 .../function/images/grouping_en.png                | Bin 0 -> 273305 bytes
 .../function/images/grouping_sets.1.png            | Bin 0 -> 11933 bytes
 .../function/images/grouping_sets.2.png            | Bin 0 -> 11140 bytes
 .../function/images/grouping_sets_function_en.png  | Bin 0 -> 304051 bytes
 .../function/images/intersect_bitmap_uuid.1.en.png | Bin 0 -> 79531 bytes
 .../images/intersect_bitmap_uuid2.1.en.png         | Bin 0 -> 81244 bytes
 .../function/images/intersect_bitmap_uuid2.1.png   | Bin 0 -> 141068 bytes
 .../function/images/intersect_count.1.en.png       | Bin 0 -> 140322 bytes
 .../function/images/intersect_count.2.en.png       | Bin 0 -> 78565 bytes
 .../function/images/intersect_count2.1.en.png      | Bin 0 -> 85828 bytes
 .../images/intersect_count_by_col.1.en.png         | Bin 0 -> 97364 bytes
 .../function/images/intersect_value.1.en.png       | Bin 0 -> 154131 bytes
 .../function/images/intersect_value.2.en.png       | Bin 0 -> 83196 bytes
 .../function/images/intersect_value2.1.en.png      | Bin 0 -> 83837 bytes
 .../function/images/lead_lag_en.png                | Bin 0 -> 300367 bytes
 .../operator_function/function/images/ntile_en.png | Bin 0 -> 283175 bytes
 .../operator_function/function/images/operator.png | Bin 0 -> 24501 bytes
 .../function/images/rank_and_drank_en.png          | Bin 0 -> 118075 bytes
 .../function/images/rollup_function_en.png         | Bin 0 -> 241884 bytes
 .../function/images/row_number_en.png              | Bin 0 -> 53349 bytes
 .../function/images/timestamp_string.png           | Bin 0 -> 19170 bytes
 .../function/intersect_function.md                 | 195 +++++++++++++++++++++
 .../insight/operator_function/function/intro.md    |  30 ++++
 .../function/miscellaneous_function.md             |  23 +++
 .../operator_function/function/string_function.md  |  50 ++++++
 .../operator_function/function/type_function.md    |  30 ++++
 .../operator_function/function/window_function.md  | 165 +++++++++++++++++
 .../docs/query/insight/operator_function/intro.md  |  18 ++
 .../insight/operator_function/model_priority.md    |  40 +++++
 .../operator/arithmetic_operator.md                |  23 +++
 .../operator/comparison_operator.md                |  38 ++++
 .../operator_function/operator/images/string.png   | Bin 0 -> 85727 bytes
 .../insight/operator_function/operator/intro.md    |  21 +++
 .../operator_function/operator/logical_operator.md |  31 ++++
 .../operator_function/operator/string_operator.md  |  21 +++
 website/docs/query/insight/sql_spec.md             | 180 +++++++++++++++++++
 website/docs/query/intro.md                        |  25 +--
 website/docs/query/optimization/intro.md           |  19 ++
 website/docs/query/optimization/query_enhanced.md  | 128 ++++++++++++++
 website/docs/query/optimization/segment_pruning.md |  39 +++++
 .../docs/query/pushdown/images/query_pushdown.png  | Bin 0 -> 51412 bytes
 .../query/pushdown/images/query_pushdown_spark.png | Bin 0 -> 264272 bytes
 website/docs/query/pushdown/intro.md               |  22 +++
 .../query/pushdown/pushdown_to_embedded_spark.md   | 152 ++++++++++++++++
 website/docs/snapshot/images/snapshot_1_en.png     | Bin 0 -> 160171 bytes
 website/docs/snapshot/images/snapshot_2_en.png     | Bin 0 -> 327685 bytes
 website/docs/snapshot/images/snapshot_3_en.png     | Bin 0 -> 313893 bytes
 website/docs/snapshot/images/snapshot_4_en.png     | Bin 0 -> 49314 bytes
 website/docs/snapshot/images/snapshot_5_en.png     | Bin 0 -> 39123 bytes
 website/docs/snapshot/images/snapshot_6_en.png     | Bin 0 -> 53449 bytes
 website/docs/snapshot/images/snapshot_7_en.png     | Bin 0 -> 45056 bytes
 website/docs/snapshot/images/snapshot_8_en.png     | Bin 0 -> 71365 bytes
 website/docs/snapshot/images/snapshot_9_en.png     | Bin 0 -> 38628 bytes
 website/docs/snapshot/intro.md                     |  18 ++
 website/docs/snapshot/snapshot_management.md       | 121 +++++++++++++
 website/docusaurus.config.js                       |  17 +-
 website/sidebars.js                                | 103 +++++++++--
 106 files changed, 2327 insertions(+), 34 deletions(-)

diff --git a/website/docs/integration/intro.md b/website/docs/integration/intro.md
new file mode 100644
index 0000000000..1a40d70996
--- /dev/null
+++ b/website/docs/integration/intro.md
@@ -0,0 +1,19 @@
+---
+title: Integrate with BI Tools
+language: en
+sidebar_label: Integrate with BI Tools
+pagination_label: Integrate with BI Tools
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - integrate with bi tools
+    - bi
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+This chapter introduces how Kylin can be integrated with BI tools.
+
diff --git a/website/docs/query/data_type.md b/website/docs/query/data_type.md
new file mode 100644
index 0000000000..6c7a912477
--- /dev/null
+++ b/website/docs/query/data_type.md
@@ -0,0 +1,35 @@
+---
+title: Data Types
+language: en
+sidebar_label: Data Types
+pagination_label: Data Types
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - data types
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+Supported data types:
+
+| Data Types  | Description                                                  | Range of Numbers                                             |
+| ----------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| tinyint     | Small interger numbers.                           | (-128,127)                                                  |
+| smallint    | Small interger numbers.                           | (-32,768,32,767)                                            |
+| int/integer | Integer numbers.                                  | (-2,147,483,648,2,147,483,647)                              |
+| bigint      | Large integer numbers.                            | (-9,223,372,036,854,775,808,9,223,372,036,854,775,807)      |
+| float       | Single-precision floating point numbers.          | (-3.402823466E+38,-1.175494351E-38),0,(1.175494351E-38,3.402823466351E+38) |
+| double      | Double-precision floating point numbers.          | (-1.7976931348623157E+308,-2.2250738585072014E-308),0,(2.2250738585072014E-308,1.797693134 8623157E+308) |
+| decimal     | An exact numeric data type defined by its *precision* (total number of digits) and *scale* (number of digits to the right of the decimal point). | ---                                                          |
+| timestamp   | Values comprising values of fields year, month, day, hour, minute, and second, with the session local time-zone. The timestamp value represents an absolute point in time. | ---                                                          |
+| date        | Values comprising values of fields year, month and day, without a time-zone | ---                                                          |
+| varchar     | Variable length string                            | ---                                                          |
+| char        | Fixed length string                               | ---                                                          |
+| boolean     | Boolean values                                    | ---                                                          |
+
+> **Note**: There is an inaccurate accuracy problem when calculating double type data.
+
diff --git a/website/docs/query/history.md b/website/docs/query/history.md
new file mode 100644
index 0000000000..3c29a70ac0
--- /dev/null
+++ b/website/docs/query/history.md
@@ -0,0 +1,136 @@
+---
+title: Query History
+language: en
+sidebar_label: Query History
+pagination_label: Query History
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - query history
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+All the queries that you executed in Kylin will be saved in query history, you can check it out in the left side navigation bar **Query -> History**.
+This page saves the basic information of queries, such as query time, SQL statement, query user, etc. This helps you to record query behaviors, which enables you to better manage and optimize the models. This chapter will presents you the content of query history page.
+
+
+
+### Prerequisite
+
+1. Before introducing **Query History** page, we recommend you to execute several SQL statements.
+
+2. Take the model we built in the quick start as an example. After you complete the quick start, and all the jobs in **Monitor -> Job** are finished, you can execute the following queries in **Query -> Insight** page.
+
+
+- Query 1:query total revenue.
+
+  ```sql
+  select SUM(LO_REVENUE) as TOTAL_REVENUE from SSB.P_LINEORDER
+  ```
+
+  > Hint:column *LO_REVENUE* 's SUM measure exists.
+
+- Query 2:query total order price.
+
+  ```sql
+  select SUM(LO_ORDTOTALPRICE) from SSB.P_LINEORDER
+  ```
+
+  > Hint:column *LO_ORDTOTALPRICE* 's SUM measure not exists.
+
+- Query 3:query name of commodities.
+
+  ```sql
+  select P_NAME from SSB.P_LINEORDER
+  ```
+
+  > Hint:this is a wrong query,because column *P_NAME* does not exist in table *P_LINEORDER*.
+
+
+### Query History Page
+
+Please enter the query history page by clicking **Query -> History** in the navigator bar, after executing the above SQL statements, you will see the following content.
+
+![Query History](./images/query_history.en.png)
+
+Each line in the picture is a query history record. The meaning of the columns are as follows:
+
+- **Start time**: The time the query was submitted.
+
+- **Duration**: The time taken to complete the query. If the query fails, it is displayed as blank.
+
+- **Query ID**: A unique ID number for each query, which is an automatically generated sequence number.
+
+- **SQL Statement**: SQL statement that was executed.
+
+- **Answered By**: There are four query objects. The blue name indicates the query hit model (index group). As shown in the diagram, the model name is *test_model_name1578277468526*, *HIVE* indicates that the query is pushed down to Hive, and *CONSTANTS* indicates Query constant, blank indicates that the query failed.
+
+  There are four types of query objects that a query hits: All Models, HIVE, CONSTANTS, Model Name.
+
+    - All Models: Indicates that the query hits the model
+
+    - Hive: Indicates that the query is pushed down to Hive
+
+    - CONSTANTS: Indicates query constant
+
+    - Model Name: Represents the name of the model hit by the query
+
+- **Query Status**: There are two query statuses. Queries that hit the model and push down show *Succeeded* and queries that have syntax errors, unsupported syntax, and timeouts show *Failed*.
+
+- **Query Node**: The hostname : port of query node.
+
+- **Submitter**: User who submits the query to Kylin.
+
+- **Actions**: Download the query diagnostic package.
+
+When you click on the icon to the left of a query, the execution details of the query will be displayed, as shown below:
+
+![Query Execution Detail](./images/query_history2.en.png)
+
+On the left is the SQL statement, you can copy and paste and then query. The fields on the right have the following meanings:
+
+- **Query ID**: A unique ID number for each query, which is an automatically generated sequence number.
+- **Duration**: The time taken to complete the query. If the query fails, it is displayed as *Failed*. When you need to optimize for slow queries, you should analyze the query's specific execution steps and locate the reasons. It would help if you hovered the mouse over the duration to see the current query's detailed execution steps and duration.
+- **Answered By**: The entity who answered the query.
+- **Index ID**: The index who answered the query.
+- **Total Scan Count**: Total scanned lines of the query.
+- **Total Scan Bytes**: Total scanned bytes of the query.
+- **Result Row Count**: Total lines of the query result.
+- **If Hit Cache**: Whether the query hits the cache.
+- **Cache Type**: When the query hits the cache, it displays the type of cache hit. `EHCACHE` stands for EHCACHE cache, `REDIS` stands for REDIS distributed cache.
+
+When you click on the error details to the right of a query failure, the exception details of that query are displayed,as shown below:
+
+![Query Exception Message](./images/query_history5.en.png)
+
+> **Note**: When SQL does not wrap, only the first 100 lines of SQL can be seen in the query execution details. When SQL wraps, the details display the first 2000 characters. You can click the copy button in the upper right corner of the SQL statement box to copy the complete SQL statement.
+
+Kylin uses the built-in RDBMS to save information about queries. You can refer to all fields and meanings related to query history in the appendix [Query History Fields Table](../../installation/rdbms_metastore/query_history_fields.en.md).
+
+
+
+### Query History Retention
+
+In order to ensure the read and write performance of the query history and database stability, Kylin sets a default retention limit for the query history:
+
+- The default total number of retained records is 10 million, which can be adjusted by configuring `kylin.query.queryhistory.max-size` in `kylin.properties`
+    - The default number of retained records in one project is 1 million, which can be adjusted by configuring `kylin.query.queryhistory.project-max-size` in `kylin.properties`
+- The total retention time is 30 days, which can be adjusted by configuring `kylin.query.queryhistory.survival-time-threshold` in `kylin.properties`
+
+
+
+### Export query history
+
+The query history can be exported as a csv file, as shown in the figure below, the export result is the filtered data.
+![Export query history](./images/query_history3.en.png)
+
+You can also export the sql in the query history as a text file separately, as shown in the figure below, the export result is also the filtered data.
+![Export SQL](./images/query_history4.en.png)
+
+Query history support configuration export upper limit, the default value is 100000.
+```kylin.query.query-history-download-max-size=100000```
+
diff --git a/website/docs/query/images/pushdown/multi_check_export.en.png b/website/docs/query/images/pushdown/multi_check_export.en.png
new file mode 100644
index 0000000000..08b684f8ff
Binary files /dev/null and b/website/docs/query/images/pushdown/multi_check_export.en.png differ
diff --git a/website/docs/query/images/pushdown/one_click_copy.en.png b/website/docs/query/images/pushdown/one_click_copy.en.png
new file mode 100644
index 0000000000..29a1c7d5b3
Binary files /dev/null and b/website/docs/query/images/pushdown/one_click_copy.en.png differ
diff --git a/website/docs/query/images/pushdown/pushdown.en.png b/website/docs/query/images/pushdown/pushdown.en.png
new file mode 100644
index 0000000000..03ca97430c
Binary files /dev/null and b/website/docs/query/images/pushdown/pushdown.en.png differ
diff --git a/website/docs/query/images/pushdown/sorting.en.png b/website/docs/query/images/pushdown/sorting.en.png
new file mode 100644
index 0000000000..0023cf771f
Binary files /dev/null and b/website/docs/query/images/pushdown/sorting.en.png differ
diff --git a/website/docs/query/images/query_history.en.png b/website/docs/query/images/query_history.en.png
new file mode 100644
index 0000000000..f12f926d21
Binary files /dev/null and b/website/docs/query/images/query_history.en.png differ
diff --git a/website/docs/query/images/query_history2.en.png b/website/docs/query/images/query_history2.en.png
new file mode 100644
index 0000000000..e512786377
Binary files /dev/null and b/website/docs/query/images/query_history2.en.png differ
diff --git a/website/docs/query/images/query_history3.en.png b/website/docs/query/images/query_history3.en.png
new file mode 100644
index 0000000000..d9dedb9502
Binary files /dev/null and b/website/docs/query/images/query_history3.en.png differ
diff --git a/website/docs/query/images/query_history4.en.png b/website/docs/query/images/query_history4.en.png
new file mode 100644
index 0000000000..72b95d2093
Binary files /dev/null and b/website/docs/query/images/query_history4.en.png differ
diff --git a/website/docs/query/images/query_history5.en.png b/website/docs/query/images/query_history5.en.png
new file mode 100644
index 0000000000..663e89a53e
Binary files /dev/null and b/website/docs/query/images/query_history5.en.png differ
diff --git a/website/docs/query/insight/async_query.md b/website/docs/query/insight/async_query.md
new file mode 100644
index 0000000000..9e9c94512f
--- /dev/null
+++ b/website/docs/query/insight/async_query.md
@@ -0,0 +1,106 @@
+---
+title: Asynchronous query
+language: en
+sidebar_label: Asynchronous query
+pagination_label: Asynchronous query
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+   - asynchronous query
+   - async query
+draft: true
+last_update:
+   date: 08/17/2022
+---
+
+
+Asynchronous query supports users to execute SQL queries asynchronously and provides a more efficient way to export data. For example, if the result set of a SQL query
+Too large (million results) or SQL execution time is too long, through asynchronous query, the query result set can be exported efficiently to realize self-service data retrieval
+Various application scenarios.
+
+Currently, asynchronous query only supports calling REST API. For how to use asynchronous query API, please read-[Asynchronous Query API](../../restapi/async_query_api.md).
+
+### Configure the retention time for asynchronous query results
+
+Asynchronous query supports the following configuration in `kylin.properties`:
+
+-`kylin.query.async.result-retain-days=7d`: The retention time of asynchronous query results on HDFS. The default is 7 days, that is, asynchronous query results and related files older than 7 days will be cleaned up
+
+### Configure a separate cluster queue for asynchronous query
+
+In general, the same cluster queue can be used for asynchronous query and normal query. In some advanced scenarios, if you want to prevent asynchronous queries from affecting ordinary queries, you can deploy a separate queue for asynchronous queries. The specific configuration method is as follows:
+
+1. Enable asynchronous query to deploy a separate cluster queue setting. Set `kylin.query.unique-async-query-yarn-queue-enabled` to `true`. Support project-level configuration and system-level configuration. The priority of project-level configuration is higher than system-level configuration. If neither is configured, asynchronous query and normal query use the same cluster queue.
+
+2. Specify the queue used for asynchronous queries. Three levels are supported for designation, the priority from high to low is as follows:
+
+   -Query level, specified by API request parameter `spark_queue`
+   -Project level, specified by setting `kylin.query.async-query.spark-conf.spark.yarn.queue`
+   -System level, specified by setting `kylin.query.async-query.spark-conf.spark.yarn.queue` in the configuration file `/conf/kylin.properties`
+
+   > **Tip**: If none of the three are configured, the default queue is `default`
+
+3. Set configuration: `kylin.query.async-query.submit-hadoop-conf-dir=$KYLIN_HOME/async_query_hadoop_conf`
+
+4. Put the hadoop configuration of the asynchronous query cluster into the $KYLIN_HOME/async_query_hadoop_conf directory, and put the hive-site.xml for building the cluster into this directory.
+    If Kerberos authentication is enabled, you need to copy the krb5.conf file to the $KYLIN_HOME/async_query_hadoop_conf directory.
+
+5. If Kerberos authentication is enabled between asynchronous query cluster, query cluster, and build cluster, the following additional configuration is required:
+
+    ```
+     kylin.storage.columnar.spark-conf.spark.yarn.access.hadoopFileSystems=hdfs://readcluster,hdfs://asyncquerycluster,hdfs://writecluster
+     kylin.query.async-query.spark-conf.spark.yarn.access.hadoopFileSystems=hdfs://readcluster,hdfs://asyncquerycluster,hdfs://writecluster
+     kylin.engine.spark-conf.spark.yarn.access.hadoopFileSystems=hdfs://readcluster,hdfs://asyncquerycluster,hdfs://writecluster
+    ```
+
+6. In general, the above configuration can meet the requirements. In some more advanced scenarios, you can configure spark related configurations in `kylin.properties` to achieve more fine-grained control with guidance of Kyligence expert.
+
+   The configuration starts with `kylin.query.async-query.spark-conf`, as shown below:
+
+```
+kylin.query.async-query.spark-conf.spark.yarn.queue=default
+kylin.query.async-query.spark-conf.spark.executor.extraJavaOptions=-Dhdp.version=current -Dlog4j.configuration=spark-executor-log4j.properties -Dlog4j.debug -Dkylin.hdfs.working.dir=$ {kylin.env.hdfs-working-dir} -Dkap.metadata.identifier=${kylin.metadata.url.identifier} -Dkap.spark.category=sparder -Dkap.spark.project=${job.project}- Dkap.spark.mountDir=${kylin.tool.mount-spark-log-dir} -XX:MaxDirectMemorySize=896M
+kylin.query.async-query.spark-conf.spark.yarn.am.extraJavaOptions=-Dhdp.version=current
+kylin.query.async-query.spark-conf.spark.driver.extraJavaOptions=-Dhdp.version=current
+kylin.query.async-query.spark-conf.spark.port.maxRetries=128
+kylin.query.async-query.spark-conf.spark.driver.memory=4096m
+kylin.query.async-query.spark-conf.spark.sql.driver.maxCollectSize=3600m
+kylin.query.async-query.spark-conf.spark.executor.memory=12288m
+kylin.query.async-query.spark-conf.spark.executor.memoryOverhead=3072m
+kylin.query.async-query.spark-conf.spark.yarn.am.memory=1024m
+kylin.query.async-query.spark-conf.spark.executor.cores=5
+kylin.query.async-query.spark-conf.spark.executor.instances=4
+kylin.query.async-query.spark-conf.spark.task.maxFailures=1
+kylin.query.async-query.spark-conf.spark.ui.port=4041
+kylin.query.async-query.spark-conf.spark.locality.wait=0s
+kylin.query.async-query.spark-conf.spark.sql.dialect=hiveql
+kylin.query.async-query.spark-conf.spark.sql.constraintPropagation.enabled=false
+kylin.query.async-query.spark-conf.spark.ui.retainedStages=300
+kylin.query.async-query.spark-conf.spark.hadoop.yarn.timeline-service.enabled=false
+kylin.query.async-query.spark-conf.spark.hadoop.hive.exec.scratchdir=${kylin.env.hdfs-working-dir}/hive-scratch
+kylin.query.async-query.spark-conf.hive.execution.engine=MR
+kylin.query.async-query.spark-conf.spark.sql.crossJoin.enabled=true
+kylin.query.async-query.spark-conf.spark.broadcast.autoClean.enabled=true
+kylin.query.async-query.spark-conf.spark.sql.objectHashAggregate.sortBased.fallbackThreshold=1
+kylin.query.async-query.spark-conf.spark.sql.hive.caseSensitiveInferenceMode=NEVER_INFER
+kylin.query.async-query.spark-conf.spark.sql.sources.bucketing.enabled=false
+kylin.query.async-query.spark-conf.spark.yarn.stagingDir=${kylin.env.hdfs-working-dir}
+kylin.query.async-query.spark-conf.spark.eventLog.enabled=true
+kylin.query.async-query.spark-conf.spark.history.fs.logDirectory=${kylin.env.hdfs-working-dir}/sparder-history
+kylin.query.async-query.spark-conf.spark.eventLog.dir=${kylin.env.hdfs-working-dir}/sparder-history
+kylin.query.async-query.spark-conf.spark.eventLog.rolling.enabled=true
+kylin.query.async-query.spark-conf.spark.eventLog.rolling.maxFileSize=100m
+kylin.query.async-query.spark-conf.spark.sql.cartesianPartitionNumThreshold=-1
+kylin.query.async-query.spark-conf.parquet.filter.columnindex.enabled=false
+kylin.query.async-query.spark-conf.spark.master=yarn
+kylin.query.async-query.spark-conf.spark.submit.deployMode=client
+```
+
+
+### Limitations
+
+- Asynchronous query does not support query cache.
+- When the select column of SQL contains `,;{}()=`, these characters will be converted to `_` in the result file.
+
diff --git a/website/docs/query/insight/images/data_sql/date_sql1.en.png b/website/docs/query/insight/images/data_sql/date_sql1.en.png
new file mode 100644
index 0000000000..f407c6fa99
Binary files /dev/null and b/website/docs/query/insight/images/data_sql/date_sql1.en.png differ
diff --git a/website/docs/query/insight/images/data_sql/date_sql2.en.png b/website/docs/query/insight/images/data_sql/date_sql2.en.png
new file mode 100644
index 0000000000..e2b18d2fc5
Binary files /dev/null and b/website/docs/query/insight/images/data_sql/date_sql2.en.png differ
diff --git a/website/docs/query/insight/images/insight/insight_input_query.png b/website/docs/query/insight/images/insight/insight_input_query.png
new file mode 100644
index 0000000000..901914ea51
Binary files /dev/null and b/website/docs/query/insight/images/insight/insight_input_query.png differ
diff --git a/website/docs/query/insight/images/insight/insight_list_history.png b/website/docs/query/insight/images/insight/insight_list_history.png
new file mode 100644
index 0000000000..960c39e994
Binary files /dev/null and b/website/docs/query/insight/images/insight/insight_list_history.png differ
diff --git a/website/docs/query/insight/images/insight/insight_list_tables.en.png b/website/docs/query/insight/images/insight/insight_list_tables.en.png
new file mode 100644
index 0000000000..4f2b339396
Binary files /dev/null and b/website/docs/query/insight/images/insight/insight_list_tables.en.png differ
diff --git a/website/docs/query/insight/images/insight/insight_save_query.png b/website/docs/query/insight/images/insight/insight_save_query.png
new file mode 100644
index 0000000000..abb2d3abb3
Binary files /dev/null and b/website/docs/query/insight/images/insight/insight_save_query.png differ
diff --git a/website/docs/query/insight/images/insight/insight_show_result.png b/website/docs/query/insight/images/insight/insight_show_result.png
new file mode 100644
index 0000000000..075d114339
Binary files /dev/null and b/website/docs/query/insight/images/insight/insight_show_result.png differ
diff --git a/website/docs/query/insight/images/insight/insight_step_duration1.png b/website/docs/query/insight/images/insight/insight_step_duration1.png
new file mode 100644
index 0000000000..39c0cabc13
Binary files /dev/null and b/website/docs/query/insight/images/insight/insight_step_duration1.png differ
diff --git a/website/docs/query/insight/images/insight/insight_stop_query.en.png b/website/docs/query/insight/images/insight/insight_stop_query.en.png
new file mode 100644
index 0000000000..a2cdf9401f
Binary files /dev/null and b/website/docs/query/insight/images/insight/insight_stop_query.en.png differ
diff --git a/website/docs/query/insight/images/insight/insight_stop_query_result.en.png b/website/docs/query/insight/images/insight/insight_stop_query_result.en.png
new file mode 100644
index 0000000000..d467061575
Binary files /dev/null and b/website/docs/query/insight/images/insight/insight_stop_query_result.en.png differ
diff --git a/website/docs/query/insight/images/insight/insight_visualization.png b/website/docs/query/insight/images/insight/insight_visualization.png
new file mode 100644
index 0000000000..859ef9b345
Binary files /dev/null and b/website/docs/query/insight/images/insight/insight_visualization.png differ
diff --git a/website/docs/query/insight/images/pushdown/multi_check_export.en.png b/website/docs/query/insight/images/pushdown/multi_check_export.en.png
new file mode 100644
index 0000000000..08b684f8ff
Binary files /dev/null and b/website/docs/query/insight/images/pushdown/multi_check_export.en.png differ
diff --git a/website/docs/query/insight/images/pushdown/one_click_copy.en.png b/website/docs/query/insight/images/pushdown/one_click_copy.en.png
new file mode 100644
index 0000000000..29a1c7d5b3
Binary files /dev/null and b/website/docs/query/insight/images/pushdown/one_click_copy.en.png differ
diff --git a/website/docs/query/insight/images/pushdown/pushdown.en.png b/website/docs/query/insight/images/pushdown/pushdown.en.png
new file mode 100644
index 0000000000..03ca97430c
Binary files /dev/null and b/website/docs/query/insight/images/pushdown/pushdown.en.png differ
diff --git a/website/docs/query/insight/images/pushdown/sorting.en.png b/website/docs/query/insight/images/pushdown/sorting.en.png
new file mode 100644
index 0000000000..0023cf771f
Binary files /dev/null and b/website/docs/query/insight/images/pushdown/sorting.en.png differ
diff --git a/website/docs/query/insight/images/spec/1.png b/website/docs/query/insight/images/spec/1.png
new file mode 100644
index 0000000000..6d689ceb30
Binary files /dev/null and b/website/docs/query/insight/images/spec/1.png differ
diff --git a/website/docs/query/insight/images/spec/4.en.png b/website/docs/query/insight/images/spec/4.en.png
new file mode 100644
index 0000000000..3422547389
Binary files /dev/null and b/website/docs/query/insight/images/spec/4.en.png differ
diff --git a/website/docs/query/insight/images/spec/5.png b/website/docs/query/insight/images/spec/5.png
new file mode 100644
index 0000000000..fd41e4abb6
Binary files /dev/null and b/website/docs/query/insight/images/spec/5.png differ
diff --git a/website/docs/query/insight/images/spec/6.png b/website/docs/query/insight/images/spec/6.png
new file mode 100644
index 0000000000..09612b034b
Binary files /dev/null and b/website/docs/query/insight/images/spec/6.png differ
diff --git a/website/docs/query/insight/images/spec/7.png b/website/docs/query/insight/images/spec/7.png
new file mode 100644
index 0000000000..1a9f54a920
Binary files /dev/null and b/website/docs/query/insight/images/spec/7.png differ
diff --git a/website/docs/query/insight/images/spec/8.png b/website/docs/query/insight/images/spec/8.png
new file mode 100644
index 0000000000..62d1d542ea
Binary files /dev/null and b/website/docs/query/insight/images/spec/8.png differ
diff --git a/website/docs/query/insight/images/visualization/result_display_bar.png b/website/docs/query/insight/images/visualization/result_display_bar.png
new file mode 100644
index 0000000000..0439fc006c
Binary files /dev/null and b/website/docs/query/insight/images/visualization/result_display_bar.png differ
diff --git a/website/docs/query/insight/images/visualization/result_display_line.png b/website/docs/query/insight/images/visualization/result_display_line.png
new file mode 100644
index 0000000000..c77bc96665
Binary files /dev/null and b/website/docs/query/insight/images/visualization/result_display_line.png differ
diff --git a/website/docs/query/insight/images/visualization/result_display_pie.png b/website/docs/query/insight/images/visualization/result_display_pie.png
new file mode 100644
index 0000000000..c23255a57b
Binary files /dev/null and b/website/docs/query/insight/images/visualization/result_display_pie.png differ
diff --git a/website/docs/query/insight/insight.md b/website/docs/query/insight/insight.md
new file mode 100644
index 0000000000..7878b557b8
--- /dev/null
+++ b/website/docs/query/insight/insight.md
@@ -0,0 +1,101 @@
+---
+title: Execute SQL Query in Web UI
+language: en
+sidebar_label: Execute SQL Query in Web UI
+pagination_label: Execute SQL Query in Web UI
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - execute sql query in web ui
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+
+Open  kylin Web UI, click **Query -> Insight** button on the navigation bar, all query-able tables will be listed on the left side of page. Enter SQL in textbox on the right side of page, query result will be shown at the below textbox.
+
+![Insight page](images/insight/insight_list_tables.en.png)
+
+
+
+### Execute SQL Queries
+
+Enter a select query and click **Run Query**, you will see query results. Note the **Limit** field at the bottom right of the page. If there's no limit clause in your SQL statement, the system will apply a default limit value, which is 500. You can uncheck the checkbox in front of the limit field, if you want to disable the limit utterly.
+
+```sql
+select LO_ORDERDATE, count(*)
+from SSB.P_LINEORDER
+group by LO_ORDERDATE
+```
+
+After query results returned successfully, you can find that the query execution time is about 0.96 seconds, and the query hits the model.
+
+At the same time, you can see that the query ID is followed by an arrow. Click the arrow to open the query page in the Spark UI. On this page, you can easily see the SQL execution in Spark.
+
+![Execute SQL Queries](images/insight/insight_input_query.png)
+
+When you need to optimize for slow queries, you should analyze the query's specific execution steps and locate the reasons. It would help if you hovered the mouse over the duration to see the current query's detailed execution steps and duration.
+
+![Query Duration](images/insight/insight_step_duration1.png)
+
+> **Note**:
+>
+> 1. Only **SELECT** queries are supported.
+> 2. When query pushdown is enabled, queries that cannot be served by model (index group) will be routed to the pushdown engine for execution. In this case, it will take longer to return and the query may be answered by Hive.
+> 3. If the query does not need Spark calculation, such as hitting the query cache, constant query, etc. There will be no arrow followed by the query ID.
+> 4. When the query uses tiered storage, the total scan counts needs to be obtained manually.
+
+### Stop query
+
+After clicking the **Run Query** button, click the **Stop** button in the same position to stop the query.
+
+![](images/insight/insight_stop_query.en.png)
+
+After the query is stopped, query ID and error message will be displayed.
+
+![](images/insight/insight_stop_query_result.en.png)
+
+
+In addition, clicking the **Close** button of the query will also stop the query.
+
+### Save Query
+
+User could click **Save SQL** button at bottom right corner to save queries, the queries are associated with the current user. Click the **Save Query** button below the SQL Editor and you will be prompted to enter a *Query Name* and a *Description* in the pop-up window to save the query.
+
+![Save Query](images/insight/insight_save_query.png)
+
+### Saved Query
+Click the **Saved Queries** button at the top right of the SQL Editor to view all saved queries. A list of saved queries will be shown in the pop-up window. You can check the box in front of the query and click the **Run Query** button to re-execute.
+
+![Saved Query](images/insight/insight_list_history.png)
+
+
+
+### Query Result
+
+kylin displays query result in table by default. You can search for the query content in the **Filter box** at the top right of the query result, which is a fuzzy search. If you enter `1992`, each line in the query result will contain `1992`, as shown below is the daily order volume in year 1992. You can also export query results to a CSV file.
+
+![Query Result](images/insight/insight_show_result.png)
+
+
+
+### Query Visualization
+
+In addition to tables, kylin also supports visualization of query results for quick insight.
+
+Support chart type: Line Chart, Bar Chart, Pie Chart.
+
+![Visualization](images/insight/insight_visualization.png)
+
+### Other ways to execute SQL queries
+
+- [Integration with BI tools](../../integration/intro.md)
+
+
+
+### Notices
+
+- If a query can be answered by both index and snapshot, snapshot answers the query.
diff --git a/website/docs/query/insight/intro.md b/website/docs/query/insight/intro.md
new file mode 100644
index 0000000000..c63bab0612
--- /dev/null
+++ b/website/docs/query/insight/intro.md
@@ -0,0 +1,47 @@
+---
+title: Basic Query Execution
+language: en
+sidebar_label: Basic Query Execution
+pagination_label: Basic Query Execution
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - basic query execution
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+
+kylin offers an Intelligent OLAP Platform for big data to simplify multidimensional analytics for cloud data lake. kylin finishes data loading and precomputation with the index building jobs and delivers sub-second query latency on massive dataset.
+
+Unlike the execution process of regular queries, kylin will be using precalculated data to answer queries instead of doing the calculation online, which will improve query performance significantly.
+
+### Query Execution Process with Precalculation
+
+Different from regular query engines, kylin uses precalculated results to replace real time calculation, in order to improve the query performance and concurrency. A simplified version of query execution process can be described as below:
+
+1. Parse SQL statement and extract all the `FROM` clauses. 
+
+2. Find the **matching** and **minimum cost** model for each `FROM` clause.
+
+   The **matching** here means:
+
+   * The relationship of tables used in `FROM` clause must match the fact and dimension tables defined in models. Please note that the relationship of `LEFT JOIN` does not match `INNER JOIN`.
+   * For aggregate queries, the columns in `GROUP BY` clause must be defined as dimensions in models. Meanwhile, the aggregate functions in `SELECT` clause must be defined as measures in models. 
+   * For non-aggregate queries, table index must be defined in models and all columns appeared in query must be contained in the table index.
+
+   The **minimum cost** here means that kylin will automatically select the minimum cost index if there are multiple matching indices. For example, table index can also serve aggregate queries, but its cost is high because of the real time calculation. Therefore, using table index to answer aggregate query is always the last option and only happens when all aggregate indices cannot match.
+
+3. If all the `FROM` clauses match successfully, kylin will execute the query using index data.
+
+   All the `FROM` clauses will be replaced by precalculated results, and the query will execute from there to get the final result. If you execute queries via Web UI, you can find the name(s) of the answering model(s) in the **Answered By** field after a query returns successfully. For more details, please refer to [Execute SQL Query in Web UI](insight.en.md).
+
+4. If there is one or more `FROM` clause cannot find a matching index, then kylin cannot execute the query using index data.x
+
+   The query will fail with an error message of `no model found` or `no realization found`. This means the data required for this query does not exist in the system.
+
+   As a special case, if the pushdown engine is enabled, then kylin will not report error, and instead route this query to the pushdown engine. For more details, please refer to [Query Pushdown](../../../Designers-Guide/query/pushdown/README.md).
+
diff --git a/website/docs/query/insight/operator_function/function/aggregate_function.md b/website/docs/query/insight/operator_function/function/aggregate_function.md
new file mode 100644
index 0000000000..76b1796cd1
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/aggregate_function.md
@@ -0,0 +1,27 @@
+---
+title: Aggregate Functions
+language: en
+sidebar_label: Aggregate Functions
+pagination_label: Aggregate Functions
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - aggregate functions
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+
+| Syntax       | Description                                                  | Example                                                      | Normal Query | Pushdown Query | Defined as Computed Column | Suggested as Computed Column |
+| ------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------ | -------------- | -------------------------- | ---------------------------- |
+| AVG(numeric) | Returns the average (arithmetic mean) of *numeric* across all input values | `SELECT AVG(PRICE) FROM KYLIN_SALES` <br /> = 49.23855638491023 | ✔️            | ✔️              | ❌                          | ❌                            |
+| SUM(numeric) | Returns the sum of *numeric* across all input values         | `SELECT SUM(PRICE) FROM KYLIN_SALES`<br /> = 244075.5240     | ✔️            | ✔️              | ❌                          | ❌                            |
+| MAX(value)   | Returns the maximum value of *value* across all input values | `SELECT MAX(PRICE) FROM KYLIN_SALES`<br /> = 99.9865         | ✔️            | ✔️              | ❌                          | ❌                            |
+| MIN(value)   | Returns the minimum value of *value* across all input values | `SELECT MIN(PRICE) FROM KYLIN_SALES`<br /> = 0.0008          | ✔️            | ✔️              | ❌                          | ❌                            |
+| COUNT(value) | Returns the number of input rows for which *value* is not null (wholly not null if *value* is composite) | `SELECT count(PRICE) FROM KYLIN_SALES` <br /> = 4957         | ✔️            | ✔️              | ❌                          | ❌                            |
+| COUNT(*)     | Returns the number of input rows                             | `SELECT COUNT(*) FROM KYLIN_COUNTRY`<br /> = 244             | ✔️            | ✔️              | ❌                          | ❌                            |
+| CORR(value1, value2) | Returns the correlation of two columns                | `SELECT CORR(ITEM_COUNT, PRICE) FROM KYLIN_SALES`<br /> = 0.1278             | ✔️        | ✔️        | ❌                | ❌                |
+
diff --git a/website/docs/query/insight/operator_function/function/arithmetic_function.md b/website/docs/query/insight/operator_function/function/arithmetic_function.md
new file mode 100644
index 0000000000..0ac084d476
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/arithmetic_function.md
@@ -0,0 +1,58 @@
+---
+title: Arithmetic Functions
+language: en
+sidebar_label: Arithmetic Functions
+pagination_label: Arithmetic Functions
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - arithmetic functions
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+| Syntax               | Description                                                | Example                  | Normal Query      | Pushdown Query    | Defined as Computed Column | Suggested as Computed Column |
+| ------------------------------ | ------------------------------------------------------------ | ---------------------------- | ---------------------------- | ---------------------------- | ---------------------------- | -- |
+| ABS(numeric)                   | Returns the absolute value of *numeric*                      | `ABS(-2)` = 2  | ✔️ | ✔️ | ✔️ | ✔️ |
+| CEIL(numeric)                  | Rounds *numeric* up, returning the smallest integer that is greater than or equal to *numeric* | ` CEIL(-2.2)` = -2 | ✔️ | ✔️ | ✔️ | ✔️ |
+| FLOOR(numeric)                 | Rounds *numeric* down, returning the largest integer that is less than or equal to *numeric* | ` FLOOR(-2.2)` = -3 | ✔️ | ✔️ | ✔️ | ✔️ |
+| MOD(numeric1, numeric2)        | Returns the remainder (modulus) of *numeric1* divided by *numeric2*. The result is negative only if *numeric1* is negative | `MOD(-3, 2)` = -1 | ✔️ | ✔️ | ❌ | ❌ |
+| SQRT(numeric)                  | Returns the square root of *numeric*                         | `SQRT(16)` = 4.0 | ✔️ | ✔️ | ✔️ | ❌ |
+| CBRT(numeric)                  | Returns the cube root of *numeric*.                          | ` CBRT(27.0)` = 3.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| HYPOT(numeric1, numeric2)      | Returns ![arithmetic_function](images/arithmetic_function.en.png) | ` HYPOT(3, 4)` = 5.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| LN(numeric)                    | Returns the natural logarithm (base *e*) of *numeric*        | ` LN(2)` = 0.6931471805599453 | ✔️ | ✔️ | ✔️ | ✔️ |
+| LOG(base, numeric)             | Returns the logarithm of *numeric* with *base*.              | ` LOG(10, 100)` = 2.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| LOG10(numeric)                 | Returns the base 10 logarithm of *numeric*                   | ` LOG10(100)` = 2.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| LOG1P(numeric)                 | Returns ln(1 + *numeric*).                                   | ` LOG1P(0)` = 0.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| LOG2(numeric)                  | Returns the logarithm of *numeric* with base 2.              | ` LOG2(2)` = 1.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| EXP(numeric)                   | Returns *e* raised to the power of *numeric*                 | ` EXP(1)` = 2.718281828459045 | ✔️ | ✔️ | ✔️ | ✔️ |
+| EXPM1(numeric)                 | Returns exp(*numeric*) - 1.                                  | ` EXPM1(0)` = 0.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| POWER(numeric1, numeric2)      | Returns *numeric1* raised to the power of *numeric2*         | `POWER(5,2)` = 25.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| RAND([seed])                   | Generates a random double between 0 and 1 inclusive, optionally initializing the random number generator with *seed* | ` RAND(15)` = 0.45951471073476047 | ❌ | ✔️ | ❌ | ❌ |
+| COS(numeric)                   | Returns the cosine of *numeric*                              | ` COS(5)`= 0.28366218546322625 | ✔️ | ✔️ | ✔️ | ✔️ |
+| SIN(numeric)                   | Returns the sine of *numeric*                                | ` SIN(5)`= -0.9589242746631385 | ✔️ | ✔️ | ✔️ | ✔️ |
+| TAN(numeric)                   | Returns the tangent of *numeric*                             | ` TAN(5)` = -3.380515006246586 | ✔️ | ✔️ | ✔️ | ✔️ |
+| COT(numeric)                   | Returns the cotangent of *numeric*                           | ` COT(5)` = -0.2958129155327455 | ✔️ | ✔️ | ✔️ | ✔️ |
+| ACOS(numeric)                  | Returns the arc cosine of *numeric*                          | ` ACOS(0.8)` = 0.6435011087932843 | ✔️ | ✔️ | ✔️ | ✔️ |
+| ASIN(numeric)                  | Returns the arc sine of *numeric*                            | ` ASIN(0.8)` = 0.9272952180016123 | ✔️ | ✔️ | ✔️ | ✔️ |
+| ATAN(numeric)                  | Returns the arc tangent of *numeric*                         | ` ATAN(0.8)` = 0.6747409422235527 | ✔️ | ✔️ | ✔️ | ✔️ |
+| ATAN2(numeric1, numeric2)      | Returns the arc tangent of the *numeric*coordinates          | ` ATAN2(0.2, 0.8)` = 0.24497866312686414 | ✔️ | ✔️ | ✔️ | ✔️ |
+| COSH(numeric)                  | Returns the hyperbolic cosine of *numeric*   | ` COSH(0)` = 1.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| SINH(numeric)                  | Returns hyperbolic sine of *numeric*         | ` SINH(0)` = 0.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| TANH(numeric)                  | Returns the hyperbolic tangent of *numeric*  | ` TANH(0)` = 0.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| DEGREES(numeric)               | Converts *numeric* from radians to degrees                   | ` DEGREES(5)` = 286.4788975654116 | ✔️ | ✔️ | ✔️ | ✔️ |
+| PI                             | Returns a value that is closer than any other value to *pi*  | ` PI` = 3.141592653589793           | ✔️         | ❌          | ❌          | ❌ |
+| RADIANS(numeric)               | Converts *numeric* from degrees to radians                   | ` RADIANS(90)`= 1.5707963267948966 | ✔️ | ✔️ | ✔️ | ✔️ |
+| BROUND(numeric1, int1)         | Returns *numeric1* rounded to *int1* decimal places using HALF_EVEN rounding mode.            | ` BROUND(2.5, 0)` = 2.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| ROUND(numeric1, int1)          | Returns *numeric1* rounded to *int1* decimal places using HALF_UP rounding mode.               | ` ROUND(2.5, 0) =` = 3 | ✔️ | ✔️ | ✔️ | ✔️ |
+| RINT(numeric)                  | Returns the double value that is closest in value to the argument and is equal to a mathematical integer. | ` RINT(12.3456)` = 12.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| SIGN(numeric)                  | Returns the signum of *numeric*                              | ` SIGN(-5)` = -1.0 | ✔️ | ✔️ | ✔️ | ✔️ |
+| CONV(numeric, from_base, to_base)     | Convert *numeric* from base *from_base* to base *to_base*. | ` CONV(-10, 16, -10)` = -16 | ✔️ | ✔️ | ✔️ | ✔️ |
+| CONV(string, from_base, to_base)      | Convert *numeric* (type string) from base *from_base* to base *to_base*. | ` CONV('100', 2, 10)`= 4 | ✔️ | ✔️ | ✔️ | ✔️ |
+| TRUNCATE(numeric1, numeric2)   | Truncates *numeric1* to optionally *numeric2*(if not specified 0) places right to the decimal point | ` TRUNCATE(5.55555,2)`= 5.5 | ✔️ | ✔️ | ✔️ | ✔️ |
+| FACTORIAL(numeric)             | Returns the factorial of *numeric*. expr is [0..20]. Otherwise, null. | ` FACTORIAL(5)` = 120 | ✔️ | ✔️ | ✔️ | ✔️ |
+
+**Notice**:  if the parameter of the `POWER` function is a constant conversion, like `CAST(2 AS DOUBLE)`, it may fail to be recommended as computed column.
diff --git a/website/docs/query/insight/operator_function/function/bitmap_function.md b/website/docs/query/insight/operator_function/function/bitmap_function.md
new file mode 100644
index 0000000000..9e0541d3b9
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/bitmap_function.md
@@ -0,0 +1,155 @@
+---
+title: Bitmap Function
+language: en
+sidebar_label: Bitmap Function
+pagination_label: Bitmap Function
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - bitmap function
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+Users can use bitmap functions to operate de-duplication based on bitmap. Then find the intersection of the result bitmaps. 
+
+Kylin supports following bitmap functions,
+
+
+
+### Prerequisites
+
+Kylin version is 5.0 or higher.
+  	
+
+### BITMAP_UUID
+
+- Description
+
+  - Return a string which points to a hidden serialized bitmap. The bitmap contains de-duplicated values and can be an input to other bitmap functions.
+
+- Syntax
+
+  - `bitmap_uuid(column_to_count)`
+  
+- Parameters
+
+  - `column_to_count` ,  the column to be calculated and applied on distinct value, required to be added as **Precise count distinct** measure.
+  
+- Query Example 1
+
+  ```select bitmap_uuid(SELLER_ID) from KYLIN_SALES where PART_DT=date'2012-01-01'```
+  
+- Response Example 1
+
+  ![](images/bitmap_uuid.1.en.png)
+
+  Return a string which points to a hidden serialized bitmap. The bitmap result is the de-duplicated seller id set of online transactions on New Year's Day. The bitmap can be used as an input to other bitmap functions.
+
+### INTERSECT_BITMAP_UUID
+
+- Description
+
+  - Return a string which points to a hidden serialized bitmap. The bitmap contains the result of finding intersection based on filter column, and then de-duplicating based on count column. 
+
+- Syntax
+
+  - `intersect_bitmap_uuid(column_to_count,  column_to_filter, filter_value_list)`
+  
+- Parameters
+
+  - `column_to_count` ,  the column to be calculated and applied on distinct value required to be added as **Precise count distinct** measure.
+  - `column_to_filter`, the varied dimension. 
+  - `filter_value_list`,  the value of the varied dimensions listed in `array[]`, When `column_to_filter` is of type varchar, A single element in an array can map multiple values. By default, the '|' is split. You can set `kylin.query.intersect.separator` in `kylin.properties` to configure the separator, Can take value '|' or ',', default is '|'(Currently this parameter does not support the use of subquery results as parameters).
+
+> **Note:** When the data type of a varied dimension is not varchar or integer, the values in 'filter_value_list' need to be explicitly cast, for example:
+> `select intersect_bitmap_uuid(column_to_count, column_to_filter, array[cast(3.53 as double), cast(5.79 as double)]) from ...`
+> OR `select intersect_bitmap_uuid(column_to_count, column_to_filter, array[TIMESTAMP'2012-01-02 11:23:45', TIMESTAMP'2012-01-01 11:23:45']) from ...`
+
+- Query Example 1
+
+  LSTG_FORMAT_NAME is a column of VARCHAR(4096) varied dimension.
+  
+  ```
+  select intersect_bitmap_uuid(
+          SELLER_ID, LSTG_FORMAT_NAME,
+          array['FP-GTC|FP-non GTC', 'Others'])
+      from KYLIN_SALES
+  ```
+  
+- Response Example 1
+
+  ![](images/intersect_bitmap_uuid.1.en.png)
+  
+  Return a string which points to a hidden serialized bitmap. The bitmap result is the de-duplicated seller id set who have transactions in either type 'FP-GTC' and 'Others', or type 'FP-non GTC' or 'Others' on New Year's Day. The bitmap can be used as an input to other bitmap functions.
+
+### INTERSECT_BITMAP_UUID_V2
+
+- Description
+  - Return a string which points to a hidden serialized bitmap. The bitmap contains the result of finding intersection based on filter column, and then de-duplicating based on count column. Support Regexp in condition.
+- Syntax
+  - `intersect_bitmap_uuid_v2(column_to_count,  column_to_filter, filter_value_list, filter_type)`
+- Parameters
+  - `column_to_count` ,  the column to be calculated and applied on distinct value required to be added as **Precise count distinct** measure.
+  - `column_to_filter`, the varied dimension. 
+  - `filter_value_list`,  the value of the varied dimensions listed in `array[]`,
+  - `filter_type`, the data type is String, which identifies the filter mode. There are currently two optional values "RAWSTRING" and "REGEXP". When the parameter value is "RAWSTRING", the filtering mode is precise filtering. When `column_to_filter` is a Varchar type, A single element in the array can be mapped with multiple values. By default, it is separated by '|'. You can use `kylin.query.intersect.separator` to configure the separator. And only support configuration in the `kylin.pr [...]
+
+> **Note:**  When the filter_type is "RAWSTRING" and the data type of a varied dimension is not varchar or integer, the values in 'filter_value_list' need to be explicitly cast, for example:
+> `select intersect_bitmap_uuid_v2(column_to_count, column_to_filter, array[cast(3.53 as double), cast(5.79 as double)], 'RAWSTRING') from TEST_TABLE`
+> 或 `select intersect_bitmap_uuid_v2(column_to_count, column_to_filter, array[TIMESTAMP'2012-01-02 11:23:45', TIMESTAMP'2012-01-01 11:23:45'], 'RAWSTRING') from TEST_TABLE;`
+
+- Query Example 1
+
+  LSTG_FORMAT_NAME is a column of VARCHAR(4096) varied dimension.
+
+  ```
+  select intersect_bitmap_uuid_v2(
+          SELLER_ID, LSTG_FORMAT_NAME,
+          array['FP.*GTC', 'Other.*'], 'REGEXP')
+      from KYLIN_SALES
+  ```
+
+- Response Example 1
+
+  ![](images/intersect_bitmap_uuid2.1.en.png)
+
+  Return a string which points to a hidden serialized bitmap. The regular expression can match 'FP-GTC', 'FP-non GTC' and 'Others', The bitmap result is the de-duplicated seller id set who have transactions in either type 'FP-GTC' and 'Others', or type 'FP-non GTC' or 'Others' on New Year's Day. The bitmap can be used as an input to other bitmap functions.
+
+### INTERSECT_COUNT_BY_COL
+
+- Description
+
+  - Find the intersection of the serialized input bitmaps. Then return the distinct count.
+
+- Syntax
+
+  - `intersect_count_by_col(Array[t1.c1,t2.c2 ...])`
+  
+- Parameters
+
+  - `t1.c1, t2.c2 ...`, the list of input columns. Each column points to a serialized bitmap hidden from users. Function `bitmap_uuid` and `intersect_bitmap_uuid`  and `intersect_bitmap_uuid_v2` can return the bitmap.
+  
+- Query Example 1
+
+  ```
+  select intersect_count_by_col(Array[t1.a1,t2.a2]) from
+      (select bitmap_uuid(SELLER_ID) as a1
+          from KYLIN_SALES) t1,
+      (select intersect_bitmap_uuid(
+          SELLER_ID, LSTG_FORMAT_NAME,
+          array['FP-GTC|FP-non GTC', 'Others']) as a2
+  from KYLIN_SALES) t2
+  ```
+  
+- Response Example 1
+
+  ![](images/intersect_count_by_col.1.en.png)
+  
+  Function `bitmap_uuid` and `intersect_bitmap_uuid` return two serialized bitmap. `intersect_count_by_col` then find the intersection on two bitmaps and return distinct count.
+
+### Limitations
+- All the above functions don't support pushdown query
diff --git a/website/docs/query/insight/operator_function/function/conditional_function.md b/website/docs/query/insight/operator_function/function/conditional_function.md
new file mode 100644
index 0000000000..44274c925c
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/conditional_function.md
@@ -0,0 +1,25 @@
+---
+title: Conditional Functions
+language: en
+sidebar_label: Conditional Functions
+pagination_label: Conditional Functions
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - conditional functions
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+| Syntax                                                       | Description                                                  | Example                                                      | Normal Query | Pushdown Query | Defined as Computed Column | Suggested as Computed Column |
+| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------ | -------------- | -------------------------- | ------------------------- |
+| CASE value WHEN value1 THEN result1 WHEN valueN THEN resultN ELSE resultZ END | Simple case                                                  | `CASE OPS_REGION WHEN 'Beijing' THEN 'BJ' WHEN 'Shanghai' THEN 'SH'WHEN 'Hongkong' THEN 'HK' END FROM KYLIN_SALES` <br /> = HK SH BJ | ✔️            | ✔️              | ✔️                          | ✔️                         |
+| CASE WHEN condition1 THEN result1 WHEN conditionN THEN resultN ELSE resultZ END | Searched case                                                | `CASE WHEN OPS_REGION='Beijing'THEN 'BJ' WHEN OPS_REGION='Shanghai' THEN 'SH' WHEN OPS_REGION='Hongkong' THEN 'HK' END FROM KYLIN_SALES`<br /> = HK SH BJ | ✔️            | ✔️              | ✔️                          | ✔️                         |
+| NULLIF(value, value)                                         | Return NULL if the values are the same. Otherwise, return the first value. | `NULLIF(5,5)`<br /> = null                                   | ✔️            | ✔️              | ✔️                          |  ✔️                         |
+| COALESCE(value, value [, value ]*)                           | Return the first not null value.                 | `COALESCE(NULL,NULL,5)`<br /> = 5                            | ✔️            | ✔️              | ✔️                          |  ✔️                          |
+| IFNULL(value1, value2)                                       | Return value2 if value1 is NULL. Otherwise, return value1. | `IFNULL('kyligence','apache')`<br /> = 'kyligence'  | ✔️        | ✔️        | ✔️                | ✔️              |
+| ISNULL(value)                                                | Return true if value is NULL. Otherwise, return false. | `ISNULL('kyligence')` <br /> = false                   | ✔️        | ✔️        | ✔️                |  ✔️                |
+| NVL(value1, value2)                                          | Return value2 if value1 is NULL. Otherwise, return value1. Value1, value2 must have same data type. Before Kyligence Enterprise 4.2.3, you need to add parameter `kylin.query.calcite.extras-props.FUN=standard,oracle` to kylin.properties before using this function. | `NVL('kyligence','apache')`<br /> = 'kyligence'  | ✔️        | ✔️        | ✔️                | ✔️               |
diff --git a/website/docs/query/insight/operator_function/function/datetime_function.md b/website/docs/query/insight/operator_function/function/datetime_function.md
new file mode 100644
index 0000000000..baa38e4a09
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/datetime_function.md
@@ -0,0 +1,48 @@
+---
+title: Date and Time Functions
+language: en
+sidebar_label: Date and Time Functions
+pagination_label: Date and Time Functions
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - date functions
+    - time functions 
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+## Date and Time Functions
+
+| Syntax                                    | Description                                                  | Example                                                      | Normal Query | Pushdown Query | Defined as Computed Column | Suggested as Computed Column |
+| ----------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------ | -------------- | -------------------------- | ---------------------------- |
+| CURRENT_DATE                              | Returns the current date in the session time zone, in a value of datatype DATE | ` CURRENT_DATE`<br /> = 2018-10-10                           |  ✔️          | ✔️              | ✔️              |  ✔️          |
+| CURRENT_TIMESTAMP                         | Returns the current timestamp in the session time zone, in a value of datatype timestamp | ` CURRENT_TIMESTAMP`<br /> = 2022-07-19 10:24:44.708                 |  ✔️          | ✔️              | ✔️              |  ✔️          |
+| EXTRACT(timeUnit FROM datetime)           | Extracts and returns the value of a specified datetime field from a datetime value expression | `EXTRACT(minute FROM timestamp'2018-10-10 11:47:16')`<br /> = 47 | ✔️            | ✔️              | ✔️                          | ❌                            |
+| FLOOR(datetime TO timeUnit)               | Rounds *datetime* down to *timeUnit* where *timeunit* can be `year`,`quarter`, `month`, `week`, `day`, `hour`, `minute`, `second` | Example 1:<br/>`FLOOR(timestamp'2018-10-10 11:47:16' TO year)`<br/>= 2018-01-01 00:00:00<br/>Example 2:<br/>`FLOOR(timestamp'2018-10-10 11:47:16' TO minute)`<br/>= 2018-10-10 11:47:00 | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| CEIL(datetime TO timeUnit)                | Rounds *datetime* up to *timeUnit* where *timeunit* can be `year`,`quarter`, `month`, `week`, `day`, `hour`, `minute`, `second` | Example 1:<br/>`CEIL(timestamp'2018-10-10 11:47:16' TO year)`<br/>= 2019-01-01 00:00:00<br / >Example 2:<br/>`CEIL(timestamp'2018-10-10 11:47:16' TO minute)`<br/>= 2018-10-10 11:48:00 | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| YEAR(date)                                | Equivalent to `EXTRACT(YEAR FROM date)`. Returns an integer. | ` YEAR(date '2019-01-02')`<br /> = 2019                      | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| QUARTER(date)                             | Equivalent to `EXTRACT(QUARTER FROM date)`. Returns an integer between 1 and 4. | ` QUARTER(date '2019-01-02')` <br /> = 1                     | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| NOW(date)                                 | Returns the current timestamp at the start of query evaluation. | ` NOW()` <br /> = 2019-09-24 17:19:09.932                    | ❌            | ✔️              | ✔️                          | ✔️                            |
+| MONTH(date)                               | Equivalent to `EXTRACT(MONTH FROM date)`. Returns an integer between 1 and 12. | ` MONTH(date '2019-01-02')`<br /> = 1                        | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| WEEK(date)                                | Equivalent to `EXTRACT(WEEK FROM date)`. Returns an integer between 1 and 53. | ` WEEK(date '2019-01-02')`<br /> = 1                         | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| DAYOFYEAR(date)                           | Equivalent to `EXTRACT(DOY FROM date)`. Returns an integer between 1 and 366. | `DAYOFYEAR(date '2019-10-03')`<br /> = 276                   | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| DAYOFMONTH(date)                          | Equivalent to `EXTRACT(DAY FROM date)`. Returns an integer between 1 and 31. | ` DAYOFMONTH(date '2019-10-03')`<br /> = 3                   | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| DAYOFWEEK(date)                           | Equivalent to `EXTRACT(DOW FROM date)`. Returns an integer between 1 and 7. | ` DAYOFWEEK(date '2019-10-03')`<br /> = 5                    | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| HOUR(date)                                | Equivalent to `EXTRACT(HOUR FROM date)`. Returns an integer between 0 and 23. | ` HOUR(timestamp '2019-01-02 14:01:50')`<br /> = 14          | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| MINUTE(date)                              | Equivalent to `EXTRACT(MINUTE FROM date)`. Returns an integer between 0 and 59. | ` MINUTE(timestamp '2019-01-02 14:01:50')`<br /> = 1         | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| SECOND(date)                              | Equivalent to `EXTRACT(SECOND FROM date)`. Returns an integer between 0 and 59. | ` SECOND(timestamp '2019-01-02 14:01:50')`<br /> = 50        | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| TIMESTAMPADD(timeUnit, integer, datetime) | Returns *datetime* with an interval of (signed) *integer* *timeUnit*s added. Equivalent to `datetime + INTERVAL 'integer' timeUnit` | Example 1: to get the next month<br />` TIMESTAMPADD(month, 1, CURRENT_DATE)`<br /> = 2018-11-10<br /><br />Example 2: to get the last day of this month<br />`TIMESTAMPADD(day, -(extract(day from CURRENT_DATE)), timestampadd(month,1,CURRENT_DATE))`<br /> = 2018-10-31 | ✔️            | ✔️              | ✔️       [...]
+| TRUNC(date, fmt)                          | Returns `date` with the time portion of the day truncated to the unit specified by the format model `fmt`.`fmt` should be one of ["year", "yyyy", "yy", "mon", "month", "mm"] | `TRUNC(date '2009-02-12', 'MM')`<br /> = 2009-02-01          | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| ADD_MONTHS(start_date, num_months)        | Returns the date that is `num_months` after `start_date`.    | ` ADD_MONTHS(date '2016-08-31', 1) `<br /> = 2016-09-30      | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| DATE_ADD(start_date, num_days)            | Returns the date that is `num_days` after `start_date`.      | ` DATE_ADD(date '2016-07-30', 1)`<br /> = 2016-07-31         | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| DATE_SUB(start_date, num_days)            | Returns the date that is `num_days` before `start_date`.     | ` DATE_SUB(date '2016-07-30', 1)`<br /> = 2016-07-29         | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| FROM_UNIXTIME(unix_time, format)          | Returns `unix_time` in the specified `format`.               | `FROM_UNIXTIME(0, 'yyyy-MM-dd HH:mm:ss')`<br /> = 1970-01-01 00:00:00 | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| FROM_UTC_TIMESTAMP(timestamp, timezone)   | Given a timestamp like '2017-07-14 02:40:00.0', interprets it as a time in UTC, and renders that time as a timestamp in the given time zone. | ` FROM_UTC_TIMESTAMP('2016-08-31', 'Asia/Seoul')`<br /> = 2016-08-31 09:00:00 | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| MONTHS_BETWEEN(timestamp1, timestamp2)    | If `timestamp1` is later than `timestamp2`, then the result is positive. If `timestamp1` and `timestamp2` are on the same day of month, or both are the last day of month, time of day will be ignored. Otherwise, the difference is  calculated based on 31 days per month. | ` MONTHS_BETWEEN('1997-02-28 10:30:00', '1996-10-30')`<br /> = 3.94959677 | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| TO_UTC_TIMESTAMP(timestamp, timezone)     | Given a timestamp like '2017-07-14 02:40:00.0', interprets it as a time in the given time zone, and renders that time as a timestamp in UTC. | `FROM_UTC_TIMESTAMP(TIMESTAMP'2015-03-02 06:05:00', 'America/Toronto')`<br /> = 2015-03-02 01:05:00.0 | ✔️            | ❌              | ✔️                          | ✔️                            |
+| UNIX_TIMESTAMP(datetime, format)          | Returns the seconds from `1970-01-01 08:00:00` to `datetime`. Please specify the `datetime` as `format` format | `UNIX_TIMESTAMP('2016-04-08 09:00:00', 'yyyy-MM-dd HH:mm:ss')`<br /> = 1460106000 | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| DATEDIFF(endDate, startDate)              | Returns the number of days from `startDate` to `endDate`     | DATEDIFF(date '2022-02-03', date '2022-02-01')<br/>= 2       | ✔️            | ✔️              | ✔️                          | ❌                            |
diff --git a/website/docs/query/insight/operator_function/function/grouping_function.md b/website/docs/query/insight/operator_function/function/grouping_function.md
new file mode 100644
index 0000000000..230f818b06
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/grouping_function.md
@@ -0,0 +1,95 @@
+---
+title: Grouping Function
+language: en
+sidebar_label: Grouping Function
+pagination_label: Grouping Function
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - grouping function
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+Users can use grouping function to aggregate data grouping by different keys in one SQL statement. ROLLUP, CUBE, GROUPING SETS functions are common grouping and aggregate methods.
+
+>  **Note:** Grouping function is not supported to be defined or recommended as computed columns in current version.
+
+### GROUPING SETS(expression)
+
+In a result set, you sometimes need to aggregate columns A and B separately, and also aggregate the two columns together. The implementation method is often to use multiple UNION ALL statements. However, the GROUPING SETS function can use different grouping settings for aggregate queries at the same time. It can replace multiple UNION ALL statements, making SQL statements more convenient and efficient.
+
+- Description
+
+  - The GROUPING SETS function is often used in the GROUP BY clause. The expression is filled with the combination of dimensions that need to be grouped. For example, GROUPING SETS ((A, B), (C), ()) means to do aggregation with both columns A and B, aggregation with column C and aggregation with no grouping.
+- Query Example 
+
+```SQL
+SELECT 
+	LO_CUSTKEY, 
+	LO_ORDERKEY, 
+	SUM(LO_ORDTOTALPRICE) AS PRICE
+FROM SSB.P_LINEORDER
+GROUP BY 
+	GROUPING SETS((LO_CUSTKEY,LO_ORDERKEY),(LO_ORDERKEY),());
+```
+
+- Result Example
+
+![GROUPING SETS Function](images/grouping_sets_function_en.png)
+
+### CUBE(expression) 和 ROLLUP(expression)
+
+CUBE and ROLLUP functions can be considered special cases of GROUPING SETS.
+
+- Description
+  - CUBE will do group aggregation with all columns, and finally give the total aggregation result. The columns used in the expression are parsed into all possible combinations. For example, GROUP BY CUBE (a, b, c) is equivalent to GOUPING SETS ((a, b, c), (a, b), (a, c), (b, c), (a), (b) , (c), ())
+  - ROLLUP will do group aggregation with the first column, and finally give the total aggregation. The columns used in the expression will be parsed into a combination form containing levels. For example, GROUP BY ROLLUP (a, b, c) is equivalent to GROUPING SETS ((a, b, c), (a, b), (a), ())
+- Query Example (Here ROLLUP is taken as an example)
+
+```SQL
+SELECT
+  LO_CUSTKEY,
+  LO_ORDERKEY,
+  SUM(LO_ORDTOTALPRICE) AS PRICE
+FROM SSB.P_LINEORDER
+GROUP BY
+  ROLLUP(LO_CUSTKEY, LO_ORDERKEY);
+```
+
+- Result Example
+
+![ROLLUP Function](images/rollup_function_en.png)
+
+
+
+### GROUPING(expression)
+
+In the results created using the grouping functions, NULL is used as a placeholder, so when you view the results, you cannot distinguish between NULL as a placeholder or the original data.
+
+The GROUPING function distinguishes the placeholder NULL from the NULL in the original data.
+
+- Description
+	- The grouping columns involved in the grouping function can be used in the expression of the GROUPING function. If the function returns a value of 0, it means that the NULL displayed under the grouping column in the corresponding row is from the original data. If it returns 1, it means that the NULL displayed under the grouping column in the corresponding row is a placeholder generated by the grouping function. 
+- Query Example 
+
+```SQL
+SELECT 
+	LO_CUSTKEY,
+	LO_ORDERKEY,
+	SUM(LO_ORDTOTALPRICE) AS PRICE,
+	GROUPING(LO_CUSTKEY) AS GC,
+	GROUPING(LO_ORDERKEY) AS GM
+FROM SSB.P_LINEORDER
+GROUP BY 
+	GROUPING SETS((LO_CUSTKEY,LO_ORDERKEY),(LO_ORDERKEY),());
+```
+
+- Result Example:
+
+You can see that the result of the GROUPING function in both columns in the first row is 1, indicating that the NULL in the two columns LO_CUSTKEY and LO_ORDERKEY in this row are placeholders due to the GROUPING SETS function.
+
+![](images/grouping_en.png)
diff --git a/website/docs/query/insight/operator_function/function/images/arithmetic_function.en.png b/website/docs/query/insight/operator_function/function/images/arithmetic_function.en.png
new file mode 100644
index 0000000000..6754bf435c
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/arithmetic_function.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/bitmap_uuid.1.en.png b/website/docs/query/insight/operator_function/function/images/bitmap_uuid.1.en.png
new file mode 100644
index 0000000000..241ada2a02
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/bitmap_uuid.1.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/date_string.png b/website/docs/query/insight/operator_function/function/images/date_string.png
new file mode 100644
index 0000000000..3af79731ad
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/date_string.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/first_last_value_en.png b/website/docs/query/insight/operator_function/function/images/first_last_value_en.png
new file mode 100644
index 0000000000..f9d41c0c08
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/first_last_value_en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/grouping_en.png b/website/docs/query/insight/operator_function/function/images/grouping_en.png
new file mode 100644
index 0000000000..95450c9024
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/grouping_en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/grouping_sets.1.png b/website/docs/query/insight/operator_function/function/images/grouping_sets.1.png
new file mode 100644
index 0000000000..706204eb32
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/grouping_sets.1.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/grouping_sets.2.png b/website/docs/query/insight/operator_function/function/images/grouping_sets.2.png
new file mode 100644
index 0000000000..08c8608eea
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/grouping_sets.2.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/grouping_sets_function_en.png b/website/docs/query/insight/operator_function/function/images/grouping_sets_function_en.png
new file mode 100644
index 0000000000..6eac9acb19
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/grouping_sets_function_en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid.1.en.png b/website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid.1.en.png
new file mode 100644
index 0000000000..820a8dde14
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid.1.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid2.1.en.png b/website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid2.1.en.png
new file mode 100644
index 0000000000..65d8e33ad5
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid2.1.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid2.1.png b/website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid2.1.png
new file mode 100644
index 0000000000..4b6ff1fe6f
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/intersect_bitmap_uuid2.1.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/intersect_count.1.en.png b/website/docs/query/insight/operator_function/function/images/intersect_count.1.en.png
new file mode 100644
index 0000000000..d95db345e6
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/intersect_count.1.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/intersect_count.2.en.png b/website/docs/query/insight/operator_function/function/images/intersect_count.2.en.png
new file mode 100644
index 0000000000..f0b7c9fb3f
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/intersect_count.2.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/intersect_count2.1.en.png b/website/docs/query/insight/operator_function/function/images/intersect_count2.1.en.png
new file mode 100644
index 0000000000..692a40be5e
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/intersect_count2.1.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/intersect_count_by_col.1.en.png b/website/docs/query/insight/operator_function/function/images/intersect_count_by_col.1.en.png
new file mode 100644
index 0000000000..b9f052c30c
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/intersect_count_by_col.1.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/intersect_value.1.en.png b/website/docs/query/insight/operator_function/function/images/intersect_value.1.en.png
new file mode 100644
index 0000000000..35cf3d444f
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/intersect_value.1.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/intersect_value.2.en.png b/website/docs/query/insight/operator_function/function/images/intersect_value.2.en.png
new file mode 100644
index 0000000000..0f989339da
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/intersect_value.2.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/intersect_value2.1.en.png b/website/docs/query/insight/operator_function/function/images/intersect_value2.1.en.png
new file mode 100644
index 0000000000..7fede543cd
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/intersect_value2.1.en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/lead_lag_en.png b/website/docs/query/insight/operator_function/function/images/lead_lag_en.png
new file mode 100644
index 0000000000..ba416a3840
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/lead_lag_en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/ntile_en.png b/website/docs/query/insight/operator_function/function/images/ntile_en.png
new file mode 100644
index 0000000000..2cec509510
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/ntile_en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/operator.png b/website/docs/query/insight/operator_function/function/images/operator.png
new file mode 100644
index 0000000000..5a84847396
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/operator.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/rank_and_drank_en.png b/website/docs/query/insight/operator_function/function/images/rank_and_drank_en.png
new file mode 100644
index 0000000000..ada729f0ed
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/rank_and_drank_en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/rollup_function_en.png b/website/docs/query/insight/operator_function/function/images/rollup_function_en.png
new file mode 100644
index 0000000000..566bd0cafa
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/rollup_function_en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/row_number_en.png b/website/docs/query/insight/operator_function/function/images/row_number_en.png
new file mode 100644
index 0000000000..94b75c72fa
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/row_number_en.png differ
diff --git a/website/docs/query/insight/operator_function/function/images/timestamp_string.png b/website/docs/query/insight/operator_function/function/images/timestamp_string.png
new file mode 100644
index 0000000000..583e75d695
Binary files /dev/null and b/website/docs/query/insight/operator_function/function/images/timestamp_string.png differ
diff --git a/website/docs/query/insight/operator_function/function/intersect_function.md b/website/docs/query/insight/operator_function/function/intersect_function.md
new file mode 100644
index 0000000000..86b5317682
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/intersect_function.md
@@ -0,0 +1,195 @@
+---
+title: Intersect Function
+language: en
+sidebar_label: Intersect Function
+pagination_label: Intersect Function
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+  - intersect function
+draft: false
+last_update:
+  date: 08/17/2022
+---
+
+
+Users can use intersection function to calculate the value of the intersection of two data sets, with some same dimensions and one varied dimension, to analyze the retention or conversion rates.
+
+kylin supports the following intersection function,
+
+
+
+
+### INTERSECT_COUNT
+
+- Description
+
+  - Returns the distinct count of the intersection of multiple result sets in different conditions
+
+- Syntax
+
+  - `intersect_count(column_to_count, column_to_filter, filter_value_list)`
+
+- Parameters
+
+  - `column_to_count`,  the column to be calculated and applied on distinct count, required to be added as **Precise count distinct** measure
+  - `column_to_filter`, the varied dimension
+  - `filter_value_list`, the value of the varied dimensions listed in `array[]`, When `column_to_filter` is of type varchar, A single element in an array can map multiple values. By default, the '|' is split. You can set `kylin.query.intersect.separator` in `kylin.properties` to configure the separator, Can take value '|' or ',', default is '|'(Currently this parameter does not support the use of subquery results as parameters).
+
+> **Note: ** When the data type of a varied dimension is not varchar or integer, the values in 'filter_value_list' need to be explicitly cast, for example:
+> `select intersect_count(column_to_count, column_to_filter, array[cast(3.53 as double), cast(5.79 as double)]) from TEST_TABLE`
+> OR `select intersect_count(column_to_count, column_to_filter, array[TIMESTAMP'2012-01-02 11:23:45', TIMESTAMP'2012-01-01 11:23:45']) from TEST_TABLE;`
+
+- Query Example 1
+
+  Take the sample dataset provided by kylin as an example, table `KYLIN_SALES` simulates the online transaction data, and the following query can return the percentile of sellers who are trading day by day during 2012.01.01 to 2012.01.03.
+
+  ```SQL
+  select LSTG_FORMAT_NAME,
+  intersect_count(SELLER_ID, PART_DT, array[date'2012-01-01']) as first_day,
+  intersect_count(SELLER_ID, PART_DT, array[date'2012-01-02']) as second_day,
+  intersect_count(SELLER_ID, PART_DT, array[date'2012-01-03']) as third_day,
+  intersect_count(SELLER_ID, PART_DT, array[date'2012-01-01',date'2012-01-02']) as retention_oneday, 
+  intersect_count(SELLER_ID, PART_DT, array[date'2012-01-01',date'2012-01-02',date'2012-01-03']) as retention_twoday 
+  from KYLIN_SALES
+  where PART_DT in (date'2012-01-01',date'2012-01-02',date'2012-01-03')
+  group by LSTG_FORMAT_NAME
+  ```
+
+- Response Example 1
+
+  ![](images/intersect_count.1.en.png)
+
+  The result shows that there is no seller keeps trading constantly during this period.
+
+- Query Example 2
+
+  ```sql
+    select 
+    intersect_count(SELLER_ID, LSTG_FORMAT_NAME, array['FP-GTC|FP-non GTC|Others', 'Others']) as test_column
+    from kylin_sales
+  ```
+
+- Response Example 2
+
+  ![](images/intersect_count.2.en.png) 
+
+### INTERSECT_VALUE	
+
+- Description	
+
+  - Returns the values of the intersection of multiple result sets in different conditions. If the returned result is large, it may cause the analysis page browser to crash.	
+
+- Syntax	
+
+  - `intersect_value(column_to_count, column_to_filter, filter_value_list)`	
+
+- Parameters	
+
+  - `column_to_count`,  the column to be calculated and applied on distinct value required to be added as **Precise count distinct** measure. **And only columns of type tinyint, smallint, or integer are supported**.	
+  - `column_to_filter`, the varied dimension	
+  - `filter_value_list`, the value of the varied dimensions listed in `array[]`, When `column_to_filter` is of type varchar, A single element in an array can map multiple values. By default, the '|' is split. You can set `kylin.query.intersect.separator` in `kylin.properties` to configure the separator, Can take value '|' or ',', default is '|'(Currently this parameter does not support the use of subquery results as parameters).	
+
+> **Note: ** When the data type of a varied dimension is not varchar or integer, the values in 'filter_value_list' need to be explicitly cast, for example:
+> `select intersect_value(column_to_count, column_to_filter, array[cast(3.53 as double), cast(5.79 as double)]) from TEST_TABLE`
+> OR `select intersect_value(column_to_count, column_to_filter, array[TIMESTAMP'2012-01-02 11:23:45', TIMESTAMP'2012-01-01 11:23:45']) from TEST_TABLE;`
+
+
+- Query Example 1	
+
+  Fact table `KYLIN_SALES_TEST` simulates the online transaction data. And data type of `SELLER_ID` column is `integer`. The following query can return the ids of sellers who are trading day by day during 2012.01.01 to 2012.01.03.	
+
+  ```SQL	
+  select LSTG_FORMAT_NAME,	
+  intersect_value(SELLER_ID, PART_DT, array[date'2012-01-01']) as first_day,	
+  intersect_value(SELLER_ID, PART_DT, array[date'2012-01-02']) as second_day,	
+  intersect_value(SELLER_ID, PART_DT, array[date'2012-01-03']) as third_day,	
+  intersect_value(SELLER_ID, PART_DT, array[date'2012-01-01',date'2012-01-02']) as retention_oneday, 	
+  intersect_value(SELLER_ID, PART_DT, array[date'2012-01-01',date'2012-01-02',date'2012-01-03']) as retention_twoday 	
+  from KYLIN_SALES	
+  where PART_DT in (date'2012-01-01',date'2012-01-02',date'2012-01-03')	
+  group by LSTG_FORMAT_NAME	
+  ```
+
+- Response Example 1	
+
+  ![](images/intersect_value.1.en.png)	
+
+  The result shows that set of keeping trading constantly's sellerId during this period.	
+
+- Query Example 2	
+
+  ```sql	
+  select 	
+  intersect_value(SELLER_ID, LSTG_FORMAT_NAME, array['FP-GTC|FP-non GTC|Others', 'Others']) as test_column	
+  from kylin_sales	
+  ```
+
+- Response Example  2	
+
+  ![](images/intersect_value.2.en.png)
+
+### INTERSECT_COUNT_V2
+
+- Description
+  - Returns the distinct count of the intersection of multiple result sets in different conditions. Support Regexp in condition.
+- Syntax
+  - `intersect_count_v2(column_to_count, column_to_filter, filter_value_list, filter_type)`
+- Parameters
+  - `column_to_count`, the column to be calculated and applied on distinct count, required to be added as **Precise count distinct** measure
+  - `column_to_filter`, the varied dimension
+  - `filter_value_list`, the value of the varied dimensions listed in `array[]`,
+  - `filter_type`, the data type is String, which identifies the filter mode. There are currently two optional values "RAWSTRING" and "REGEXP". When the parameter value is "RAWSTRING", the filtering mode is precise filtering. When `column_to_filter` is a Varchar type, A single element in the array can be mapped with multiple values. By default, it is separated by '|'. You can use `kylin.query.intersect.separator` to configure the separator. And only support configuration in the `kylin.pr [...]
+
+> **Note: ** When the filter_type is "RAWSTRING" and the data type of a varied dimension is not varchar or integer, the values in 'filter_value_list' need to be explicitly cast, for example:
+> `select intersect_count_v2(column_to_count, column_to_filter, array[cast(3.53 as double), cast(5.79 as double)], 'RAWSTRING') from TEST_TABLE`
+> OR `select intersect_count_v2(column_to_count, column_to_filter, array[TIMESTAMP'2012-01-02 11:23:45', TIMESTAMP'2012-01-01 11:23:45'], 'RAWSTRING') from TEST_TABLE;`
+
+- Query Example 1
+
+  ```sql
+    select intersect_count_v2(
+    	LSTG_SITE_ID, LSTG_FORMAT_NAME, 
+        array['FP.*GTC', 'Other.*'], 'REGEXP')
+     from kylin_sales
+  ```
+
+- Response Example 1
+
+  ![](images/intersect_count2.1.en.png) 
+
+### INTERSECT_VALUE_V2	
+
+- Description	
+  - Returns the values of the intersection of multiple result sets in different conditions. If the returned result is large, it may cause the analysis page browser to crash. Support Regexp in condition.
+- Syntax	
+  - `intersect_value_v2(column_to_count, column_to_filter, filter_value_list, filter_type)`
+- Parameters	
+  - `column_to_count`,  the column to be calculated and applied on distinct value required to be added as **Precise count distinct** measure.
+   **Only when type of column is one of integer family(tinyint、smallint、integer、bigint) and override model properties `kylin.query.skip-encode-integer-enabled=true`, the values returned is actual. Otherwise, encoded value will be returned.**	
+  - `column_to_filter`, the varied dimension	
+  - `filter_value_list`, the value of the varied dimensions listed in `array[]`,
+  - `filter_type`, the data type is String, which identifies the filter mode. There are currently two optional values "RAWSTRING" and "REGEXP". When the parameter value is "RAWSTRING", the filtering mode is precise filtering. When `column_to_filter` is a Varchar type, A single element in the array can be mapped with multiple values. By default, it is separated by '|'. You can use `kylin.query.intersect.separator` to configure the separator. And only support configuration in the `kylin.pr [...]
+
+> **Note: **  When the filter_type is "RAWSTRING" and the data type of a varied dimension is not varchar or integer, the values in 'filter_value_list' need to be explicitly cast, for example:
+> `select intersect_value_v2(column_to_count, column_to_filter, array[cast(3.53 as double), cast(5.79 as double)], 'RAWSTRING') from TEST_TABLE`
+> OR `select intersect_value_v2(column_to_count, column_to_filter, array[TIMESTAMP'2012-01-02 11:23:45', TIMESTAMP'2012-01-01 11:23:45'], 'RAWSTRING') from TEST_TABLE;`
+
+- Query Example 1	
+
+  ```sql	
+  select intersect_value_v2(
+    	LSTG_SITE_ID, LSTG_FORMAT_NAME, 
+        array['FP.*GTC', 'Other.*'], 'REGEXP')
+     from kylin_sales
+  ```
+
+- Response Example  1 
+
+  ![](images/intersect_value2.1.en.png)
+
+### Limitations
+- All the above functions don't support pushdown query
+- All the above functions don't support detailed index answers (even with the switch kylin.query.use-tableindex-answer-non-raw-query = true)
diff --git a/website/docs/query/insight/operator_function/function/intro.md b/website/docs/query/insight/operator_function/function/intro.md
new file mode 100644
index 0000000000..da50e9af6a
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/intro.md
@@ -0,0 +1,30 @@
+---
+title: Functions
+language: en
+sidebar_label: Functions
+pagination_label: Functions
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - functions
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+
+This chapter will introduce functions that applicable to SQL statements:
+
+- [Arithmetic Functions](arithmetic_function.md)
+- [String Functions](string_function.md)
+- [Date and Time Functions](datetime_function.md)
+- [Conditional Functions](conditional_function.md)
+- [Type Conversion Functions](type_function.md)
+- [Window Function](window_function.md)
+- [Grouping Function](grouping_function.md)
+- [Aggregate Functions](aggregate_function.md)
+- [Intersect Function](intersect_function.md)
+- [Other Functions](miscellaneous_function.md)
+- [Bitmap Functions](bitmap_function.md)
diff --git a/website/docs/query/insight/operator_function/function/miscellaneous_function.md b/website/docs/query/insight/operator_function/function/miscellaneous_function.md
new file mode 100644
index 0000000000..ee14c5ad46
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/miscellaneous_function.md
@@ -0,0 +1,23 @@
+---
+title: Other Functions
+language: en
+sidebar_label: Other Functions
+pagination_label: Other Functions
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - other functions
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+| Syntax                        | Description                                                  | Example                                                | Normal Query | Pushdown Query | Defined as Computed Column | Suggested as Computed Column |
+| ----------------------------- | ------------------------------------------------------------ | ------------------------------------------------------ | ------------ | -------------- | -------------------------- | ---------------------------- |
+| UUID()                        | Returns an universally unique identifier (UUID) string. The value is returned as a canonical UUID 36-character string | ` UUID()`<br /> = 46707d92-02f4-4817-8116-a4c3b23e6266 | ❌            | ✔️              | ❌                          | ❌                            |
+| MONOTONICALLY_INCREASING_ID() | Returns monotonically increasing 64-bit integers. The generated ID is guaranteed to be monotonically increasing and unique, but not consecutive. | ` MONOTONICALLY_INCREASING_ID()`<br /> = 1111111       | ✔️            | ✔️              | ❌                          | ❌                            |
+| EXPLODE(array)                | Returns new rows for each element in the given array column.    | `EXPLODE(array[1, 2, 3])`<br /> = <br/> 1  <br/> 2 <br/> 3  |✔️         |❌       | ❌                | ❌                |
+| SIZE(expr) | Expr must be of type array or map and return the number of elements contained in array or map. | `SIZE(array[1, 2, 3])`<br /> = <br/> 3 |✔️ |✔️ | ❌ | ❌ |
+
diff --git a/website/docs/query/insight/operator_function/function/string_function.md b/website/docs/query/insight/operator_function/function/string_function.md
new file mode 100644
index 0000000000..a7208eed5d
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/string_function.md
@@ -0,0 +1,50 @@
+---
+title: String Functions
+language: en
+sidebar_label: String Functions
+pagination_label: String Functions
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - string functions
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+| Syntax                                                       | Description                                                  | Example                                                      | Normal Query | Pushdown Query | Defined as Computed Column | Suggested as Computed Column |
+| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------ | -------------- | -------------------------- | ---------------------------- |
+| CHAR_LENGTH(string)                                          | Returns the number of characters in a character string       | `CHAR_LENGTH('Kyligence')`<br /> = 9                         | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| CHARACTER_LENGTH(string)                                     | As CHAR_LENGTH(*string*)                                     | ` CHARACTER_LENGTH('Kyligence')`<br /> = 9                   | ✔️            | ✔️              | ✔️                          | ✔️                          |
+| UPPER(string)                                                | Returns a character string converted to upper case           | ` UPPER('Kyligence')`<br /> = KYLIGENCE                      | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| LOWER(string)                                                | Returns a character string converted to lower case           | ` LOWER('Kyligence')`<br /> = kyligence                      | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| POSITION(string1 IN string2)                                 | Returns the position of the first occurrence of *string1* in *string2* | ` POSITION('Kyli' IN 'Kyligence')`<br /> = 1                 | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| TRIM( { BOTH \ LEADING\ TRAILING } string1 FROM string2)     | Removes the longest string containing only the characters in *string1* from the both ends/start/end of *string1* | Example1: <br />` TRIM(BOTH '6' FROM '666Kyligence66')`<br /> = Kyligence<br /><br />Example 2: <br />` TRIM(LEADING '6' FROM '666Kyligence66')`<br /> = Kyligence66<br /><br />Example 3: <br />` TRIM(TRAILING '6' FROM '666Kyligence66')`<br /> = 666Kyligence | ✔️            | ✔️              | ✔️                 [...]
+| OVERLAY(string1 PLACING string2 FROM integer [ FOR integer2 ]) | Replaces a substring of *string1* with *string2*  starting at the integer bit | `OVERLAY('666' placing 'KYLIGENCE' FROM 2 for 2)`<br/>= 6KYLIGENCE | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| SUBSTRING(string FROM integer)                               | Returns a substring of a character string starting at a given point | ` SUBSTRING('Kyligence' FROM 5)`<br /> = gence               | ✔️            |  ✔️              |  ✔️                           |  ✔️                            |
+| SUBSTRING(string FROM integer1 FOR integer2)                 | Returns a substring of a character string starting at a given point with a given length | ` SUBSTRING('Kyligence' from 5 for 2)`<br /> = ge            | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| INITCAP(string)                                              | Returns *string* with the first letter of each word converter to upper case and the rest to lower case. Words are sequences of alphanumeric characters separated by non-alphanumeric characters. | ` INITCAP('kyligence')`<br /> = Kyligence                    | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| REPLACE(string, search, replacement)                         | Returns a string in which all the occurrences of *search* in *string* are replaced with *replacement*; if *replacement* is the empty string, the occurrences of *search* are removed | ` REPLACE('Kyligence','Kyli','Kyliiiiiii')`<br /> = Kyliiiiiiigence | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| BASE64(bin)                                                  | Converts the argument from a binary `bin` to a base 64 string | ` BASE64('Spark SQL')`<br /> = U3BhcmsgU1FM                  | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| DECODE(bin, charset)                                         | Decodes the first argument using the second argument character set (one of 'US-ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16'). If either argument is null, the result will also be null | ` DECODE(ENCODE('abc', 'utf-8'), 'utf-8')`<br /> = abc       | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| ENCODE(str, charset)                                         | Encodes the first argument using the second argument character set(one of 'US-ASCII', 'ISO-8859-1', 'UTF-8', 'UTF-16BE', 'UTF-16LE', 'UTF-16'). If either argument is null, the result will also be null | ` ENCODE('abc', 'utf-8')`<br /> = `[B@2b442236`                        | ✔️            | ✔️              | ❌                          | ❌                            |
+| FIND_IN_SET(str, str_array)                                  | Returns the index (1-based) of the given string (`str`) in the comma-delimited list (`str_array`).Returns 0, if the string was not found or if the given string (`str`) contains a comma | ` FIND_IN_SET('ab','abc,b,ab,c,def')`<br /> = 3              | ✔️            | ✔️              | ✔️                          | ✔️                          |
+| LCASE(string)                                                | Returns `string` with all characters changed to lowercase    | `LCASE('SparkSql')`<br /> = sparksql                         | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| LEVENSHTEIN(str, str)                                        | Returns the Levenshtein distance between the two given strings | ` LEVENSHTEIN('kitten', 'sitting')`<br /> = 3                | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| LOCATE(substr, str[, pos])                                   | Returns the position of the first occurrence of `substr` in `str` after position `pos`. The given `pos` and return value are 1-based | ` LOCATE('bar', 'foobarbar')`<br /> = 4 <br /> `LOCATE('bar', 'foobarbar', 5)` <br /> =7 | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| LPAD(str, len, pad)                                          | Returns `str`, left-padded with `pad` to a length of `len`.If `str` is longer than `len`, the return value is shortened to `len` characters. | ` LPAD('hi', 5, '??')`<br /> = ???hi                         | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| RPAD(str, len, pad)                                          | Returns `str`, right-padded with `pad` to a length of `len`. If `str` is longer than `len`, the return value is shortened to `len` characters | ` RPAD('hi', 5, '??')`<br /> = hi???                         | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| RTRIM(trimStr, str)                                          | Removes the trailing string which contains the characters from the trim string from the `str` | `RTRIM('KR', 'SPARK')`<br /> = SPA                           | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| SENTENCES(str)                                               | Splits `str` into an array of array of words.                | ` SENTENCES('Hi there! Good morning.')`<br /> = [["Hi","there"],["Good","morning"]] | ✔️            | ✔️              | ❌                          | ❌                            |
+| SUBSTRING_INDEX(str, delim, count)                           | Returns the substring from `str` before `count` occurrences of the delimiter `delim`. If `count` is positive, everything to the left of the final delimiter (counting from the left) is returned. If `count` is negative, everything to the right of the final delimiter (counting from the right) is returned. The function substring_index performs a case-sensitive match  when searching for `delim` | ` SUBSTRING_INDEX('www.apache.or [...]
+| UCASE(str)                                                   | Returns `str` with all characters changed to uppercase.      | ` UCASE('SparkSql')`<br /> = SPARKSQL                        | ✔️            | ✔️              | ✔️                          | ✔️                            |
+| UNBASE64(str)                                                | Converts the argument from a base 64 string `str` to a binary. | ` UNBASE64('U3BhcmsgU1FM')`<br /> = `[B@7c66820d`                | ✔️            | ✔️              | ❌                          | ❌                            |
+| ASCII(str)                             | Convert character to corresponding ascii code | ` ASCII('a')` = 97| ✔️ | ❌| ✔️              | ✔️              |
+| CHR(str)                             | Convert ascii code to corresponding character| ` CHR(97)` = a| ✔️ | ❌| ✔️              | ✔️              |
+| SPACE(len)                             | Generate `len` number of continuous space | space(2) =`  ` | ✔️ | ❌| ❌                | ❌                |
+| SPLIT_PART(str, separator, index)  | Split `str` with `separator` and return the `index`-th token. `index` counts from 1. when `index` is negative, tokens are counted starting from the right. | `split_part('a-b-c', '-', 1)` = a, <br /> `split_part('a-b-c', '-', -1)` = c,| ✔️ | ❌| ✔️              | ✔️              |
+| CONCAT(str1, str2) | Concatenate the strings `str1` and `str2` into one string    | `concat('Kyli', 'gence') `= Kyligence                        | ✔️ | ✔️ | ✔️              | ✔️              |
+| REPEAT(str,n)| Repeat `str` `n` times and return string. When querying the model, `str` supports passing in constants, columns and expressions, and `n` only supports passing in constants | `repeat('kylin',2)` ='kylinkylin' | ✔️ | ✔️ | ✔️ | ✔️ |
+| LEFT(str,n)| Return the `n` characters from the left of `str`. When querying the model, `str` supports passing in constants, columns, and `n` only supports passing in constants | `left('kylin',2)` ='ky' | ✔️ | ✔️ | ✔️ | ✔️ |
diff --git a/website/docs/query/insight/operator_function/function/type_function.md b/website/docs/query/insight/operator_function/function/type_function.md
new file mode 100644
index 0000000000..e86e6518a5
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/type_function.md
@@ -0,0 +1,30 @@
+---
+title: Type Functions
+language: en
+sidebar_label: Type Functions
+pagination_label: Type Functions
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - type functions
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+## Type Functions
+
+| Syntax                | Description                                                        | Example                                                        | Normal Query                                            | Pushdown Query                                          | Defined as Computed Column                              | Suggested as Computed Column                            |
+| ------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| CAST(value AS type) | Converts a value to a given type. | Example 1: Converts `time` to `string`<br />`CAST(CURRENT_DATE as varchar)`<br /> = 2018-10-10 | ✔️ | ✔️ | ✔️ | ✔️ |
+| DATE&lt;String&gt; | Converts a string to DATE type,<br />equaling to CAST(string AS date) | Example 1:<br />`DATE'2018-10-10'`<br /> = 2018-10-10<br /><br />Example 2: Gets the corresponding month of the string (use with time function, MONTH() )<br />`MONTH(DATE'2018-10-10')`<br /> = 10 | ✔️ | ✔️ | ❌ | ❌ |
+| TIMESTAMP&lt;String&gt; | Converts a string to TIMESTAMP type,<br />equaling to CAST(string AS timestamp) | Example 1:<br />`TIMESTAMP'2018-10-10 15:57:07`<br /> = 2018-10-10 15:57:07<br /><br />Example 2: Gets the corresponding second of the string (use with time function, SECOND() )<br />`SECOND(TIMESTAMP'2018-10-10 15:57:07')`<br /> = 7 | ✔️ | ✔️ | ❌ | ❌ |
+
+> Note:
+>
+> 1. Only the following types of conversions are supported: `char`,` varchar`, `boolean`, `int`,` integer`, `tinyint`,` smallint`, `bigint`,` float`, `double`,` decimal`, `numeric`,` date`, `time`,` timestamp`
+> 2. However, conversion from `bigint` to` timestamp` is not supported at this time
+> 3. If converting from `char` to` int`, non-numeric values in `char` will return null
+> 4. Length n does not take effect when other data types are converted to `char(n)`/`varchar(n)`
diff --git a/website/docs/query/insight/operator_function/function/window_function.md b/website/docs/query/insight/operator_function/function/window_function.md
new file mode 100644
index 0000000000..737ab3cf2a
--- /dev/null
+++ b/website/docs/query/insight/operator_function/function/window_function.md
@@ -0,0 +1,165 @@
+---
+title: Window Functions
+language: en
+sidebar_label: Window Functions
+pagination_label: Window Functions
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+  - window functions
+draft: false
+last_update:
+  date: 08/17/2022
+---
+
+You can use window function to simplify the query process and analyze more complicated scenarios with a better performance.
+
+> **Note:** Window functions are currently not supported to be defined or recommended as computed columns.
+
+### Syntax structure
+
+- function(value) OVER window
+- The composition of the window:
+  - *partition by*: group clause, which represents the calculation range of the window function.
+  - *order by*: sort clause, indicating the sorting method within the group after partition.
+  - *rows/range*:  window clause, indicating that after partition, a sliding data window is determined in the group. The window functions will do calculation based on the data range contained in the window.
+    - *rows* is a physical window, that is, the fixed before and after records of the current row number are selected according to the results sorted by the *order by* clause. The result of this clause has nothing to do with the value of the current row, but the sorted row number. 
+      - Take SQL sum (column A) rows between 1 preceding and 2 following as an example. If the *column A* of the current row is sorted with a sorted row number of 3, then this clause will select the records where the sequence number of *column A* lies between 2 and 5.
+    -  *range* is a logical window, that is, based on the value of the current row, the fixed before and after records of the value of the current row are selected. The result of this clause has nothing to do with the sorted row number, but the value of the row.
+      - Take SQL sum (column A) range between 1 preceding and 2 following as an example. If the value of *column A* is 3, then this clause will select the records where the value of *column A* lies between between 2 and 5.
+    - If an *order by* clause is specified without window clause, the default window clause is equal to SQL range between unbounded preceding and current row.
+
+### Examples of window functions
+
+And then we'll illustrate the usage of every single window function with table *P_LINEORDER* in the [sample dataset](../../../../../Get-to-Know-Kyligence-Enterprise/quickstart/sample_dataset.en.md), where you may also find the fields and corresponding descriptions.
+
+- **ROW_NUMBER**
+
+  - Function description: ROW_NUMBER() OVER window, returning the position of the current row in its partition, the sequence numbers are not repeated.
+
+- **RANK**
+
+  - Function description: RANK() OVER window, returning the position of the current row in its partition, possibly with sequence gaps.
+
+- **DENSE_RANK**
+
+  - Function description: DENSE_RANK() OVER window, returning the position of the current row in its partition with no sequence gaps.
+
+- **Query Example**
+  For comparison, we use RANK () and DENSE_RANK () and ROW_NUMBER () in the same query to query the first five orders with the least number of items purchased by each buyer. The query is as follows:
+
+  ```SQL
+  SELECT *
+  FROM (
+  SELECT 
+      ROW_NUMBER() OVER w AS ROW_NUM,
+      RANK() OVER w AS _RANK,
+      DENSE_RANK() OVER w AS D_RANK,
+      LO_ORDERKEY,
+      LO_CUSTKEY,
+      LO_QUANTITY,
+      LO_PARTKEY
+      FROM SSB.P_LINEORDER 
+      WINDOW w AS (PARTITION BY LO_CUSTKEY ORDER BY LO_QUANTITY)
+      ) T
+  WHERE ROW_NUM <= 5;
+  ```
+
+- **Result**
+  ![](images/rank_and_drank_en.png)
+
+- **Result Explanation**
+  For buyer with id '1', there are four orders with quantity of 1, and the above three functions are compared as follows:
+
+  - When using row_number() function, orders with *LO_QUANTITY* as 1 are ranked as 1, 2, 3, 4, and the order with *LO_QUANTITY* as 2 is ranked as 5.
+  
+  - When using rank() function, orders with *LO_QUANTITY* as 1 are ranked as 1, 1, 1, 1, and the order with *LO_QUANTITY* as 2 is ranked as 5, which exists sequence gaps.
+  
+  - When using dense_rank() function, orders with *LO_QUANTITY* as 1 are ranked as 1, 1, 1, 1, and the order with *LO_QUANTITY* as 2 is ranked as 2, which does not exist sequence gaps.
+
+
+
+- **NTILE**
+
+  - Function description: NTILE(value) OVER window, returning an integer ranging from 1 to value, dividing the partition as equally as possible
+
+- **Query Example**
+  The orders of each buyer are divided into 3 groups according to the number of purchased products. In order to display the search results completely, the orders with the number of products greater than or equal to 48 are selected for grouping.
+
+  ```SQL
+  SELECT 
+      NTILE(3) OVER w AS N_3,
+      LO_ORDERKEY,
+      LO_CUSTKEY,
+      LO_QUANTITY,
+      LO_PARTKEY
+  FROM SSB.P_LINEORDER
+  WHERE LO_QUANTITY >= 48
+WINDOW w AS (PARTITION BY LO_CUSTKEY ORDER BY LO_QUANTITY);
+  ```
+
+- **Result**
+  ![NTILE Response Examle](images/ntile_en.png)
+
+  
+  
+- **FIRST_VALUE**
+  
+  - Function description: FIRST_VALUE(value) OVER window, returning value evaluated at the row that is the first row of the window frame
+
+- **LAST_VALUE**
+  
+  - Function description: LAST_VALUE(value) OVER window, returning value evaluated at the row that is the last row of the window frame
+
+- **Query Sample**
+  Query the first order and the last order with the highest total price sorted by date.
+
+  ```SQL
+  SELECT 
+      FIRST_VALUE(TOTAL1) OVER W AS FIRST_VALUE_A,
+      LAST_VALUE(TOTAL1) OVER W AS LAST_VALUE_A,
+      TOTAL1,
+      LO_ORDERDATE
+  FROM (
+  	SELECT 
+  	    SUM(LO_ORDTOTALPRICE) AS TOTAL1,
+  	    LO_ORDERDATE
+  	FROM SSB.P_LINEORDER
+  	GROUP BY LO_ORDERDATE
+  	) T WINDOW W AS (
+  		ORDER BY LO_ORDERDATE ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
+  		)
+  ORDER BY LO_ORDERDATE DESC
+  ```
+
+- **Result**
+  ![](images/first_last_value_en.png)
+
+
+
+- **LEAD()**
+  
+  - Function description: LEAD(value, offset, default) OVER window, returning the offset row backwards from the current row in the partition. *value* represents the column as the current value, *offset* represents the number that needs to be searched for the offset row backwards based on the current value, and *default* represents the value returned by default when there is no eligible value, and null is returned by default if not filled.
+- **LAG()**
+  
+  - Function description: LAG(value, offset, default) OVER window, returning the forward offset of the current row in the partition. *value* represents the field as the column value, *offset* represents the number that needs to be looked up in the offset row forwards based on the current value, *default* represents the value returned by default when there is no eligible value, and null is returned by default if not filled.
+
+- **Query Sample**
+  Query the time of last order and next order based on current order.
+
+  ```SQL
+  SELECT
+    LO_ORDERKEY,
+    LO_CUSTKEY,
+    LO_QUANTITY,
+    LO_ORDERDATE,
+    LEAD(LO_ORDERDATE, 1) OVER W AS NEXT_DT,
+    LAG(LO_ORDERDATE, 1) OVER W AS LAST_DT
+  FROM SSB.P_LINEORDER
+  WINDOW W AS (PARTITION BY LO_CUSTKEY ORDER BY LO_ORDERDATE)
+  ```
+
+- **Result**
+  ![](images/lead_lag_en.png)
diff --git a/website/docs/query/insight/operator_function/intro.md b/website/docs/query/insight/operator_function/intro.md
new file mode 100644
index 0000000000..937d48c273
--- /dev/null
+++ b/website/docs/query/insight/operator_function/intro.md
@@ -0,0 +1,18 @@
+---
+title: Operators and Functions
+language: en
+sidebar_label: Operators and Functions
+pagination_label: Operators and Functions
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - operators 
+    - functions
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+This chapter will introduce more operators and functions that applicable to SQL statements.
diff --git a/website/docs/query/insight/operator_function/model_priority.md b/website/docs/query/insight/operator_function/model_priority.md
new file mode 100644
index 0000000000..10292be43d
--- /dev/null
+++ b/website/docs/query/insight/operator_function/model_priority.md
@@ -0,0 +1,40 @@
+---
+title: Specify Model Priorities in SQL
+language: en
+sidebar_label: Specify Model Priorities in SQL
+pagination_label: Specify Model Priorities in SQL
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - model priorities
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+
+When there are more than on model that can answer a query, kylin will automatically choose a best model. But in some cases, a user would like to use some certain models for some certain queries. And the user can achieve that via a model priority hint in the SQL.
+
+
+### Model Priority Hint
+The syntax
+```
+SELECT /*+ MODEL_PRIORITY(model1, model2) */ col1, col2 from ....
+```
+The hint starts with `/*+` and ends with `*/`. And the hint must be placed right after the `SELECT` clause.
+
+`MODEL_PRIORITY(model1, model2, ...)` specifies the model priorities, `MODEL_PRIORITY(...)` accept a list of model names with descending priority. The model that doesn't appear in the hint will be assigned with the lowest priority.
+The model priority hint will be valid for the entire query. Only the first hint occured in the SQL will be valid.
+
+During the model matching, if multiple model is capable to answer the query. kylin will use the model with the highest priority specified in the model priority hint
+
+Supported starts from kylin 5.0
+
+
+#### Example
+```
+SELECT /*+ MODEL_PRIORITY(model1, model2) */ col1, col2 from table;
+```
+If both model1 and model2 is capable to answer the query, model1 will be the chosen for this query.
diff --git a/website/docs/query/insight/operator_function/operator/arithmetic_operator.md b/website/docs/query/insight/operator_function/operator/arithmetic_operator.md
new file mode 100644
index 0000000000..03dbdc5bff
--- /dev/null
+++ b/website/docs/query/insight/operator_function/operator/arithmetic_operator.md
@@ -0,0 +1,23 @@
+---
+title: Arithmetic Operators
+language: en
+sidebar_label: Arithmetic Operators
+pagination_label: Arithmetic Operators
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - arithmetic operators
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+
+| Operator | Description                               | Syntax | Example              |
+| -------- | ---------------------------------------- | ------ | -------------------- |
+| +        | Plus                                     | A+B    | Cost+Profit          |
+| -        | Minus.                                   | A-B    | Revenue- Cost        |
+| *        | Multiply. Returns *numeric1* multiplied by *numeric2* | A*B    | Unit_Price* Quantity |
+| /        | Divide                                   | A/B    | Total_Sale/Quantity  |
diff --git a/website/docs/query/insight/operator_function/operator/comparison_operator.md b/website/docs/query/insight/operator_function/operator/comparison_operator.md
new file mode 100644
index 0000000000..d8dd6b4ebb
--- /dev/null
+++ b/website/docs/query/insight/operator_function/operator/comparison_operator.md
@@ -0,0 +1,38 @@
+---
+title: Comparison Operators
+language: en
+sidebar_label: Comparison Operators
+pagination_label: Comparison Operators
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - comparison operators
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+| Operator             | Description                                                  | Syntax                                      | Example                                                      |
+| -------------------- | ------------------------------------------------------------ | ------------------------------------------- | ------------------------------------------------------------ |
+| <                    | Less than                                                    | A<B                                         | Profit < Cost                                                |
+| <=                   | Less than or equal                                           | A<=B                                        | Profit <=Cost                                                |
+| >                    | Greater than                                                 | A>=B                                        | Profit >Cost                                                 |
+| >=                   | Greater than or equal                                        | A>=B                                        | Profit >=Cost                                                |
+| `<>`                   | Not Equal                                                    | `A<>B`                                        | `Profit1<>Profit2`                                             |
+| IS NULL              | Whether *value* is null                                      | value IS NULL                               | profit IS NULL                                               |
+| IS NOT NULL          | Whether *value* is not null                                  | value IS NOT NULL                           | profit IS NOT NULL                                           |
+| IS DISTINCT FROM     | Whether two values are not equal, treating null values as the same | value1 IS DISTINCT FROM value2              | profit1 IS DISTINCT FROM profit2                             |
+| IS NOT DISTINCT FROM | Whether two values are equal, treating null values as the same | value1 IS NOT DISTINCT FROM value2          | profit1 IS NOT DISTINCT FROM profit2                         |
+| BETWEEN              | Return true if the specified value is greater than or equal to value1 and less than or equal to value2 | A BETWEEN   value1 AND value2               | profit BETWEEN 1 AND 1000      Date BETWEEN '2016-01-01' AND '2016-12-30' |
+| NOT BETWEEN          | Whether *value1* is less than *value2* or greater than *value3* | value1 NOT BETWEEN value2 AND value3        | profit NOT BETWEEN 1 AND 1000      Date NOT BETWEEN '2016-01-01' AND '2016-12-30' |
+| LIKE                 | Whether *string1* matches pattern *string2*, *string1* and *string2* are string types | string1 LIKE string2                        | name LIKE '%frank%'                                          |
+| NOT LIKE             | Whether *string1* does not match pattern *string2*, *string1* and *string2* are string types | string1 NOT LIKE string2 [ ESCAPE string3 ] | name NOT LIKE '%frank%'                                      |
+| SIMILAR TO           | Whether *string1* matches *string2* in regular expression    | string1 SIMILAR TO string2                  | name SIMILAR TO 'frank'                                      |
+| NOT SIMILAR TO       | Whether *string1* does not match *string2* in regular expression | string1 NOT SIMILAR TO string2              | name NOT SIMILAR TO 'frank'                                  |
+
+
+Limitations
+- The current SIMILAR TO ESCAPE syntax is limited to scenarios that support adding and hitting the model in SQL statements, and other scenarios such as adding computable columns.
+- The string literals including specific symbols need to be escaped by default and the escape character is `\`. For example, to match `\kylin` , it should be using `\\kylin`. For `SIMILAR TO` and  `NOT SIMILAR TO` function, the functions use regex match and there is an escaped process. For example, for `\\\\kylin`, the result will be `true` when using  `SIMILAR TO` to compare with `\kylin` and `\\kylin`.
diff --git a/website/docs/query/insight/operator_function/operator/images/string.png b/website/docs/query/insight/operator_function/operator/images/string.png
new file mode 100644
index 0000000000..7ef9ef560c
Binary files /dev/null and b/website/docs/query/insight/operator_function/operator/images/string.png differ
diff --git a/website/docs/query/insight/operator_function/operator/intro.md b/website/docs/query/insight/operator_function/operator/intro.md
new file mode 100644
index 0000000000..ebf98c3135
--- /dev/null
+++ b/website/docs/query/insight/operator_function/operator/intro.md
@@ -0,0 +1,21 @@
+---
+title: Operators
+language: en
+sidebar_label: Operators
+pagination_label: Operators
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - operators
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+
+
+## Operators
+
+This chapter will introduce operators that applicable to SQL statements.
diff --git a/website/docs/query/insight/operator_function/operator/logical_operator.md b/website/docs/query/insight/operator_function/operator/logical_operator.md
new file mode 100644
index 0000000000..a5d2a6634a
--- /dev/null
+++ b/website/docs/query/insight/operator_function/operator/logical_operator.md
@@ -0,0 +1,31 @@
+---
+title: Logical Operators
+language: en
+sidebar_label: Logical Operators
+pagination_label: Logical Operators
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - logical operators
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+
+## Logical Operators
+
+This section introduces the logical operators supported by Kyligence Enterprise. The values of logical propositions are TRUE, FALSE, and UNKNOWN. The following `boolean` refers to a logical proposition.
+
+| Operator     | Description                               | Syntax                | Example                       |
+| ------------ | ---------------------------------------- | --------------------- | ----------------------------- |
+| AND          | Whether *boolean1* and *boolean2* are both TRUE | boolean1 AND boolean2 | Name ='frank' AND gender='M'  |
+| OR           | Whether *boolean1* is TRUE or *boolean2* is TRUE | boolean1 OR boolean2  | Name='frank' OR Name='Hentry' |
+| NOT          | Whether *boolean* is not TRUE; returns UNKNOWN if *boolean* is UNKNOWN | NOT boolean           | NOT (NAME ='frank')           |
+| IS FALSE     | Whether *boolean* is FALSE; returns FALSE if *boolean* is UNKNOWN | boolean IS FALSE      | Name ='frank' IS FALSE        |
+| IS NOT FALSE | Whether *boolean* is not FALSE; returns TRUE if *boolean* is UNKNOWN | boolean IS NOT FALSE  | Name ='frank' IS NOT FALSE    |
+| IS TRUE      | Whether *boolean* is TRUE; returns FALSE if *boolean* is UNKNOWN | boolean IS TRUE       | Name ='frank' IS TRUE         |
+| IS NOT TRUE  | Whether *boolean* is not TRUE; returns TRUE if *boolean* is UNKNOWN | boolean IS NOT TRUE   | Name ='frank' IS NOT TRUE     |
+
diff --git a/website/docs/query/insight/operator_function/operator/string_operator.md b/website/docs/query/insight/operator_function/operator/string_operator.md
new file mode 100644
index 0000000000..1fc34b88c0
--- /dev/null
+++ b/website/docs/query/insight/operator_function/operator/string_operator.md
@@ -0,0 +1,21 @@
+---
+title: String Operator
+language: en
+sidebar_label: String Operator
+pagination_label: String Operator
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - string operator
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+
+## String Operator
+
+![](images/string.png)
+
diff --git a/website/docs/query/insight/sql_spec.md b/website/docs/query/insight/sql_spec.md
new file mode 100755
index 0000000000..5675d3af11
--- /dev/null
+++ b/website/docs/query/insight/sql_spec.md
@@ -0,0 +1,180 @@
+---
+title: SQL Specification
+language: en
+sidebar_label: SQL Specification
+pagination_label: SQL Specification
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - sql specification
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+
+kylin supports ANSI SQL 2003, and its basic SQL grammars are listed as follow.
+
+
+### Supported Syntax
+
+```sql
+statement:
+|  query 
+
+query:
+      values
+  |  WITH withItem [ , withItem ]* query
+  |   {
+          select
+      |  selectWithoutFrom
+      |  query UNION [ ALL | DISTINCT ] query
+      |  query INTERSECT [ ALL | DISTINCT ] query
+      }
+      [ ORDER BY orderItem [, orderItem ]* ]
+      [ LIMIT { count | ALL } ]
+      [ OFFSET start { ROW | ROWS } ]
+      [ FETCH { FIRST | NEXT } [ count ] { ROW| ROWS } ]
+
+withItem:
+      name
+      ['(' column [, column ]* ')' ]
+      AS '(' query ')'
+
+orderItem:
+      expression [ ASC | DESC ][ NULLS FIRST |NULLS LAST ]
+
+select:
+      SELECT [ ALL | DISTINCT]
+          { * | projectItem [, projectItem ]* }
+      FROM tableExpression
+      [ WHERE booleanExpression ]
+      [ GROUP BY { groupItem [, groupItem ]* }]
+      [ HAVING booleanExpression ]
+      [ WINDOW windowName AS windowSpec [,windowName AS windowSpec ]* ]
+
+selectWithoutFrom:
+      SELECT [ ALL | DISTINCT ]
+          { * | projectItem [, projectItem ]* }
+
+projectItem:
+      expression [ [ AS ] columnAlias ]
+  |  tableAlias . *
+
+tableExpression:
+      tableReference [, tableReference ]*
+  |  tableExpression [ NATURAL ][( LEFT | RIGHT | FULL ) [ OUTER ] ] JOINtableExpression [ joinCondition ]
+
+joinCondition:
+      ON booleanExpression
+  |  USING '(' column [, column ]* ')'
+
+tableReference:
+      tablePrimary
+      [ matchRecognize ]
+      [ [ AS ] alias [ '(' columnAlias [,columnAlias ]* ')' ] ]
+
+tablePrimary:
+      [ [ catalogName . ] schemaName . ]tableName
+      '(' TABLE [ [ catalogName . ] schemaName. ] tableName ')'
+  |   [LATERAL ] '(' query ')'
+  |  UNNEST '(' expression ')' [ WITH ORDINALITY ]
+  |   [LATERAL ] TABLE '(' [ SPECIFIC ] functionName '(' expression [, expression ]*')' ')'
+
+values:
+      VALUES expression [, expression ]*
+ 
+groupItem:
+      expression
+  |   '('')'
+  |   '('expression [, expression ]* ')'
+  |  GROUPING SETS '(' groupItem [, groupItem ]* ')'
+
+windowRef:
+      windowName
+  |  windowSpec
+
+windowSpec:
+      [windowName ]
+      '(' 
+      [ ORDER BYorderItem [, orderItem ]* ]
+      [ PARTITION BY expression [, expression]* ]
+      [
+          RANGE numericOrIntervalExpression {PRECEDING | FOLLOWING }
+      |  ROWS numericExpression { PRECEDING | FOLLOWING }
+      ]
+    ')'
+```
+
+> **Notice:** the versions of the realization may be different. Feel free to contact the technical support team if you have any questions.
+
+
+
+### SQL Keywords
+
+The following is a list of SQL keywords in kylin. Please avoid using keywords as identifiers as much as possible.
+
+A, ABS, ABSOLUTE, ACTION, ADA, ADD, ADMIN, AFTER, ALL,ALLOCATE, ALLOW, ALTER, ALWAYS, AND, ANY, APPLY, ARE, ARRAY,ARRAY_MAX_CARDINALITY, AS, ASC, ASENSITIVE, ASSERTION, ASSIGNMENT, ASYMMETRIC, AT, ATOMIC, ATTRIBUTE, ATTRIBUTES,AUTHORIZATION, AVG, BEFORE, BEGIN, BEGIN_FRAME,BEGIN_PARTITION, BERNOULLI, BETWEEN, BIGINT, BINARY, BIT,BLOB, BOOLEAN, BOTH, BREADTH, BY, C, CALL, CALLED,CARDINALITY, CASCADE, CASCADED, CASE, CAST, CATALOG, CATALOG_NAME, CEIL, CEILING, CENTURY, CHAIN, CHAR,CHARACTE [...]
+
+
+
+
+### Identifiers
+
+Identifiers are the names of tables, columns and other metadata elements used in an SQL query.
+
+Unquoted identifiers, such as *emp*, must start with a letter and can only contain letters, digits, and underscores. They are implicitly converted to upper case.
+
+Quoted identifiers, such as *"Employee Name"*, start and end with double-quotes. They may contain virtually any character, including spaces and other punctuation. If you wish to include double-quotes in an identifier, use another double-quotes to include it, like this: *"An employee called ""Fred""."*
+
+Matching identifiers to the name of the referenced object is case-sensitive. But remember that unquoted identifiers are implicitly converted to upper case before matching, and if the object it refers to was created using an unquoted identifier for its name, then its name will have been converted to the upper case also.
+
+### Escape Keywords 
+
+If your column or table name are using keywords, you will need to use double quote to escape it.  
+
+For example, table *DATES* contains column *YEAR* that overlap with kylin's keyword YEAR. As shown in the example below, if you want to query  *YEAR*  directly, the query will return error as kylin query engine fails to differentiate this column from keywords. 
+
+![Column named with reserved words will fail the query](images/spec/1.png)
+
+You can just include the column with double-quotes to get the right result.
+
+![Query with double-quoted upper case column will return successfully  ](images/spec/4.en.png)
+
+
+
+### Escape Quote
+
+If your query contains single quote in the value, you can use another single quote to escape single quote in the value. 
+
+![Escape single quote with another single quote](images/spec/5.png)
+
+For double-quotes in the value, escape is not needed. 
+
+![Double quote](images/spec/6.png)
+
+
+
+### Date Query
+
+The following are syntax examples of date query:
+
+```sql
+select LO_LINENUMBER, LO_ORDERDATE, LO_ORDTOTALPRICE
+from SSB.P_LINEORDER
+where LO_ORDERDATE = date '1992-06-03'
+```
+
+![Date Query 1](images/data_sql/date_sql1.en.png)
+
+or
+
+```sql
+select LO_LINENUMBER, LO_ORDERDATE, LO_ORDTOTALPRICE
+from SSB.P_LINEORDER
+where LO_ORDERDATE = cast ( '1992-06-03' as date)
+```
+
+![Date Query 2](images/data_sql/date_sql2.en.png)
diff --git a/website/docs/query/intro.md b/website/docs/query/intro.md
index ccf4259219..8e339abc47 100644
--- a/website/docs/query/intro.md
+++ b/website/docs/query/intro.md
@@ -1,14 +1,17 @@
 ---
-sidebar_position: 1
+title: SQL Query
+language: en
+sidebar_label: SQL Query
+pagination_label: SQL Query
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - sql query
+draft: false
+last_update:
+    date: 08/17/2022
 ---
 
-# Tutorial Intro
-
-Let's discover ** Kylin 5.0 in than 15 minutes **.
-
-## Getting Started
-
-```shell
-
-docker pull apachekylin/apache-kylin-standalone:5.0.0
-```
+This chapter introduces how to execute SQL queries in kylin, as well as the supported SQL grammar and guidelines.
diff --git a/website/docs/query/optimization/intro.md b/website/docs/query/optimization/intro.md
new file mode 100644
index 0000000000..66bda4f492
--- /dev/null
+++ b/website/docs/query/optimization/intro.md
@@ -0,0 +1,19 @@
+---
+title: Query Optimization
+language: en
+sidebar_label: Query Optimization
+pagination_label: Query Optimization
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - query optimization
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+# Query Optimization
+
+This chapter will introduce some query optimization in Kylin.
diff --git a/website/docs/query/optimization/query_enhanced.md b/website/docs/query/optimization/query_enhanced.md
new file mode 100644
index 0000000000..ee1c3a2edd
--- /dev/null
+++ b/website/docs/query/optimization/query_enhanced.md
@@ -0,0 +1,128 @@
+---
+title: Use the Left Join model to answer Inner Join queries with equivalent semantics
+language: en
+sidebar_label: Use the Left Join model to answer Inner Join queries with equivalent semantics
+pagination_label: Use the Left Join model to answer Inner Join queries with equivalent semantics
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - query enhanced
+draft: false
+last_update:
+    date: 08/17/2022
+---
+
+## Use the Left Join model to answer Inner Join queries with equivalent semantics
+
+By default in Kylin, the relationship between tables in the query SQL must be consistent with the relationship between the fact tables and dimension tables defined in the model, that is, the model of `Left Join` cannot answer the query of `Inner Join`.
+
+But in some cases,  part of `Left Join` queries can be semantically equivalently transformed into `Inner Join` queries, so we provide configuration parameters that allow users to use `Left Join`  model to answer equivalent semantics `Inner Join` query.
+
+The configuration parameters starts to take effect from version of Kylin 4.2.4, which is closed by default.
+
+
+
+### Scene one
+`[Table A] Left Join [Table B] Inner Join [Table C]` is semantically equivalent to `[Table A] Inner Join [Table B] Inner Join [Table C]`.
+
+The reason is that when `Inner Join` is performed after `Left Join`, the rows that do not match the last right table will be filtered out, so the above two expressions are semantically equivalent.
+
+Using the `kylin.query.join-match-optimization-enabled=true` configuration, Kylin can support `Left Join` models to answer the above equivalent semantic `Inner Join` queries.
+
+#### Example 1
+The model is defined as `KYLIN_SALES Left Join KYLIN_ACCOUNT Inner Join KYLIN_COUNTRY`
+
+The SQL is as follows:
+
+```sql
+select kylin_country.name
+from kylin_sales inner join kylin_account on kylin_sales.buyer_id = kylin_account.account_id
+inner join kylin_country on kylin_account.account_country = kylin_country.country
+```
+
+The above model can answer this SQL.
+
+#### Example 2
+The model is defined as `[Table A] Left Join [Table B] Left Join [Table C] Inner Join [Table D] Left Join [Table E]`
+
+The SQL is as follows:
+`[Table A] Inner Join [Table B] Inner Join [Table C] Inner Join [Table D] Left Join [Table E]`
+
+The above model can answer this SQL.
+
+
+
+### Scene Two
+
+SQL has the following characteristics: `[Table A] Left Join [Table B]` and any column of `[Table B]` in the filter condition has a non-null constraint, then the SQL semantics is equivalent to `[Table A] Inner Join [Table B]`.
+
+Using `kylin.query.join-match-optimization-enabled=true` configuration, Kylin can support `Left Join` model to answer the above equivalent semantic `Inner Join` query.
+
+The columns with non-null constraints need to meet the condition: they should be `isNotNull` filter conditions, `isNotNull` corresponds to common comparison operators: `=`, `<>`, `>`, `<`, `<=`, `>=`, `like`, `In`, `not like`, `not in` etc.
+
+`isNull` filter conditions like `IS NULL` do not have non-null constraint.
+
+At the same time, the filter conditions `IS DISTINCT FROM` and `CASE WHEN` is not supported for the time being, thus will be automatically ignored. See the known limitation 1.
+
+#### Example 1
+The model is defined as: `TEST_ACCOUNT left join TEST_ORDER left join TEST_ACCOUNT`
+
+There are SQL as follows, which can hit the above model because there is a non-null constraint filter condition.
+
+```sql
+select SUM(a.ITEM_COUNT) as SUM_ITEM_COUNT
+from TEST_KYLIN_FACT a
+left join TEST_ORDER b on a.ORDER_ID = b.ORDER_ID
+inner join TEST_ACCOUNT c on b.BUYER_ID = c.ACCOUNT_ID
+where c.ACCOUNT_COUNTRY ='CN' and (c.ACCOUNT_COUNTRY like'%US' or c.ACCOUNT_COUNTRY is null)
+```
+
+#### Example 2
+The model is defined as: `[Table A] inner join [Table B]`
+
+There are SQL as follows that can hit this model:
+
+```sql
+A left join B where B.nonfk = '123' and B.col1 in ('ab','ac')
+A left join B where A.col is null and B.col1 like 'xxx'
+A left join B where B.col between 100 and 100000
+A left join B where A.fk is null and B.col1 ='something'
+A left join B where b.col ='something' and (b.col ='xxx' or b.col is null)
+A left join B where abs(b.col) = 123
+A left join B where floor(b.col) = 123
+```
+
+The following SQL cannot hit this model:
+
+```sql
+A left join B where B.col1 = 'xx' or A.col2 = 'yy'
+A left join B where B.col1 = 'xx' or B.col2 is null
+```
+
+
+
+### Scene Three
+
+Now there is the model `[Table A] Left Join [Table B] left join [Table C]`.
+
+The following SQL is as follows, you can hit this model:
+```sql
+A inner join B inner join C where C.col ='abc'
+```
+
+The reason is that the columns in table C have non-null constraints, so the query can be equivalent to:
+
+```sql
+A LEFT_OR_INNER join B LEFT_OR_INNER join C where C.col ='abc'
+```
+
+Scene three is a mixture of scene one and scene two.
+
+
+
+### Known limitations
+
+1. For Scene two, judgment of non-null constraints don't include `NOT SIMILAR TO`, `CASE WHEN` expressions.
+2. Also for scene two, judgment of non-null constraints don't include aggregation functions like `HAVING SUM(PRICE)>0`.
diff --git a/website/docs/query/optimization/segment_pruning.md b/website/docs/query/optimization/segment_pruning.md
new file mode 100644
index 0000000000..13e2cc53c2
--- /dev/null
+++ b/website/docs/query/optimization/segment_pruning.md
@@ -0,0 +1,39 @@
+---
+title: Segment Pruning When Querying
+language: en
+sidebar_label: Segment Pruning When Querying
+pagination_label: Segment Pruning When Querying
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - segment pruning
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+
+## Segment Pruning When Querying
+
+Starting from Kylin 5.0, we support the calculation of the dimension value range (maximum and minimum) of all dimensions when building the Segment, so we can prune segment during queries, reducing the scanning range of the segment to optimize some query performance.
+
+
+### Configuration
+
+This optimization is enable by default. Under normal circumstances, you do not need to pay attention to this optimization. In some extreme cases, system-level or project-level shutdown is supported.
+
+To disable it on the system level, configure the parameters in `$KYLIN_HOME/conf/kylin.properties` . To disable it on project level, add the configuration in **Setting-Advanced Settings-Custom Project Configuration**.
+
+`kylin.storage.columnar.dimension-range-filter-enabled=false`
+
+### Known Limitation
+
+1. Currently, only the query filter conditions including `=, in, >, >=, <, <=, and, or`  support pruning segment. Filters including `not, is null` are not supported.
+
+2. This optimization will slightly increase the building time, but it is basically negligible compared to the total building time.
+
+3. The historical data that has been built will not use this optimization. If you want the historical data to apply this optimization, you need to refresh the Segment.
+
+4. The multi-level partition models are not supported.
diff --git a/website/docs/query/pushdown/images/query_pushdown.png b/website/docs/query/pushdown/images/query_pushdown.png
new file mode 100644
index 0000000000..157744ad95
Binary files /dev/null and b/website/docs/query/pushdown/images/query_pushdown.png differ
diff --git a/website/docs/query/pushdown/images/query_pushdown_spark.png b/website/docs/query/pushdown/images/query_pushdown_spark.png
new file mode 100644
index 0000000000..f396d6194b
Binary files /dev/null and b/website/docs/query/pushdown/images/query_pushdown_spark.png differ
diff --git a/website/docs/query/pushdown/intro.md b/website/docs/query/pushdown/intro.md
new file mode 100644
index 0000000000..2bf015e701
--- /dev/null
+++ b/website/docs/query/pushdown/intro.md
@@ -0,0 +1,22 @@
+---
+title: Query Pushdown
+language: en
+sidebar_label: Query Pushdown
+pagination_label: Query Pushdown
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - query pushdown
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+## Query Pushdown
+
+Kylin integrates a Smart Pushdown engine which works SQL on Hadoop engine like SparkSQL. 
+
+For queries which cannot be answered by Kylin, they can be routed into Pushdown Query Engine when necessary.
+
diff --git a/website/docs/query/pushdown/pushdown_to_embedded_spark.md b/website/docs/query/pushdown/pushdown_to_embedded_spark.md
new file mode 100644
index 0000000000..2727db47fc
--- /dev/null
+++ b/website/docs/query/pushdown/pushdown_to_embedded_spark.md
@@ -0,0 +1,152 @@
+---
+title: Pushdown to Embedded SparkSQL
+language: en
+sidebar_label: Pushdown to Embedded SparkSQL
+pagination_label: Pushdown to Embedded SparkSQL
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - pushdown to embedded sparksql
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+
+## Pushdown to Embedded SparkSQL
+
+Kylin uses pre-calculation instead of online calculation to achieve sub-second query latency on big data. In general, the model with pre-calculated data is able to serve the most frequently-used queries. But if a query is beyond the model's definition, the system will route it to the Kyligence smart pushdown engine. The embedded pushdown engine is Spark SQL.
+
+> **Note**: In order to ensure data consistency, query cache is not available in pushdown.
+
+
+
+#### Turn on and off
+
+Kylin 5.x has an embedded Spark engine, so no 3rd party dependency is required to enable query pushdown. You can query on source tables directly after loading the data source (at least one table loaded).
+
+By default, the query pushdown is turned on in a new project. If you need to turn it off, there are two ways:
+
+**At project level:** As shown below, click the left navigation bar **Setting** tab and in the **Basic Settings -> Pushdown Setting** part, you can turn off the Pushdown Engine in the red frame. If this setting has never been modified at project level, it takes instance level setting as default value.
+
+![Turn off Query Pushdown at Project Level](images/query_pushdown.png)
+
+**At instance level:** Query pushdown is turned on by default, which corresponds to the configuration item `kylin.query.pushdown-enabled=true` in the configuration file `${KYLIN_HOME}/conf/kylin.properties`. To turn it off, add `kylin.query.pushdown-enabled=false` into the configuration file.
+
+
+
+### Verify Query Pushdown
+
+If you submit the query when there is no online model, the query pushdown will work. If your data source is HIVE, the query pushdown will show the result from HIVE, such as: `Answered By: HIVE`.
+
+> **Tip**: If the query answered by models, the query history will be displayed as: `Answered By: {model_name}`.
+
+
+
+### Float Type Notice
+
+There are 2 things to notice when pushdown query has filter for `float` type column of datasource: literal type and precision.
+
+* Literal Type: Specify literal data type manually with the same type as column like `'123.4f'`, for example:
+
+```sql
+SELECT * FROM table1 WHERE col1 > '123.4f'
+```
+
+* Precision: Do not exceed the precision range of `float / double` type
+
+
+For example, datasource table `table1` has `float` type column `col1`, data in table:
+
+```text
+|-------|
+| col1  |
+|-------|
+| 1.2   |
+| 5.67  |
+| 123.4 |
+| 130.1 |
+|-------|
+```
+
+A pushdown query which is:
+
+```sql
+SELECT * FROM table1 WHERE col1 > 123.4
+```
+
+Will get the following result:
+
+```text
+|-------|
+| col1  |
+|-------|
+| 123.4 |
+| 130.1 |
+|-------|
+```
+
+As you can see the line `123.4` appears in the result even the `WHERE` filter uses the operation grater than (`>`).
+
+The reason causes it is the two different data types between two sides of the filter operator, and it hits a rule of Spark optimizer:
+
+`col1` is the type of `float`, and lteral value `123.4` is the type of `double` by default.
+
+And this Spark optimizer will transform the filter in such a way (Notice the operator `>=` after transformation):
+
+```text
+cast(col1 to double) > 123.4  ===>  col1 >= cast(123.4 to float)
+```
+
+That causes the line `123.4` return.
+
+The correct way is to specify **literal type** manually like the following:
+
+```sql
+SELECT * FROM table1 WHERE col1 > '123.4f'
+```
+
+And the result looks good now:
+
+```text
+|-------|
+| col1  |
+|-------|
+| 130.1 |
+|-------|
+```
+
+For **literal precision**, check out the following pushdown query:
+
+```sql
+SELECT * FROM table1 WHERE col1 > '123.3999f'
+```
+
+Which returns a correct result:
+
+```text
+|-------|
+| col1  |
+|-------|
+| 123.4 |
+| 130.1 |
+|-------|
+```
+
+But the next pushdown query which has an unsuitable numeric precision may cause an unexpected result:
+
+```sql
+SELECT * FROM table1 WHERE col1 > '123.39999999999f'
+```
+
+The unexpected result:
+
+```text
+|-------|
+| col1  |
+|-------|
+| 130.1 |
+|-------|
+```
diff --git a/website/docs/snapshot/images/snapshot_1_en.png b/website/docs/snapshot/images/snapshot_1_en.png
new file mode 100644
index 0000000000..15d4af5d7e
Binary files /dev/null and b/website/docs/snapshot/images/snapshot_1_en.png differ
diff --git a/website/docs/snapshot/images/snapshot_2_en.png b/website/docs/snapshot/images/snapshot_2_en.png
new file mode 100644
index 0000000000..9101022d56
Binary files /dev/null and b/website/docs/snapshot/images/snapshot_2_en.png differ
diff --git a/website/docs/snapshot/images/snapshot_3_en.png b/website/docs/snapshot/images/snapshot_3_en.png
new file mode 100644
index 0000000000..9317403ccc
Binary files /dev/null and b/website/docs/snapshot/images/snapshot_3_en.png differ
diff --git a/website/docs/snapshot/images/snapshot_4_en.png b/website/docs/snapshot/images/snapshot_4_en.png
new file mode 100644
index 0000000000..b4b75e4b74
Binary files /dev/null and b/website/docs/snapshot/images/snapshot_4_en.png differ
diff --git a/website/docs/snapshot/images/snapshot_5_en.png b/website/docs/snapshot/images/snapshot_5_en.png
new file mode 100644
index 0000000000..47e88a2405
Binary files /dev/null and b/website/docs/snapshot/images/snapshot_5_en.png differ
diff --git a/website/docs/snapshot/images/snapshot_6_en.png b/website/docs/snapshot/images/snapshot_6_en.png
new file mode 100644
index 0000000000..5f11b66a25
Binary files /dev/null and b/website/docs/snapshot/images/snapshot_6_en.png differ
diff --git a/website/docs/snapshot/images/snapshot_7_en.png b/website/docs/snapshot/images/snapshot_7_en.png
new file mode 100644
index 0000000000..11963c604e
Binary files /dev/null and b/website/docs/snapshot/images/snapshot_7_en.png differ
diff --git a/website/docs/snapshot/images/snapshot_8_en.png b/website/docs/snapshot/images/snapshot_8_en.png
new file mode 100644
index 0000000000..e2fb1f5b2a
Binary files /dev/null and b/website/docs/snapshot/images/snapshot_8_en.png differ
diff --git a/website/docs/snapshot/images/snapshot_9_en.png b/website/docs/snapshot/images/snapshot_9_en.png
new file mode 100644
index 0000000000..dcfe0f42d0
Binary files /dev/null and b/website/docs/snapshot/images/snapshot_9_en.png differ
diff --git a/website/docs/snapshot/intro.md b/website/docs/snapshot/intro.md
new file mode 100644
index 0000000000..cd6a5b3d7b
--- /dev/null
+++ b/website/docs/snapshot/intro.md
@@ -0,0 +1,18 @@
+---
+title: Snapshot Management
+language: en
+sidebar_label: Snapshot Management
+pagination_label: Snapshot Management
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - snapshot management
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+This chapter introduces the snapshot management of Kylin.
+
diff --git a/website/docs/snapshot/snapshot_management.md b/website/docs/snapshot/snapshot_management.md
new file mode 100644
index 0000000000..203383b9b2
--- /dev/null
+++ b/website/docs/snapshot/snapshot_management.md
@@ -0,0 +1,121 @@
+---
+title: Snapshot Management and Operations
+language: en
+sidebar_label: Snapshot Management and Operations
+pagination_label: Snapshot Management and Operations
+toc_min_heading_level: 2
+toc_max_heading_level: 6
+pagination_prev: null
+pagination_next: null
+keywords:
+    - snapshot management
+    - snapshot operations
+draft: true
+last_update:
+    date: 08/17/2022
+---
+
+
+## Snapshot Management and Operations
+
+The snapshot is a read-only static view of a source table, which can be used in the following scenarios:
+
+- Support independent query of dimension table. The snapshot will be used first to answer such queries.
+- The dimensions on the dimension table can also serve the query by adding the join key to the aggregate group without generating an index, thereby avoiding the problem of dimension explosion
+
+By default, snapshots are automatically generated by the system when loading data, building indexes, and refreshing/merging segments, and are used to store the data of the dimension tables in the model. Kylin 5.0 and later versions provide the function of independent management of snapshots. 
+
+After the snapshot management function is enabled, the system will **no longer** automatically manage snapshots. The building, refreshing, and deletion of snapshots must be manually managed.
+
+
+
+### <span id="switch">Enable Snapshot Management</span>
+
+The snapshot management is disabled by default. You can enable it in advanced settings.
+
+1. Navigate to **Settings -> Advanced Settings -> Snapshot Management**, turn on **Support Snapshot Management**.
+
+   ![Enable Snapshot Management](images/snapshot_1_en.png)
+   
+   ![switch on](images/snapshot_2_en.png)
+   
+   ![switch off](images/snapshot_3_en.png)
+
+**Note**:
+
+- After the snapshot management function is enabled, the system will **no longer** automatically manage snapshots. Following are the details:
+  - If a table has already built a snapshot in the system, it will be displayed in the snapshot list. When the data changes, you need to manually refresh the snapshot
+  - If a table has not built a snapshot in the system, it will not be displayed in the snapshot list, and you need to build it manually
+
+### <span id="snapshot_list">Snapshot List</span>
+
+1. After snapshot management is enabled, you can find **Snapshot** under **Data Asset**.
+
+2. Navigate to **Data Asset -> Snapshot**, the snapshot list will be displayed, as shown below:
+
+   ![Snapshot List](images/snapshot_4_en.png)
+   
+   **Fields Explanation:**
+   
+   - **Table Name**:name of table.
+   - **Database Name**:name of database.
+   - **Partition Column**: partition column used in building snapshot.
+   - **Usage**:usage of snapshot in querying. Update every 30 minutes.
+   - **Status**:There are four statuses..
+      - *LOADING* indicate the snapshot is loading and not able to serve queries.
+       - *ONLINE* indicate the snapshot is online and able to serve queries.
+       - *REFRESHING* indicate the snapshot is refreshing and able to serve queries with last built snapshots.
+       - *BROKEN* indicate that the snapshot is damaged. When the source table has a structural change and is reloaded, the corresponding snapshot will change to this state and cannot serve the query at this time.
+   - **Storage**:The storage of the snapshot ( Snappy compressed Parquet file format size ).
+   - **Lookup Model Amount**:Indicate the number of models which use this table as lookup table.
+   - **Fact Model Amount**:Indicate the number of models which use this table as fact table.
+   - **Last Updated Time**:The last update/refresh time.
+
+
+
+### <span id="operation">Snapshot Operations</span>
+
+Above the snapshot lis are the operation buttons. Specific actions are listed below:
+
+- **Add Snapshots**:Select tables or databases to build snapshots. Click **Next** to set partition columns.
+
+   ![Add Snapshot](images/snapshot_5_en.png)
+
+  Next, set the snapshot partition columns. Setting snapshot partition columns can improve the building speed by building partitions in parallel to a certain extent. By default, the system will build in a non-partitioned manner. Users can also set or detect partition columns , Also support specified partition value refresh.
+   > **Note**: 
+   >
+   > - The snapshot partition column can only be set as the Hive partition column. If the wrong partition column is used, the building task will get wrong;
+   >
+   > - Building in partitions can only increase the speed of the building task, and the result of the built snapshot is still full data.
+   
+     ![Set Partition Column](images/snapshot_6_en.png)
+
+- **Refresh Snapshots**:Select snapshots to refresh.
+    - Full refresh: The refresh operation at this time builds the latest and full snapshot.
+    - Incremental refresh: For snapshots with source table partitions set, only the newly added partition value data will be refreshed (the built historical data will not be refreshed). It is recommended to select when the historical data is not updated.
+    - Custom partition value refresh: Specify single or multiple partition values for data refresh.
+
+  ![Refresh Snapshot](images/snapshot_7_en.png)
+
+
+- **Delete Snapshots**:Select snapshots to delete. It will discard all jobs related to the snapshots.
+
+   ![delete](images/snapshot_8_en.png)
+
+- **Repair Snapshots**: When the source table has a structural change and is reloaded, the corresponding snapshot will change to "BROKEN" and can be repaired.
+
+  ![repair](./images/snapshot_9_en.png)
+
+According building tasks of snapshot,you can configure spark related configurations in `kylin.properties` to achieve more fine-grained control.(These configuration can be overridden at project level)
+
+The configuration starts with `kylin.engine.snapshot.spark-conf`, as shown below:
+```
+kylin.engine.snapshot.spark-conf.spark.executor.instances=5
+kylin.engine.snapshot.spark-conf.spark.executor.cores=2
+kylin.engine.snapshot.spark-conf.spark.executor.memory=12288m
+kylin.engine.snapshot.spark-conf.spark.executor.memoryOverhead=3072m
+kylin.engine.snapshot.spark-conf.spark.sql.shuffle.partitions=200
+kylin.engine.snapshot.spark-conf.spark.driver.memory=4096m
+kylin.engine.snapshot.spark-conf.spark.driver.memoryOverhead=3072m
+kylin.engine.snapshot.spark-conf.spark.driver.cores=2
+```
diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
index 6e1036ed49..6cf5d7a204 100644
--- a/website/docusaurus.config.js
+++ b/website/docusaurus.config.js
@@ -139,36 +139,31 @@ const config = {
           src: 'img/kylin_logo.png',
         },
         items: [
-          {
-            type: 'doc',
-            docId: 'download',
-            position: 'left',
-            label: 'Download',
-          },
-
           {
             type: 'doc',
             docId: 'intro',
             position: 'left',
             label: 'Document',
           },
-
           {
             type: 'doc',
             docId: 'development/how_to_contribute',
             position: 'left',
             label: 'Development',
           },
-
+          {
+            type: 'doc',
+            docId: 'download',
+            position: 'left',
+            label: 'Download',
+          },
           {
             type: 'doc',
             docId: 'community',
             position: 'left',
             label: 'Community',
           },
-
           {to: '/blog', label: 'Blog', position: 'left'},
-
           {
             href: 'https://github.com/apache/kylin',
             label: 'GitHub',
diff --git a/website/sidebars.js b/website/sidebars.js
index 7afe31a706..d5b9011e3c 100644
--- a/website/sidebars.js
+++ b/website/sidebars.js
@@ -428,10 +428,100 @@ const sidebars = {
         {
             type: 'category',
             label: 'Modeling',
+            link: {
+                type: 'doc',
+                id: 'modeling/intro'
+            },
             items: [
                 {
                     type: 'doc',
-                    id: 'modeling/intro'
+                    id: 'modeling/data_modeling'
+                },
+            ],
+        },
+        {
+            type: 'category',
+            label: 'Query',
+            link: {
+                type: 'doc',
+                id: 'query/intro'
+            },
+            items: [
+                {
+                    type: 'doc',
+                    id: 'query/data_type'
+                },
+                {
+                    type: 'category',
+                    label: 'Basic Query Execution',
+                    link: {
+                        type: 'doc',
+                        id: 'query/insight/intro'
+                    },
+                    items: [
+                        {
+                            type: 'doc',
+                            id: 'query/insight/insight'
+                        },
+                        {
+                            type: 'doc',
+                            id: 'query/insight/sql_spec'
+                        },
+                        {
+                            type: 'doc',
+                            id: 'query/insight/async_query'
+                        },
+                    ],
+                },
+                {
+                    type: 'doc',
+                    id: 'query/history'
+                },
+                {
+                    type: 'category',
+                    label: 'Query Optimization',
+                    link: {
+                        type: 'doc',
+                        id: 'query/optimization/intro'
+                    },
+                    items: [
+                        {
+                            type: 'doc',
+                            id: 'query/optimization/query_enhanced'
+                        },
+                        {
+                            type: 'doc',
+                            id: 'query/optimization/segment_pruning'
+                        },
+                    ],
+                },
+                {
+                    type: 'category',
+                    label: 'Query PushDown',
+                    link: {
+                        type: 'doc',
+                        id: 'query/pushdown/intro'
+                    },
+                    items: [
+                        {
+                            type: 'doc',
+                            id: 'query/pushdown/pushdown_to_embedded_spark'
+                        },
+                    ],
+                },
+            ],
+        },
+        {
+            type: 'category',
+            label: 'Snapshot Management',
+            link: {
+                type: 'doc',
+                id: 'snapshot/intro'
+            },
+            items: [
+                {
+                    type: 'doc',
+                    id: 'snapshot/snapshot_management'
                 },
             ],
         },
@@ -541,17 +631,6 @@ const sidebars = {
                 },
             ],
         },
-        {
-            type: 'category',
-            label: 'Query',
-            items: [
-                {
-                    type: 'doc',
-                    id: 'query/intro'
-                },
-            ],
-        },
-
     ],
     DevelopmentSideBar: [
         {


[kylin] 01/02: KYLIN-5221 minor fix markdown links

Posted by xx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xxyu pushed a commit to branch doc5.0
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 55e131d671729160bf55bf9bff309a667d5a838d
Author: Mukvin <bo...@163.com>
AuthorDate: Wed Aug 17 14:00:31 2022 +0800

    KYLIN-5221 minor fix markdown links
---
 website/docs/configuration/query_cache.md                         | 2 +-
 website/docs/deployment/installation/install_validation.md        | 2 +-
 .../operations/access-control/data-access-control/acl_table.md    | 4 ++--
 website/docs/operations/access-control/intro.md                   | 8 ++++----
 website/docs/operations/system-operation/diagnosis/diagnosis.md   | 2 +-
 website/docs/operations/system-operation/limit_query.md           | 2 --
 website/docs/restapi/acl_api/acl_api.md                           | 2 +-
 website/docs/restapi/data_source_api.md                           | 6 +++---
 website/docs/restapi/error_code.md                                | 4 ++--
 9 files changed, 15 insertions(+), 17 deletions(-)

diff --git a/website/docs/configuration/query_cache.md b/website/docs/configuration/query_cache.md
index f767537f57..22a4947176 100644
--- a/website/docs/configuration/query_cache.md
+++ b/website/docs/configuration/query_cache.md
@@ -69,4 +69,4 @@ The default query cache cannot be shared among different nodes or processes beca
 #### Limitation
 Due to metadata inconsistency between Query nodes and All/Job nodes, the redis cache swith `kylin.cache.redis.enabled=true` should be configured along with `kylin.server.store-type=jdbc`.
 
-> **Caution:** Redis passwords can be encrypted, please refer to: [Use MySQL as Metastore](../deployment/rdbms_metastore/mysql/mysql_metastore.md)
+> **Caution:** Redis passwords can be encrypted, please refer to: [Use MySQL as Metastore](../deployment/on-premises/rdbms_metastore/mysql/mysql_metastore.md)
diff --git a/website/docs/deployment/installation/install_validation.md b/website/docs/deployment/installation/install_validation.md
index a3d0dbc8e2..7b67662f49 100644
--- a/website/docs/deployment/installation/install_validation.md
+++ b/website/docs/deployment/installation/install_validation.md
@@ -40,7 +40,7 @@ After running successfully, you should be able to see the following information
 Sample hive tables are created successfully
 ```
 
-We will be using SSB dataset as the data sample to introduce Kylin in several sections of this  product manual. The SSB dataset simulates transaction data for the online store, see more details in [Sample Dataset](../../Get-to-Know-Kyligence-Enterprise/quickstart/sample_dataset.en.md). Below is a brief introduction.
+We will be using SSB dataset as the data sample to introduce Kylin in several sections of this  product manual. The SSB dataset simulates transaction data for the online store, see more details in [Sample Dataset](#TODO). Below is a brief introduction.
 
 
 | Table        | Description                 | Introduction                                                         |
diff --git a/website/docs/operations/access-control/data-access-control/acl_table.md b/website/docs/operations/access-control/data-access-control/acl_table.md
index 5978d8aabc..340bc0b009 100644
--- a/website/docs/operations/access-control/data-access-control/acl_table.md
+++ b/website/docs/operations/access-control/data-access-control/acl_table.md
@@ -18,7 +18,7 @@ last_update:
 
 **Introduction**
 
-Table ACLs determines whether a user/user group can access a certain table loaded into Kyligence Enterprise. When a user/group is restricted to a table, the user/user group cannot query the table. 
+Table ACLs determines whether a user/user group can access a certain table loaded into Kylin. When a user/group is restricted to a table, the user/user group cannot query the table. 
 
 - System administrator can grant table-level data access to a user/user group. All users/user groups that have access rights to the current project can read or query all tables in the current project by default.
 - When the access rights of the user/user group are deleted, or the user/user group is removed from the system, the corresponding table-level permissions are also deleted.
@@ -41,7 +41,7 @@ If you query the table, the result will show an error.
 
 ### <span id="set">Grant Table ACL</span>
 
-1. In the **Admin** -> Project page, the system administrator can grant user/user group project-level access rights. For details, please refer to [Project ACL](project_acl.en.md).
+1. In the **Admin** -> Project page, the system administrator can grant user/user group project-level access rights. For details, please refer to [Project ACL](project_acl.md).
 
 2. Select the project you want to authorize,then click **Authorization** under the right **Action** bar and go to the authorization page.
 
diff --git a/website/docs/operations/access-control/intro.md b/website/docs/operations/access-control/intro.md
index fcc139d327..1cd13cbfc6 100644
--- a/website/docs/operations/access-control/intro.md
+++ b/website/docs/operations/access-control/intro.md
@@ -15,10 +15,10 @@ last_update:
 ---
 
 
-This chapter will describe how to grant roles to users/groups in Kyligence to control their access rights, and how to perform fine-grained data access control, it will cover:
+This chapter will describe how to grant roles to users/groups in Kylin to control their access rights, and how to perform fine-grained data access control, it will cover:
 
-* [User Management](user_management.en.md)
+* [User Management](user_management.md)
 * [User Group Management](group_management.md)
 
-* [Data Access Control](access_control.md)
-  * [Project Access Control](project_acl.md)
+* [Data Access Control](data-access-control/intro.md)
+  * [Project Access Control](data-access-control/project_acl.md)
diff --git a/website/docs/operations/system-operation/diagnosis/diagnosis.md b/website/docs/operations/system-operation/diagnosis/diagnosis.md
index 0527c12bad..63954cccfd 100644
--- a/website/docs/operations/system-operation/diagnosis/diagnosis.md
+++ b/website/docs/operations/system-operation/diagnosis/diagnosis.md
@@ -20,7 +20,7 @@ last_update:
 
 ## System, Job and Query Diagnosis
 
-Kylin users may face with many problems during usage, such as  job failure, SQL query failure, SQL query overtime, etc. In order to help solve these problems efficiently, Kylin provides a *Diagnosis* function on Web UI to pack related information into a zip package to help operation staff and Kyligence Support team to analyze the root cause. 
+Kylin users may face with many problems during usage, such as  job failure, SQL query failure, SQL query overtime, etc. In order to help solve these problems efficiently, Kylin provides a *Diagnosis* function on Web UI to pack related information into a zip package to help operation staff and Kylin Community to analyze the root cause. 
 
 Diagnosis function includes System, Job and Query Diagnosis. In addition to the method of generating diagnostic package on web UI described in this chapter, you can also generate the diagnostic package through the bash script. For details, please refer to [Diagnosis Tool](../cli_tool/diagnosis.md).
 
diff --git a/website/docs/operations/system-operation/limit_query.md b/website/docs/operations/system-operation/limit_query.md
index b53e46b151..855fbda880 100644
--- a/website/docs/operations/system-operation/limit_query.md
+++ b/website/docs/operations/system-operation/limit_query.md
@@ -47,8 +47,6 @@ Set `kylin.query.share-state-switch-implement=jdbc` in `kylin.properties`, and c
 
 Among them, the default value of Spark task load is 50. Generally, it is not recommended to modify it. 
 
-To configure the Ops Plan to turn on the large query rejection strategy, please contact the [Kyligence Technical Support Team](https://support.kyligence.io/#/) for help.
-
 
 ### Judgment of large query
 
diff --git a/website/docs/restapi/acl_api/acl_api.md b/website/docs/restapi/acl_api/acl_api.md
index 0e2e95665f..e126e089f7 100644
--- a/website/docs/restapi/acl_api/acl_api.md
+++ b/website/docs/restapi/acl_api/acl_api.md
@@ -16,7 +16,7 @@ last_update:
 
 > Reminders:
 >
-> 1. Please read [Access and Authentication REST API](authentication.md) and understand how authentication works.
+> 1. Please read [Access and Authentication REST API](../authentication.md) and understand how authentication works.
 > 2. On Curl command line, don't forget to quote the URL if it contains the special char `&`.
 
 
diff --git a/website/docs/restapi/data_source_api.md b/website/docs/restapi/data_source_api.md
index 598d9b0a6c..88c816d5ae 100644
--- a/website/docs/restapi/data_source_api.md
+++ b/website/docs/restapi/data_source_api.md
@@ -85,7 +85,7 @@ last_update:
 
 ### Prepare Reload Hive Table   {#Prepare-Reload-Hive-Table}
 
-> Call this API to compare the Hive table metadata in Kylin and that in the data source. For Hive table already loaded to Kylin and already used in model and index building, if some columns are deleted, Kyligence will return a failure when reading these columns. Use this API to find the metadata differences and evaluate whether to update the metadata in Kylin by reloading the Hive table. 
+> Call this API to compare the Hive table metadata in Kylin and that in the data source. For Hive table already loaded to Kylin and already used in model and index building, if some columns are deleted, Kylin will return a failure when reading these columns. Use this API to find the metadata differences and evaluate whether to update the metadata in Kylin by reloading the Hive table. 
 
 - `GET http://host:port/kylin/api/tables/pre_reload`
 
@@ -223,7 +223,7 @@ last_update:
 
 ### Prepare Unload Table   {#Prepare-Unload-Table}
 
-> Call this API to evaluate the risks of unloading Hive table metadata. There are cases where you need to offline some Hive tables from Kylin. Use this API to evaluate the impact of unloading Hive table metadata on related Kyligence models and jobs.
+> Call this API to evaluate the risks of unloading Hive table metadata. There are cases where you need to offline some Hive tables from Kylin. Use this API to evaluate the impact of unloading Hive table metadata on related Kylin models and jobs.
 
 - `GET http://host:port/kylin/api/tables/{database}/{table}/prepare_unload`
 
@@ -283,7 +283,7 @@ last_update:
 
 ### Unload Table   {#Unload-Table}
 
-> Call this API to unload Hive table metadata from Kylin. After the API call, Hive table metadata will be unloaded from Kylin, and Kyligence can no longer read the table data, or update the index data related to the table. It's recommended calling the "Prepare Unload Table" API before calling this API.  
+> Call this API to unload Hive table metadata from Kylin. After the API call, Hive table metadata will be unloaded from Kylin, and Kylin can no longer read the table data, or update the index data related to the table. It's recommended calling the "Prepare Unload Table" API before calling this API.  
 
 - `DELETE http://host:port/kylin/api/tables/{database}/{table}`
 
diff --git a/website/docs/restapi/error_code.md b/website/docs/restapi/error_code.md
index 9231d819bb..a5fa4cdc08 100644
--- a/website/docs/restapi/error_code.md
+++ b/website/docs/restapi/error_code.md
@@ -111,7 +111,7 @@ If an error occurs when calling the Kylin API or using the built-in tools, you c
 | KE-010043208 | The entered parameter value is invalid. The parameter value must be a non-negative <br />integer. Please check and try again. |
 | KE-010043209 | The entered parameter value is invalid. Only support specific values at the moment. Please <br />check and try again. |
 | KE-010043210 | The parameter can't be empty. Please enter the time partition column format. |
-| KE-010043211 | The type of the time partition column is invalid. Please enter the supported format, refer <br />to the [user manual](../../Designers-Guide/model/model_design/data_modeling.en.md#faq). |
+| KE-010043211 | The type of the time partition column is invalid. Please enter the supported format, refer <br />to the [user manual](#TODO). |
 | KE-010043212 | The parameter can't be empty. Please enter layout(s) id.     |
 | KE-010043213 | Can't find layout. Please check and try again.               |
 | KE-010043214 | Can't refresh the value, the time units are only supported in d (days), h (hours), <br />or m (minutes). Please check and try again. |
@@ -144,7 +144,7 @@ If an error occurs when calling the Kylin API or using the built-in tools, you c
 
 ### Built-in tools error code  
 > [!NOTE]
->  Build-in tools include [junk file clean tools](../../Operation-and-Maintenance-Guide/junk_file_clean.en.md), [diagnostic package generate tools](../../Operation-and-Maintenance-Guide/system-operation/cli_tool/diagnosis.en.md), etc.
+>  Build-in tools include [junk file clean tools](../operations/system-operation/junk_file_clean.md), [diagnostic package generate tools](../operations/system-operation/cli_tool/diagnosis.md), etc.
 
 |    Error code      | Error message                                                                         |
 |:-------------------|:--------------------------------------------------------------------------------------|