/* * 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. */ package org.apache.pig.test; import org.junit.Test; import org.apache.pig.impl.logicalLayer.parser.QueryParser; import org.apache.pig.impl.logicalLayer.FrontendException; import org.apache.pig.impl.logicalLayer.parser.ParseException; import org.apache.pig.impl.logicalLayer.schema.Schema; import org.apache.pig.data.DataType; import java.io.ByteArrayInputStream; import junit.framework.TestCase; public class TestSchemaParser extends TestCase { @Test public void test1() throws ParseException, FrontendException { String test = "fieldA: int, fieldB:double,fieldC:bYteaRRay, fieldD:charARRAY"; Schema schema = parseSchema(test) ; assertEquals(schema.size(), 4) ; assertAliases(schema, "fieldA", "fieldB", "fieldC", "fieldD") ; assertTypes(schema, DataType.INTEGER, DataType.DOUBLE, DataType.BYTEARRAY, DataType.CHARARRAY); } @Test public void test2() throws ParseException, FrontendException { String test = "fieldA: bag {tuple1:tuple(a:int,b:long,c:float,d:double)}"; Schema schema = parseSchema(test) ; assertEquals(schema.size(), 1); assertEquals(schema.getField(0).type, DataType.BAG) ; assertEquals(schema.getField(0).alias, "fieldA") ; Schema inner = schema.getField(0).schema ; assertEquals(inner.size(), 1) ; assertAliases(inner.getField(0).schema, "a", "b", "c", "d") ; assertTypes(inner.getField(0).schema, DataType.INTEGER, DataType.LONG, DataType.FLOAT, DataType.DOUBLE); } @Test public void test3() throws ParseException, FrontendException { String test = "tuple1: tuple(a:chararray,b:long)," +" tuple2: tuple(c:int,d:float) "; Schema schema = parseSchema(test) ; assertEquals(schema.size(), 2); assertAliases(schema, "tuple1", "tuple2") ; assertTypes(schema, DataType.TUPLE, DataType.TUPLE); Schema inner1 = schema.getField(0).schema ; assertEquals(inner1.size(), 2); assertAliases(inner1, "a", "b") ; assertTypes(inner1, DataType.CHARARRAY, DataType.LONG); Schema inner2 = schema.getField(1).schema ; assertEquals(inner2.size(), 2); assertAliases(inner2, "c", "d") ; assertTypes(inner2, DataType.INTEGER, DataType.FLOAT) ; } @Test public void test4() throws ParseException, FrontendException { String test = "garage: bag{tuple1: tuple(num_tools: int)}, links: int"; Schema schema = parseSchema(test) ; // the schema assertEquals(schema.size(), 2) ; assertAliases(schema, "garage", "links") ; assertTypes(schema, DataType.BAG, DataType.INTEGER); assertEquals(schema.getField(0).type, DataType.BAG) ; // inner schema Schema inner = schema.getField(0).schema ; assertEquals(inner.size(), 1) ; assertEquals(inner.getField(0).type, DataType.TUPLE) ; assertEquals(inner.getField(0).alias, "tuple1") ; // inner of inner Schema innerInner = inner.getField(0).schema ; assertEquals(innerInner.size(), 1) ; assertEquals(innerInner.getField(0).type, DataType.INTEGER) ; } private void assertAliases(Schema schema, String... aliases) throws FrontendException { for(int i=0; i < aliases.length;i++) { assertEquals(schema.getField(i).alias, aliases[i]); } } private void assertTypes(Schema schema, byte... types) throws FrontendException { for(int i=0; i < types.length;i++) { assertEquals(schema.getField(i).type, types[i]); } } private Schema parseSchema(String schemaString) throws ParseException { ByteArrayInputStream stream = new ByteArrayInputStream(schemaString.getBytes()) ; QueryParser parser = new QueryParser(stream) ; return parser.TupleSchema() ; } }