Uploaded image for project: 'IMPALA'
  1. IMPALA
  2. IMPALA-5003

Add 'constant propagation' for Views with a partition filter

    Details

    • Type: Improvement
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: Impala 2.9.0
    • Fix Version/s: Impala 2.9.0
    • Component/s: Frontend
    • Labels:

      Description

      There are scenarios when you (1) want to reduce the number of partitions by hash&mod or part of a date, etc and (2) do not want to expose this complexity to end users who do not know how the table might be partitioned.

      As an example: Say I have a column that has 1000 values and I want to partition on customer_id, but the data is too small for 1000 partitions so I want to mod the customer_id to put it into 100 'buckets', to give me a 100x faster scan when selecting a single customer_id.

      When using 3rd party tools or exposing this table to end users who may not be educated on the partitioning scheme, those tools will not properly filter based on simply selecting a specific customer_id.

      If this is my partitioned table:
      CREATE TABLE default.lesspartitions ( customer_id INT, customer_name STRING, some_data STRING ) PARTITIONED BY ( partition_id INT )
      ...
      select customer_id, customer_name, some_data, customer_id % 100 as partition_id from source

      It would be nice to create a view where the partition is hidden from users and filtered on automatically:
      CREATE VIEW default.hiddenpartitions AS SELECT customer_id, customer_name, some_data FROM default.lesspartitions WHERE partition_id = customer_id % 100

      So then a user/3rd party tool can write the following:
      select * from hiddenpartitions where customer_id = 4

      This jira would adding the 'constant propagation' of the filter into the view so that only 1 partition is read.

        Issue Links

          Activity

          Hide
          zamsden Zach Amsden added a comment - - edited
          [localhost:21000] > explain select * from zparted where o_orderkey = 1 and partition_id = abs(fnv_hash(100*o_custkey)) % 100 and 10 * o_orderkey = o_custkey;
          Query: explain select * from zparted where o_orderkey = 1 and partition_id = abs(fnv_hash(100*o_custkey)) % 100 and 10 * o_orderkey = o_custkey
          +------------------------------------------------------------------------------------+
          | Explain String                                                                     |
          +------------------------------------------------------------------------------------+
          | Estimated Per-Host Requirements: Memory=32.00MB VCores=1                           |
          | WARNING: The following tables are missing relevant table and/or column statistics. |
          | default.zparted                                                                    |
          |                                                                                    |
          | PLAN-ROOT SINK                                                                     |
          | |                                                                                  |
          | 01:EXCHANGE [UNPARTITIONED]                                                        |
          | |                                                                                  |
          | 00:SCAN HDFS [default.zparted]                                                     |
          |    partitions=1/100 files=1 size=235.48KB                                          |
          |    predicates: o_custkey = 10, o_orderkey = 1                                      |
          +------------------------------------------------------------------------------------+
          Fetched 11 row(s) in 0.01s
          
          Show
          zamsden Zach Amsden added a comment - - edited [localhost:21000] > explain select * from zparted where o_orderkey = 1 and partition_id = abs(fnv_hash(100*o_custkey)) % 100 and 10 * o_orderkey = o_custkey; Query: explain select * from zparted where o_orderkey = 1 and partition_id = abs(fnv_hash(100*o_custkey)) % 100 and 10 * o_orderkey = o_custkey +------------------------------------------------------------------------------------+ | Explain String | +------------------------------------------------------------------------------------+ | Estimated Per-Host Requirements: Memory=32.00MB VCores=1 | | WARNING: The following tables are missing relevant table and/or column statistics. | | default .zparted | | | | PLAN-ROOT SINK | | | | | 01:EXCHANGE [UNPARTITIONED] | | | | | 00:SCAN HDFS [ default .zparted] | | partitions=1/100 files=1 size=235.48KB | | predicates: o_custkey = 10, o_orderkey = 1 | +------------------------------------------------------------------------------------+ Fetched 11 row(s) in 0.01s
          Hide
          zamsden Zach Amsden added a comment -

          This doesn't work for multiple assignments embedded inside OR clauses. For example,

          [localhost:21000] > explain select * from zhiddenpart where o_orderkey = 10 or o_orderkey = 20;
          Query: explain select * from zhiddenpart where o_orderkey = 10 or o_orderkey = 20
          +--------------------------------------------------------------------------------------------------------------------+
          | Explain String                                                                                                     |
          +--------------------------------------------------------------------------------------------------------------------+
          | Estimated Per-Host Requirements: Memory=384.00MB VCores=1                                                          |
          | WARNING: The following tables are missing relevant table and/or column statistics.                                 |
          | default.zparted                                                                                                    |
          |                                                                                                                    |
          | PLAN-ROOT SINK                                                                                                     |
          | |                                                                                                                  |
          | 01:EXCHANGE [UNPARTITIONED]                                                                                        |
          | |                                                                                                                  |
          | 00:SCAN HDFS [default.zparted]                                                                                     |
          |    partitions=100/100 files=100 size=23.00MB                                                                       |
          |    predicates: partition_id = o_orderkey % 100, default.zparted.o_orderkey = 10 OR default.zparted.o_orderkey = 20 |
          +--------------------------------------------------------------------------------------------------------------------+
          Fetched 11 row(s) in 0.02s
          

          Instead, they have to be rewritten as UNION queries:

          [localhost:21000] > explain select * from zhiddenpart where o_orderkey = 10 UNION ALL select * from zhiddenpart where o_orderkey = 20;
          Query: explain select * from zhiddenpart where o_orderkey = 10 UNION ALL select * from zhiddenpart where o_orderkey = 20
          +------------------------------------------------------------------------------------+
          | Explain String                                                                     |
          +------------------------------------------------------------------------------------+
          | Estimated Per-Host Requirements: Memory=64.00MB VCores=1                           |
          | WARNING: The following tables are missing relevant table and/or column statistics. |
          | default.zparted                                                                    |
          |                                                                                    |
          | PLAN-ROOT SINK                                                                     |
          | |                                                                                  |
          | 03:EXCHANGE [UNPARTITIONED]                                                        |
          | |                                                                                  |
          | 00:UNION                                                                           |
          | |                                                                                  |
          | |--02:SCAN HDFS [default.zparted]                                                  |
          | |     partitions=1/100 files=1 size=235.46KB                                       |
          | |     predicates: default.zparted.o_orderkey = 20                                  |
          | |                                                                                  |
          | 01:SCAN HDFS [default.zparted]                                                     |
          |    partitions=1/100 files=1 size=235.59KB                                          |
          |    predicates: default.zparted.o_orderkey = 10                                     |
          +------------------------------------------------------------------------------------+
          Fetched 17 row(s) in 0.02s
          
          Show
          zamsden Zach Amsden added a comment - This doesn't work for multiple assignments embedded inside OR clauses. For example, [localhost:21000] > explain select * from zhiddenpart where o_orderkey = 10 or o_orderkey = 20; Query: explain select * from zhiddenpart where o_orderkey = 10 or o_orderkey = 20 +--------------------------------------------------------------------------------------------------------------------+ | Explain String | +--------------------------------------------------------------------------------------------------------------------+ | Estimated Per-Host Requirements: Memory=384.00MB VCores=1 | | WARNING: The following tables are missing relevant table and/or column statistics. | | default .zparted | | | | PLAN-ROOT SINK | | | | | 01:EXCHANGE [UNPARTITIONED] | | | | | 00:SCAN HDFS [ default .zparted] | | partitions=100/100 files=100 size=23.00MB | | predicates: partition_id = o_orderkey % 100, default .zparted.o_orderkey = 10 OR default .zparted.o_orderkey = 20 | +--------------------------------------------------------------------------------------------------------------------+ Fetched 11 row(s) in 0.02s Instead, they have to be rewritten as UNION queries: [localhost:21000] > explain select * from zhiddenpart where o_orderkey = 10 UNION ALL select * from zhiddenpart where o_orderkey = 20; Query: explain select * from zhiddenpart where o_orderkey = 10 UNION ALL select * from zhiddenpart where o_orderkey = 20 +------------------------------------------------------------------------------------+ | Explain String | +------------------------------------------------------------------------------------+ | Estimated Per-Host Requirements: Memory=64.00MB VCores=1 | | WARNING: The following tables are missing relevant table and/or column statistics. | | default .zparted | | | | PLAN-ROOT SINK | | | | | 03:EXCHANGE [UNPARTITIONED] | | | | | 00:UNION | | | | | |--02:SCAN HDFS [ default .zparted] | | | partitions=1/100 files=1 size=235.46KB | | | predicates: default .zparted.o_orderkey = 20 | | | | | 01:SCAN HDFS [ default .zparted] | | partitions=1/100 files=1 size=235.59KB | | predicates: default .zparted.o_orderkey = 10 | +------------------------------------------------------------------------------------+ Fetched 17 row(s) in 0.02s
          Hide
          zamsden Zach Amsden added a comment - - edited

          I can't reconcile this query result - inline views do not appear to be selecting the correct partition.

          [localhost:21000] > create table zparted partitioned by (partition_id,code) as select *, (fnv_hash(o_orderkey) % 10) as partition_id, substr(o_orderdate,4,1) as code from tpch.orders;
          Query: create table zparted partitioned by (partition_id,code) as select *, (fnv_hash(o_orderkey) % 10) as partition_id, substr(o_orderdate,4,1) as code from tpch.orders
          Query submitted at: 2017-03-15 00:07:52 (Coordinator: http://impala-dev:25000)
          Query progress can be monitored at: http://impala-dev:25000/query_plan?query_id=bd4183718bbbbea5:b84bcf1600000000
          +-------------------------+
          | summary                 |
          +-------------------------+
          | Inserted 1500000 row(s) |
          +-------------------------+
          Fetched 1 row(s) in 6.97s
          [localhost:21000] > create view zviewfull as select * from default.zparted where partition_id = (fnv_hash(o_orderkey) % 10) and code = substr(o_orderdate, 4, 1);
          Query: create view zviewfull as select * from default.zparted where partition_id = (fnv_hash(o_orderkey) % 10) and code = substr(o_orderdate, 4, 1)
          Query submitted at: 2017-03-15 00:08:48 (Coordinator: http://impala-dev:25000)
          Query progress can be monitored at: http://impala-dev:25000/query_plan?query_id=f64e61484a63c6f4:f2ceeb6f00000000
          
          Fetched 0 row(s) in 0.03s
          [localhost:21000] > select * from zparted where partition_id = -7 and code = '8' and o_orderkey = 4727010;
          Query: select * from zparted where partition_id = -7 and code = '8' and o_orderkey = 4727010
          Query submitted at: 2017-03-15 00:09:00 (Coordinator: http://impala-dev:25000)
          Query progress can be monitored at: http://impala-dev:25000/query_plan?query_id=a74f62f8a81210b0:13ce4c1d00000000
          +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+
          | o_orderkey | o_custkey | o_orderstatus | o_totalprice | o_orderdate | o_orderpriority | o_clerk         | o_shippriority | o_comment                                                    | partition_id | code |
          +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+
          | 4727010    | 138004    | O             | 245068.19    | 1998-04-19  | 1-URGENT        | Clerk#000000921 | 0              | ess packages are blithely fluffily pending deposits. regular | -7           | 8    |
          +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+
          Fetched 1 row(s) in 0.13s
          [localhost:21000] > select * from zviewfull where partition_id = -7 and code = '8' and o_orderkey = 4727010;
          Query: select * from zviewfull where partition_id = -7 and code = '8' and o_orderkey = 4727010
          Query submitted at: 2017-03-15 00:09:20 (Coordinator: http://impala-dev:25000)
          Query progress can be monitored at: http://impala-dev:25000/query_plan?query_id=6341d21ebcd4f62c:e731c6ac00000000
          
          Fetched 0 row(s) in 3.69s
          [localhost:21000] > select * from zviewfull where o_orderkey = 4727010;
          Query: select * from zviewfull where o_orderkey = 4727010
          Query submitted at: 2017-03-15 00:09:57 (Coordinator: http://impala-dev:25000)
          Query progress can be monitored at: http://impala-dev:25000/query_plan?query_id=834a3987b9d98c78:9634f53b00000000
          
          Fetched 0 row(s) in 0.23s
          [localhost:21000] > explain select * from zviewfull where o_orderkey = 4727010;
          Query: explain select * from zviewfull where o_orderkey = 4727010
          +---------------------------------------------------------------------------------------+
          | Explain String                                                                        |
          +---------------------------------------------------------------------------------------+
          | Estimated Per-Host Requirements: Memory=48.00MB VCores=1                              |
          | WARNING: The following tables are missing relevant table and/or column statistics.    |
          | default.zparted                                                                       |
          |                                                                                       |
          | PLAN-ROOT SINK                                                                        |
          | |                                                                                     |
          | 01:EXCHANGE [UNPARTITIONED]                                                           |
          | |                                                                                     |
          | 00:SCAN HDFS [default.zparted]                                                        |
          |    partitions=7/133 files=7 size=8.13MB                                               |
          |    predicates: default.zparted.o_orderkey = 4727010, code = substr(o_orderdate, 4, 1) |
          +---------------------------------------------------------------------------------------+
          Fetched 11 row(s) in 0.01s
          [localhost:21000] > explain select * from zviewfull where o_orderkey = 4727010 and o_orderdate = '1998-04-19';
          Query: explain select * from zviewfull where o_orderkey = 4727010 and o_orderdate = '1998-04-19'
          +-------------------------------------------------------------------------------------------------+
          | Explain String                                                                                  |
          +-------------------------------------------------------------------------------------------------+
          | Estimated Per-Host Requirements: Memory=32.00MB VCores=1                                        |
          | WARNING: The following tables are missing relevant table and/or column statistics.              |
          | default.zparted                                                                                 |
          |                                                                                                 |
          | PLAN-ROOT SINK                                                                                  |
          | |                                                                                               |
          | 01:EXCHANGE [UNPARTITIONED]                                                                     |
          | |                                                                                               |
          | 00:SCAN HDFS [default.zparted]                                                                  |
          |    partitions=1/133 files=1 size=738.37KB                                                       |
          |    predicates: default.zparted.o_orderkey = 4727010, default.zparted.o_orderdate = '1998-04-19' |
          +-------------------------------------------------------------------------------------------------+
          Fetched 11 row(s) in 0.01s
          [localhost:21000] > select * from zviewfull where o_orderkey = 4727010 and o_orderdate = '1998-04-19';
          Query: select * from zviewfull where o_orderkey = 4727010 and o_orderdate = '1998-04-19'
          Query submitted at: 2017-03-15 00:10:46 (Coordinator: http://impala-dev:25000)
          Query progress can be monitored at: http://impala-dev:25000/query_plan?query_id=fd4b0d44f504e910:2f960e8d00000000
          
          Fetched 0 row(s) in 0.12s
          [localhost:21000] > select * from zparted where o_orderkey = 4727010 and o_orderdate = '1998-04-19';
          Query: select * from zparted where o_orderkey = 4727010 and o_orderdate = '1998-04-19'
          Query submitted at: 2017-03-15 00:11:03 (Coordinator: http://impala-dev:25000)
          Query progress can be monitored at: http://impala-dev:25000/query_plan?query_id=cc4bcb1b58944768:6ed096ff00000000
          +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+
          | o_orderkey | o_custkey | o_orderstatus | o_totalprice | o_orderdate | o_orderpriority | o_clerk         | o_shippriority | o_comment                                                    | partition_id | code |
          +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+
          | 4727010    | 138004    | O             | 245068.19    | 1998-04-19  | 1-URGENT        | Clerk#000000921 | 0              | ess packages are blithely fluffily pending deposits. regular | -7           | 8    |
          +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+
          Fetched 1 row(s) in 0.49s
          [localhost:21000] >
          
          Show
          zamsden Zach Amsden added a comment - - edited I can't reconcile this query result - inline views do not appear to be selecting the correct partition. [localhost:21000] > create table zparted partitioned by (partition_id,code) as select *, (fnv_hash(o_orderkey) % 10) as partition_id, substr(o_orderdate,4,1) as code from tpch.orders; Query: create table zparted partitioned by (partition_id,code) as select *, (fnv_hash(o_orderkey) % 10) as partition_id, substr(o_orderdate,4,1) as code from tpch.orders Query submitted at: 2017-03-15 00:07:52 (Coordinator: http: //impala-dev:25000) Query progress can be monitored at: http: //impala-dev:25000/query_plan?query_id=bd4183718bbbbea5:b84bcf1600000000 +-------------------------+ | summary | +-------------------------+ | Inserted 1500000 row(s) | +-------------------------+ Fetched 1 row(s) in 6.97s [localhost:21000] > create view zviewfull as select * from default .zparted where partition_id = (fnv_hash(o_orderkey) % 10) and code = substr(o_orderdate, 4, 1); Query: create view zviewfull as select * from default .zparted where partition_id = (fnv_hash(o_orderkey) % 10) and code = substr(o_orderdate, 4, 1) Query submitted at: 2017-03-15 00:08:48 (Coordinator: http: //impala-dev:25000) Query progress can be monitored at: http: //impala-dev:25000/query_plan?query_id=f64e61484a63c6f4:f2ceeb6f00000000 Fetched 0 row(s) in 0.03s [localhost:21000] > select * from zparted where partition_id = -7 and code = '8' and o_orderkey = 4727010; Query: select * from zparted where partition_id = -7 and code = '8' and o_orderkey = 4727010 Query submitted at: 2017-03-15 00:09:00 (Coordinator: http: //impala-dev:25000) Query progress can be monitored at: http: //impala-dev:25000/query_plan?query_id=a74f62f8a81210b0:13ce4c1d00000000 +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+ | o_orderkey | o_custkey | o_orderstatus | o_totalprice | o_orderdate | o_orderpriority | o_clerk | o_shippriority | o_comment | partition_id | code | +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+ | 4727010 | 138004 | O | 245068.19 | 1998-04-19 | 1-URGENT | Clerk#000000921 | 0 | ess packages are blithely fluffily pending deposits. regular | -7 | 8 | +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+ Fetched 1 row(s) in 0.13s [localhost:21000] > select * from zviewfull where partition_id = -7 and code = '8' and o_orderkey = 4727010; Query: select * from zviewfull where partition_id = -7 and code = '8' and o_orderkey = 4727010 Query submitted at: 2017-03-15 00:09:20 (Coordinator: http: //impala-dev:25000) Query progress can be monitored at: http: //impala-dev:25000/query_plan?query_id=6341d21ebcd4f62c:e731c6ac00000000 Fetched 0 row(s) in 3.69s [localhost:21000] > select * from zviewfull where o_orderkey = 4727010; Query: select * from zviewfull where o_orderkey = 4727010 Query submitted at: 2017-03-15 00:09:57 (Coordinator: http: //impala-dev:25000) Query progress can be monitored at: http: //impala-dev:25000/query_plan?query_id=834a3987b9d98c78:9634f53b00000000 Fetched 0 row(s) in 0.23s [localhost:21000] > explain select * from zviewfull where o_orderkey = 4727010; Query: explain select * from zviewfull where o_orderkey = 4727010 +---------------------------------------------------------------------------------------+ | Explain String | +---------------------------------------------------------------------------------------+ | Estimated Per-Host Requirements: Memory=48.00MB VCores=1 | | WARNING: The following tables are missing relevant table and/or column statistics. | | default .zparted | | | | PLAN-ROOT SINK | | | | | 01:EXCHANGE [UNPARTITIONED] | | | | | 00:SCAN HDFS [ default .zparted] | | partitions=7/133 files=7 size=8.13MB | | predicates: default .zparted.o_orderkey = 4727010, code = substr(o_orderdate, 4, 1) | +---------------------------------------------------------------------------------------+ Fetched 11 row(s) in 0.01s [localhost:21000] > explain select * from zviewfull where o_orderkey = 4727010 and o_orderdate = '1998-04-19'; Query: explain select * from zviewfull where o_orderkey = 4727010 and o_orderdate = '1998-04-19' +-------------------------------------------------------------------------------------------------+ | Explain String | +-------------------------------------------------------------------------------------------------+ | Estimated Per-Host Requirements: Memory=32.00MB VCores=1 | | WARNING: The following tables are missing relevant table and/or column statistics. | | default .zparted | | | | PLAN-ROOT SINK | | | | | 01:EXCHANGE [UNPARTITIONED] | | | | | 00:SCAN HDFS [ default .zparted] | | partitions=1/133 files=1 size=738.37KB | | predicates: default .zparted.o_orderkey = 4727010, default .zparted.o_orderdate = '1998-04-19' | +-------------------------------------------------------------------------------------------------+ Fetched 11 row(s) in 0.01s [localhost:21000] > select * from zviewfull where o_orderkey = 4727010 and o_orderdate = '1998-04-19'; Query: select * from zviewfull where o_orderkey = 4727010 and o_orderdate = '1998-04-19' Query submitted at: 2017-03-15 00:10:46 (Coordinator: http: //impala-dev:25000) Query progress can be monitored at: http: //impala-dev:25000/query_plan?query_id=fd4b0d44f504e910:2f960e8d00000000 Fetched 0 row(s) in 0.12s [localhost:21000] > select * from zparted where o_orderkey = 4727010 and o_orderdate = '1998-04-19'; Query: select * from zparted where o_orderkey = 4727010 and o_orderdate = '1998-04-19' Query submitted at: 2017-03-15 00:11:03 (Coordinator: http: //impala-dev:25000) Query progress can be monitored at: http: //impala-dev:25000/query_plan?query_id=cc4bcb1b58944768:6ed096ff00000000 +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+ | o_orderkey | o_custkey | o_orderstatus | o_totalprice | o_orderdate | o_orderpriority | o_clerk | o_shippriority | o_comment | partition_id | code | +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+ | 4727010 | 138004 | O | 245068.19 | 1998-04-19 | 1-URGENT | Clerk#000000921 | 0 | ess packages are blithely fluffily pending deposits. regular | -7 | 8 | +------------+-----------+---------------+--------------+-------------+-----------------+-----------------+----------------+--------------------------------------------------------------+--------------+------+ Fetched 1 row(s) in 0.49s [localhost:21000] >
          Hide
          zamsden Zach Amsden added a comment -

          Apparently the CTAS is selecting big ints as negative numbers for the partition_id, and the inline view is selecting positive integers. Ugh. abs() fixes the probelm.

          Show
          zamsden Zach Amsden added a comment - Apparently the CTAS is selecting big ints as negative numbers for the partition_id, and the inline view is selecting positive integers. Ugh. abs() fixes the probelm.
          Hide
          zamsden Zach Amsden added a comment -

          Note that a follow-up fix is needed: https://issues.apache.org/jira/browse/IMPALA-5180

          Show
          zamsden Zach Amsden added a comment - Note that a follow-up fix is needed: https://issues.apache.org/jira/browse/IMPALA-5180
          Hide
          alex.behm Alexander Behm added a comment -

          Zach Amsden, this is fixed right? Please resolve.

          Show
          alex.behm Alexander Behm added a comment - Zach Amsden , this is fixed right? Please resolve.
          Show
          zamsden Zach Amsden added a comment - https://gerrit.cloudera.org/#/c/6389/
          Hide
          zamsden Zach Amsden added a comment -

          Also want follow-up change:

          https://gerrit.cloudera.org/#/c/6575/

          Show
          zamsden Zach Amsden added a comment - Also want follow-up change: https://gerrit.cloudera.org/#/c/6575/

            People

            • Assignee:
              zamsden Zach Amsden
              Reporter:
              PeterEbert Peter Ebert
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development