package com.tesora.dve.db.mysql.libmy; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import com.tesora.dve.db.mysql.MyFieldType; import com.tesora.dve.db.mysql.common.DBTypeBasedUtils; import com.tesora.dve.db.mysql.common.DataTypeValueFunc; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import org.junit.Before; import org.junit.Test; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.*; public class MyBinaryResultRowTest { ByteBuf rawRow; MyBinaryResultRow origRow; @Before public void setUp() throws Exception { rawRow = Unpooled.buffer().order(ByteOrder.LITTLE_ENDIAN); rawRow.writeZero(1);//bin row marker. MyNullBitmap bitmap = new MyNullBitmap(5, MyNullBitmap.BitmapType.RESULT_ROW); bitmap.setBit(2);//one based indexing, so second field is null rawRow.writeBytes(bitmap.getBitmapArray()); List<DecodedMeta> fieldConvertors = new ArrayList<>(); { DataTypeValueFunc mysqlTypeFunc = DBTypeBasedUtils.getMysqlTypeFunc(MyFieldType.FIELD_TYPE_LONG); mysqlTypeFunc.writeObject(rawRow, 45); fieldConvertors.add(new DecodedMeta(mysqlTypeFunc)); } { DataTypeValueFunc mysqlTypeFunc = DBTypeBasedUtils.getMysqlTypeFunc(MyFieldType.FIELD_TYPE_LONG); //nothing in packet, this was null. fieldConvertors.add(new DecodedMeta(mysqlTypeFunc)); } { DataTypeValueFunc mysqlTypeFunc = DBTypeBasedUtils.getMysqlTypeFunc(MyFieldType.FIELD_TYPE_VARCHAR); mysqlTypeFunc.writeObject(rawRow, "one"); fieldConvertors.add(new DecodedMeta(mysqlTypeFunc)); } { DataTypeValueFunc mysqlTypeFunc = DBTypeBasedUtils.getMysqlTypeFunc(MyFieldType.FIELD_TYPE_VARCHAR); mysqlTypeFunc.writeObject(rawRow, "two"); fieldConvertors.add(new DecodedMeta(mysqlTypeFunc)); } { DataTypeValueFunc mysqlTypeFunc = DBTypeBasedUtils.getMysqlTypeFunc(MyFieldType.FIELD_TYPE_VARCHAR); mysqlTypeFunc.writeObject(rawRow, "three"); fieldConvertors.add(new DecodedMeta(mysqlTypeFunc)); } origRow = new MyBinaryResultRow(fieldConvertors); origRow.unmarshallMessage(rawRow); } @Test public void testProjection_Identity() throws Exception { MyBinaryResultRow fullProj = origRow.projection(new int[]{0, 1, 2, 3, 4}); //check that the sizes are the same. assertEquals(origRow.size(), fullProj.size()); ByteBuf marshallProj = Unpooled.buffer().order(ByteOrder.LITTLE_ENDIAN); fullProj.marshallMessage(marshallProj); //check that the raw bytes are byte for byte equal. for (int i=0;i<rawRow.readableBytes();i++){ assertEquals( "byte at index="+i, rawRow.getByte(i), marshallProj.getByte(i)); } //check that all the slices are byte for byte equal. for (int i = 0; i < origRow.size(); i++) { assertEquals(origRow.getSlice(i), fullProj.getSlice(i)); } //check that the decoded objects are equal for (int i = 0; i < origRow.size(); i++) { assertEquals(origRow.getValue(i), fullProj.getValue(i)); } } @Test public void testProjection_Simple() throws Exception { { MyBinaryResultRow firstProj = origRow.projection(new int[]{0, 1}); assertEquals(2, firstProj.size()); assertEquals(45, firstProj.getValue(0)); assertEquals(null, firstProj.getValue(1)); } { MyBinaryResultRow secondProj = origRow.projection(new int[]{0, 3, 4}); assertEquals(3, secondProj.size()); assertEquals(45, secondProj.getValue(0)); assertEquals("two", secondProj.getValue(1)); assertEquals("three", secondProj.getValue(2)); } } }