/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
/*
 * Description     : Test that multiple subtrees in the same query
 *                   can be rewritten with secondary BTree indexes.
 *                   Guards against regression to issue 204.
 * Expected Result : Success
 * Issue           : Issue 204
 */

use tpch;


load  dataset Orderstmp using localfs ((`path`=`asterix_nc1://data/tpch0.001/orders.tbl`),(`format`=`delimited-text`),(`delimiter`=`|`)) pre-sorted;

insert into Orders
select element {'nested':{'o_orderkey':c.o_orderkey,'o_custkey':c.o_custkey,'o_orderstatus':c.o_orderstatus,'o_totalprice':c.o_totalprice,'o_orderdate':c.o_orderdate,'o_orderpriority':c.o_orderpriority,'o_clerk':c.o_clerk,'o_shippriority':c.o_shippriority,'o_comment':c.o_comment}}
from  Orderstmp as c
where (c.o_orderkey <= 4000)
;
insert into Orders
select element {'nested':{'o_orderkey':c.o_orderkey,'o_orderstatus':c.o_orderstatus,'o_totalprice':c.o_totalprice,'o_orderdate':c.o_orderdate,'o_orderpriority':c.o_orderpriority,'o_clerk':c.o_clerk,'o_shippriority':c.o_shippriority,'o_comment':c.o_comment}}
from  Orderstmp as c
where (c.o_orderkey > 4000)
;
