/*
* Copyright 1999-2012 Alibaba Group.
*
* Licensed 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.
*/
/**
* (created at 2011-8-5)
*/
package com.alibaba.cobar.route;
import junit.framework.Assert;
import junit.framework.TestCase;
import com.alibaba.cobar.parser.util.Pair;
import com.alibaba.cobar.route.hint.CobarHint;
/**
* @author <a href="mailto:shuo.qius@alibaba-inc.com">QIU Shuo</a>
*/
public class CobarHintTest extends TestCase {
public void testHint1() throws Exception {
String sql = " /*!cobar: $dataNodeId =2.1, $table='offer'*/ select * ";
CobarHint hint = CobarHint.parserCobarHint(sql, 2);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals(1, hint.getDataNodes().size());
Assert.assertEquals(new Pair<Integer, Integer>(2, 1), hint.getDataNodes().get(0));
sql = " /*!cobar: $dataNodeId=0.0, $table='offer'*/ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals(1, hint.getDataNodes().size());
Assert.assertEquals(new Pair<Integer, Integer>(0, 0), hint.getDataNodes().get(0));
sql = " /*!cobar: $dataNodeId=0, $table='offer'*/ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals(1, hint.getDataNodes().size());
Assert.assertEquals(new Pair<Integer, Integer>(0, null), hint.getDataNodes().get(0));
sql = "/*!cobar: $dataNodeId = [ 1,2,5.2] , $table = 'offer' */ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals(3, hint.getDataNodes().size());
sql = "/*!cobar: $partitionOperand=( 'member_id' = 'm1'), $table='offer'*/ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Pair<String[], Object[][]> pair = hint.getPartitionOperand();
Assert.assertEquals(1, pair.getKey().length);
Assert.assertEquals("MEMBER_ID", pair.getKey()[0]);
Assert.assertEquals(1, pair.getValue().length);
Assert.assertEquals(1, pair.getValue()[0].length);
Assert.assertEquals("m1", pair.getValue()[0][0]);
Assert.assertNull(hint.getDataNodes());
sql = "/*!cobar:$partitionOperand = ( 'member_id' = ['m1' , 'm2' ] ), $table='offer' , $replica= 2*/ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals(2, hint.getReplica());
pair = hint.getPartitionOperand();
Assert.assertEquals(1, pair.getKey().length);
Assert.assertEquals("MEMBER_ID", pair.getKey()[0]);
Assert.assertEquals(2, pair.getValue().length);
Assert.assertEquals(1, pair.getValue()[0].length);
Assert.assertEquals("m1", pair.getValue()[0][0]);
Assert.assertEquals("m2", pair.getValue()[1][0]);
Assert.assertNull(hint.getDataNodes());
sql = "/*!cobar:$partitionOperand=('member_id'=['m1', 'm2']),$table='offer',$replica=2*/ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals(2, hint.getReplica());
pair = hint.getPartitionOperand();
Assert.assertEquals(1, pair.getKey().length);
Assert.assertEquals("MEMBER_ID", pair.getKey()[0]);
Assert.assertEquals(2, pair.getValue().length);
Assert.assertEquals(1, pair.getValue()[0].length);
Assert.assertEquals("m1", pair.getValue()[0][0]);
Assert.assertEquals("m2", pair.getValue()[1][0]);
Assert.assertNull(hint.getDataNodes());
sql = "/*!cobar:$partitionOperand = ( ['offer_id','group_id'] = [123,'3c']), $table='offer'*/ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals((int) RouteResultsetNode.DEFAULT_REPLICA_INDEX, hint.getReplica());
pair = hint.getPartitionOperand();
Assert.assertEquals(2, pair.getKey().length);
Assert.assertEquals("OFFER_ID", pair.getKey()[0]);
Assert.assertEquals("GROUP_ID", pair.getKey()[1]);
Assert.assertEquals(1, pair.getValue().length);
Assert.assertEquals(2, pair.getValue()[0].length);
Assert.assertEquals(123L, pair.getValue()[0][0]);
Assert.assertEquals("3c", pair.getValue()[0][1]);
Assert.assertNull(hint.getDataNodes());
sql = "/*!cobar:$partitionOperand=(['offer_id' , 'group_iD' ]=[ 123 , '3c' ]) ,$table = 'offer'*/ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals((int) RouteResultsetNode.DEFAULT_REPLICA_INDEX, hint.getReplica());
pair = hint.getPartitionOperand();
Assert.assertEquals(2, pair.getKey().length);
Assert.assertEquals("OFFER_ID", pair.getKey()[0]);
Assert.assertEquals("GROUP_ID", pair.getKey()[1]);
Assert.assertEquals(1, pair.getValue().length);
Assert.assertEquals(2, pair.getValue()[0].length);
Assert.assertEquals(123L, pair.getValue()[0][0]);
Assert.assertEquals("3c", pair.getValue()[0][1]);
Assert.assertNull(hint.getDataNodes());
sql = "/*!cobar:$partitionOperand=(['offer_id','group_id']=[123,'3c']),$table='offer'*/ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals((int) RouteResultsetNode.DEFAULT_REPLICA_INDEX, hint.getReplica());
pair = hint.getPartitionOperand();
Assert.assertEquals(2, pair.getKey().length);
Assert.assertEquals("OFFER_ID", pair.getKey()[0]);
Assert.assertEquals("GROUP_ID", pair.getKey()[1]);
Assert.assertEquals(1, pair.getValue().length);
Assert.assertEquals(2, pair.getValue()[0].length);
Assert.assertEquals(123L, pair.getValue()[0][0]);
Assert.assertEquals("3c", pair.getValue()[0][1]);
Assert.assertNull(hint.getDataNodes());
sql = "/*!cobar:$partitionOperand=(['offer_id','group_id']=[[123,'3c'],[234,'food']]), $table='offer'*/ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals((int) RouteResultsetNode.DEFAULT_REPLICA_INDEX, hint.getReplica());
pair = hint.getPartitionOperand();
Assert.assertEquals(2, pair.getKey().length);
Assert.assertEquals("OFFER_ID", pair.getKey()[0]);
Assert.assertEquals("GROUP_ID", pair.getKey()[1]);
Assert.assertEquals(2, pair.getValue().length);
Assert.assertEquals(2, pair.getValue()[0].length);
Assert.assertEquals(2, pair.getValue()[1].length);
Assert.assertEquals(123L, pair.getValue()[0][0]);
Assert.assertEquals("3c", pair.getValue()[0][1]);
Assert.assertEquals(234L, pair.getValue()[1][0]);
Assert.assertEquals("food", pair.getValue()[1][1]);
Assert.assertNull(hint.getDataNodes());
sql = "/*!cobar:$partitionOperand= ( [ 'ofFER_id','groUp_id' ]= [ [123,'3c'],[ 234,'food']] ), $table='offer'*/select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals("select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals((int) RouteResultsetNode.DEFAULT_REPLICA_INDEX, hint.getReplica());
pair = hint.getPartitionOperand();
Assert.assertEquals(2, pair.getKey().length);
Assert.assertEquals("OFFER_ID", pair.getKey()[0]);
Assert.assertEquals("GROUP_ID", pair.getKey()[1]);
Assert.assertEquals(2, pair.getValue().length);
Assert.assertEquals(2, pair.getValue()[0].length);
Assert.assertEquals(2, pair.getValue()[1].length);
Assert.assertEquals(123L, pair.getValue()[0][0]);
Assert.assertEquals("3c", pair.getValue()[0][1]);
Assert.assertEquals(234L, pair.getValue()[1][0]);
Assert.assertEquals("food", pair.getValue()[1][1]);
Assert.assertNull(hint.getDataNodes());
sql = "/*!cobar:$partitionOperand=(['offer_id']=[123,234]), $table='offer'*/ select * ";
hint = CobarHint.parserCobarHint(sql, 0);
Assert.assertEquals(" select * ", hint.getOutputSql());
Assert.assertEquals("OFFER", hint.getTable());
Assert.assertEquals((int) RouteResultsetNode.DEFAULT_REPLICA_INDEX, hint.getReplica());
pair = hint.getPartitionOperand();
Assert.assertEquals(1, pair.getKey().length);
Assert.assertEquals("OFFER_ID", pair.getKey()[0]);
Assert.assertEquals(2, pair.getValue().length);
Assert.assertEquals(1, pair.getValue()[0].length);
Assert.assertEquals(1, pair.getValue()[1].length);
Assert.assertEquals(123L, pair.getValue()[0][0]);
Assert.assertEquals(234L, pair.getValue()[1][0]);
Assert.assertNull(hint.getDataNodes());
}
}