/* * ************************************************************************************* * Copyright (C) 2008 EsperTech, Inc. All rights reserved. * * http://esper.codehaus.org * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * * ************************************************************************************* */ package com.espertech.esper.epl.join.assemble; import junit.framework.TestCase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.Map; import java.util.HashMap; public class TestAssemblyStrategyTreeBuilder extends TestCase { public void testInvalidBuild() { // root stream out of bounds tryInvalidBuild(3, convert(new int[][] {{1, 2}, {}, {}}), new boolean[] {true, true, true}); tryInvalidBuild(-1, convert(new int[][] {{1, 2}, {}, {}}), new boolean[] {true, true, true}); // not matching outer-inner tryInvalidBuild(0, convert(new int[][] {{1, 2}, {}, {}}), new boolean[] {true, true}); // stream relationships not filled tryInvalidBuild(0, convert(new int[][] {{1, 2}}), new boolean[] {true, true, true}); // stream relationships duplicates tryInvalidBuild(0, convert(new int[][] {{1, 2}, {1}, {}}), new boolean[] {true, true}); tryInvalidBuild(0, convert(new int[][] {{1, 2}, {}, {2}}), new boolean[] {true, true, true}); // stream relationships out of range tryInvalidBuild(0, convert(new int[][] {{1, 3}, {}, {}}), new boolean[] {true, true}); // stream relationships missing stream tryInvalidBuild(0, convert(new int[][] {{1}, {}, {}}), new boolean[] {true, true}); } public void testValidBuildSimpleReqOpt() { BaseAssemblyNode node = AssemblyStrategyTreeBuilder.build(2, convert(new int[][] {{}, {0}, {1}}), new boolean[] {false, true, true}); RootRequiredAssemblyNode child1 = (RootRequiredAssemblyNode) node; assertEquals(2, child1.getStreamNum()); assertEquals(1, child1.getChildNodes().size()); assertEquals(null, child1.getParentAssembler()); BranchOptionalAssemblyNode child1_1 = (BranchOptionalAssemblyNode) child1.getChildNodes().get(0); assertEquals(1, child1_1.getStreamNum()); assertEquals(1, child1_1.getChildNodes().size()); assertEquals(child1, child1_1.getParentAssembler()); LeafAssemblyNode leaf1_2 = (LeafAssemblyNode) child1_1.getChildNodes().get(0); assertEquals(0, leaf1_2.getStreamNum()); assertEquals(0, leaf1_2.getChildNodes().size()); assertEquals(child1_1, leaf1_2.getParentAssembler()); } public void testValidBuildSimpleOptReq() { BaseAssemblyNode node = AssemblyStrategyTreeBuilder.build(2, convert(new int[][] {{}, {0}, {1}}), new boolean[] {true, false, true}); RootOptionalAssemblyNode child1 = (RootOptionalAssemblyNode) node; assertEquals(2, child1.getStreamNum()); assertEquals(1, child1.getChildNodes().size()); assertEquals(null, child1.getParentAssembler()); BranchRequiredAssemblyNode child1_1 = (BranchRequiredAssemblyNode) child1.getChildNodes().get(0); assertEquals(1, child1_1.getStreamNum()); assertEquals(1, child1_1.getChildNodes().size()); assertEquals(child1, child1_1.getParentAssembler()); LeafAssemblyNode leaf1_2 = (LeafAssemblyNode) child1_1.getChildNodes().get(0); assertEquals(0, leaf1_2.getStreamNum()); assertEquals(0, leaf1_2.getChildNodes().size()); assertEquals(child1_1, leaf1_2.getParentAssembler()); } public void testValidBuildCartesian() { BaseAssemblyNode node = AssemblyStrategyTreeBuilder.build(1, convert(new int[][] {{}, {0,2}, {}}), new boolean[] {false, true, false}); RootCartProdAssemblyNode top = (RootCartProdAssemblyNode) node; assertEquals(2, top.getChildNodes().size()); LeafAssemblyNode leaf1 = (LeafAssemblyNode) top.getChildNodes().get(0); assertEquals(0, leaf1.getStreamNum()); assertEquals(0, leaf1.getChildNodes().size()); assertEquals(top, leaf1.getParentAssembler()); LeafAssemblyNode leaf2 = (LeafAssemblyNode) top.getChildNodes().get(0); assertEquals(0, leaf2.getStreamNum()); assertEquals(0, leaf2.getChildNodes().size()); assertEquals(top, leaf2.getParentAssembler()); } private void tryInvalidBuild(int rootStream, Map<Integer, int[]> joinedPerStream, boolean[] isInnerPerStream) { try { AssemblyStrategyTreeBuilder.build(rootStream, joinedPerStream, isInnerPerStream); fail(); } catch (IllegalArgumentException ex) { log.debug(".tryInvalidBuild expected exception=" + ex); // expected } } private Map<Integer, int[]> convert(int[][] array) { Map<Integer, int[]> result = new HashMap<Integer, int[]>(); for (int i = 0; i < array.length; i++) { result.put(i, array[i]); } return result; } private static final Log log = LogFactory.getLog(TestAssemblyStrategyTreeBuilder.class); }