/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.translator.coherence; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.teiid.cdk.api.ConnectorHost; import org.teiid.cdk.api.TranslationUtility; import org.teiid.core.types.DataTypeManager; import org.teiid.core.util.UnitTestUtil; import org.teiid.metadata.Column; import org.teiid.metadata.ForeignKey; import org.teiid.metadata.KeyRecord; import org.teiid.metadata.KeyRecord.Type; import org.teiid.metadata.MetadataStore; import org.teiid.metadata.Schema; import org.teiid.metadata.Table; import org.teiid.query.mapping.relational.QueryNode; import org.teiid.query.metadata.QueryMetadataInterface; import org.teiid.query.unittest.RealMetadataFactory; import org.teiid.resource.adapter.coherence.CoherenceConnection; import org.teiid.resource.adapter.coherence.CoherenceManagedConnectionFactory; public class TestCoherenceTranslator extends TestCase { public static final String OBJECT_TRANSLATOR = "org.teiid.translator.coherence.TradesCacheSource"; public static QueryMetadataInterface metadata = null; protected ConnectorHost host = null; @Override protected void setUp() throws Exception { // TODO Auto-generated method stub super.setUp(); new TradesCacheSource().addMetadata(); CoherenceManagedConnectionFactory connFactory = new CoherenceManagedConnectionFactory(); connFactory.setCacheName(TradesCacheSource.CACHE_NAME); connFactory.setCacheTranslatorClassName(OBJECT_TRANSLATOR); CoherenceConnection conn = (CoherenceConnection) connFactory.createConnectionFactory().getConnection(); CoherenceExecutionFactory execFactory = new CoherenceExecutionFactory(); host = new ConnectorHost(execFactory, conn, //getTradeTranslationUtility()); UnitTestUtil.getTestDataPath() + "/Coherence_Designer_Project/Trade.vdb"); } @Override protected void tearDown() throws Exception { // TODO Auto-generated method stub super.tearDown(); host = null; } public void testInsertAndDelete() throws Exception { StringBuilder tradeSQL = new StringBuilder(); tradeSQL.append("INSERT INTO Trade_Object.Trade (tradeid, name) VALUES ("); tradeSQL.append(99); tradeSQL.append(","); tradeSQL.append(" 'TradeName "); tradeSQL.append(99); tradeSQL.append("')"); host.executeCommand(tradeSQL.toString()); List actualResults = host.executeCommand("select * From Trade_Object.Trade where Trade_Object.Trade.TradeID = 99"); //tradeid, name // Compare actual and expected results // should get back the 10 legs for each trade (3) totaling 30 assertEquals("Did not get expected number of rows", 1, actualResults.size()); //$NON-NLS-1$ // tradeSQL = new StringBuilder(); // // tradeSQL.append("INSERT INTO Trade_Object.Leg (tradeid, LegID, name, Notational) VALUES ("); // tradeSQL.append(99); // tradeSQL.append(","); // tradeSQL.append(1); // tradeSQL.append(","); // tradeSQL.append(" 'Leg "); // tradeSQL.append(1); // tradeSQL.append("',"); // tradeSQL.append(1.24); // tradeSQL.append(")"); // // System.out.println(tradeSQL.toString()); // host.executeCommand(tradeSQL.toString()); // // tradeSQL = new StringBuilder(); // // tradeSQL.append("INSERT INTO Trade_Object.Leg (tradeid, LegID, name, Notational) VALUES ("); // tradeSQL.append(99); // tradeSQL.append(","); // tradeSQL.append(2); // tradeSQL.append(","); // tradeSQL.append(" 'Leg "); // tradeSQL.append(2); // tradeSQL.append("',"); // tradeSQL.append(2.48); // tradeSQL.append(")"); // // System.out.println(tradeSQL.toString()); // host.executeCommand(tradeSQL.toString()); // actualResults = host.executeCommand( // "SELECT Trade_Object.Trade.TradeID, Trade_Object.Trade.Name, Trade_Object.Leg.LegID, Trade_Object.Leg.Notational, Trade_Object.Leg.Name AS LegName " + // " FROM Trade_Object.Trade, Trade_Object.Leg " + // "WHERE Trade_Object.Trade.TradeID = Trade_Object.Leg.TradeID and Trade_Object.Trade.TradeID = 99"); // // assertEquals("Did not get expected number of rows", 2, actualResults.size()); //$NON-NLS-1$ actualResults = host.executeCommand("DELETE FROM Trade_Object.Trade Where Trade_Object.Trade.TradeID = 99"); actualResults = host.executeCommand("select * From Trade_Object.Trade where Trade_Object.Trade.TradeID = 99"); //tradeid, name // Compare actual and expected results // should get back the 10 legs for each trade (3) totaling 30 assertEquals("Did not get expected number of rows", 0, actualResults.size()); //$NON-NLS-1$ } // public void testUpdateChildOfExisingParent() throws Exception { // StringBuilder tradeSQL = new StringBuilder(); // // // tradeSQL.append("INSERT INTO Trade_Object.Leg (tradeid, LegID, name, Notational) VALUES ("); // tradeSQL.append(99); // tradeSQL.append(","); // tradeSQL.append(1); // tradeSQL.append(","); // tradeSQL.append(" 'Leg "); // tradeSQL.append(1); // tradeSQL.append("',"); // tradeSQL.append(1.24); // tradeSQL.append(")"); //// //// System.out.println(tradeSQL.toString()); //// host.executeCommand(tradeSQL.toString()); // host.executeCommand(tradeSQL.toString()); // } /** * This will instantiate the {@link CoherenceManagedConnectionFactory} and * obtain a connection to * * @throws Exception */ public void testGet1TradeWith10Legs() throws Exception { List<List> actualResults = host.executeCommand( "SELECT Trade_Object.Trade.TradeID, Trade_Object.Trade.Name, Trade_Object.Leg.LegID, Trade_Object.Leg.Notational, Trade_Object.Leg.Name AS LegName " + " FROM Trade_Object.Trade, Trade_Object.Leg " + "WHERE Trade_Object.Trade.TradeID = Trade_Object.Leg.TradeID "); // "SELECT * FROM Trade.Trad " + // " WHERE Trade.Trade.TradeID = Trade.Trade.TradeID"); //"select tradeid, name, LegId, notational From Trade_View.Trades where tradeid = 1"); for (Iterator it=actualResults.iterator(); it.hasNext();) { List row = (List) it.next(); // System.out.println("ActualResults Columns #: " + row.size()); for (Iterator rowit=row.iterator(); rowit.hasNext();) { Object actualValue = rowit.next(); // System.out.println("Result value type: " + actualValue.getClass().getName() + " value: " + actualValue); } } // Compare actual and expected results // should get back the 10 legs associated with the trade assertEquals("Did not get expected number of rows", 30, actualResults.size()); //$NON-NLS-1$ } public void testGetAllTrades() throws Exception { List actualResults = host.executeCommand("select * From Trade_Object.Trade"); //tradeid, name // Compare actual and expected results // should get back the 10 legs for each trade (3) totaling 30 assertEquals("Did not get expected number of rows", 3, actualResults.size()); //$NON-NLS-1$ } public void testTradesAndLegsWhereTradeLessThanGreatThan() throws Exception { String prefix = "SELECT Trade_Object.Trade.TradeID, Trade_Object.Trade.Name, Trade_Object.Leg.LegID, Trade_Object.Leg.Notational, Trade_Object.Leg.Name AS LegName " + " FROM Trade_Object.Trade, Trade_Object.Leg " + "WHERE Trade_Object.Trade.TradeID = Trade_Object.Leg.TradeID and "; List actualResults = host.executeCommand(prefix + "Trade_Object.Trade.TradeID > 2"); assertEquals("Did not get expected number of rows", 10, actualResults.size()); //$NON-NLS-1$ actualResults = host.executeCommand(prefix + "Trade_Object.Trade.TradeID < 3"); assertEquals("Did not get expected number of rows", 20, actualResults.size()); //$NON-NLS-1$ actualResults = host.executeCommand(prefix + "Trade_Object.Trade.TradeID <= 3"); assertEquals("Did not get expected number of rows", 30, actualResults.size()); //$NON-NLS-1$ actualResults = host.executeCommand(prefix + "Trade_Object.Trade.TradeID >= 1"); assertEquals("Did not get expected number of rows", 30, actualResults.size()); //$NON-NLS-1$ actualResults = host.executeCommand(prefix + "Trade_Object.Trade.TradeID < 1"); assertEquals("Did not get expected number of rows", 0, actualResults.size()); //$NON-NLS-1$ } public void testLikeTradesWithLegs() throws Exception { String prefix = "SELECT Trade_Object.Trade.TradeID, Trade_Object.Trade.Name, Trade_Object.Leg.LegID, Trade_Object.Leg.Notational, Trade_Object.Leg.Name AS LegName " + " FROM Trade_Object.Trade, Trade_Object.Leg " + "WHERE Trade_Object.Trade.TradeID = Trade_Object.Leg.TradeID and "; List actualResults = host.executeCommand(prefix + " Trade_Object.Trade.Name like 'Trade%' "); // Compare actual and expected results // should get back the 10 legs for each trade (3) totaling 30 assertEquals("Did not get expected number of rows", 30, actualResults.size()); //$NON-NLS-1$ actualResults = host.executeCommand(prefix + " Trade_Object.Trade.Name like '%2%' "); // Compare actual and expected results // should get back the 10 legs for each trade (3) totaling 30 assertEquals("Did not get expected number of rows", 10, actualResults.size()); //$NON-NLS-1$ } /** * this is used as an alternative to loading the vdb * @return */ private TranslationUtility getTradeTranslationUtility() { MetadataStore metadataStore = new MetadataStore(); // Create TRADE Schema trading = RealMetadataFactory.createPhysicalModel("Trade_Object", metadataStore); //$NON-NLS-1$ // Create physical groups Table trade = RealMetadataFactory.createPhysicalGroup("TRADE", trading); //$NON-NLS-1$ trade.setNameInSource("org.teiid.translator.coherence.Trade"); // Create physical elements String[] elemNames = new String[] { "NAME", "TRADEID" //$NON-NLS-1$ //$NON-NLS-2$ }; String[] elemTypes = new String[] { DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.LONG }; List<Column> cols = RealMetadataFactory.createElements(trade, elemNames, elemTypes); // Set name in source on each column String[] nameInSource = new String[] { "Name", "TradeId" }; for(int i=0; i<nameInSource.length; i++) { cols.get(i).setNameInSource(nameInSource[i]); } List<Column> keys = new ArrayList(1); keys.add(cols.get(1)); KeyRecord trade_pk = RealMetadataFactory.createKey(Type.Primary, "TradeID_PK", trade, keys); // LEG Table leg = RealMetadataFactory.createPhysicalGroup("LEG", trading); //$NON-NLS-1$ leg.setNameInSource("org.teiid.translator.coherence.Leg"); // Create physical elements String[] legNames = new String[] { "LEGID", "NOTATIONAL", "NAME", "TRADEID" //$NON-NLS-1$ //$NON-NLS-2$ }; String[] legTypes = new String[] { DataTypeManager.DefaultDataTypes.LONG, DataTypeManager.DefaultDataTypes.DOUBLE, DataTypeManager.DefaultDataTypes.STRING, DataTypeManager.DefaultDataTypes.LONG }; List<Column> legcols = RealMetadataFactory.createElements(leg, legNames, legTypes); // Set name in source on each column String[] legnameInSource = new String[] { "LegId", "Notational", "Name", "TradeId" }; for(int i=0; i<legnameInSource.length; i++) { legcols.get(i).setNameInSource(legnameInSource[i]); } legcols.get(3).setSelectable(false); legcols.get(3).setUpdatable(false); List<Column> legkeys = new ArrayList(1); keys.add(legcols.get(0)); RealMetadataFactory.createKey(Type.Primary, "Leg_ID_PK", leg, legkeys); List<Column> foreignkey = new ArrayList(1); foreignkey.add(legcols.get(3)); ForeignKey fk = RealMetadataFactory.createForeignKey("TRADE_FK", leg, foreignkey, trade_pk); fk.setNameInSource("Legs"); fk.setParent(trade); // Set column-specific properties // cols.get(0).setSelectable(false); // cols.get(0).setSearchType(SearchType.Unsearchable); Schema tradeview = RealMetadataFactory.createVirtualModel("Trade_View", metadataStore); QueryNode qn = new QueryNode( "SELECT Trade_Object.Trade.TradeID, Trade_Object.Trade.Name, Trade_Object.Leg.LegID, Trade_Object.Leg.Notational, Trade_Object.Leg.Name AS LegName " + " FROM Trade_Object.Trade, Trade_Object.Leg " + "WHERE Trade_Object.Trade.TradeID = Trade_Object.Leg.TradeID " + "SELECT * FROM Trade.Trad " + " WHERE Trade.Trade.TradeID = Trade.Trade.TradeID"); Table trades = RealMetadataFactory.createVirtualGroup("Trades", tradeview, qn); return new TranslationUtility(RealMetadataFactory.createTransformationMetadata(metadataStore, "Trade")); } }