/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.transformation.metadata; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import junit.extensions.TestSetup; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.teiid.core.util.SmartTestDesignerSuite; import org.teiid.designer.core.index.AbstractIndexSelector; import org.teiid.designer.core.index.FileDocument; import org.teiid.designer.core.index.IDocument; import org.teiid.designer.core.index.IEntryResult; import org.teiid.designer.core.index.IIndexer; import org.teiid.designer.core.index.IIndexerOutput; import org.teiid.designer.core.index.IQueryResult; import org.teiid.designer.core.index.Index; import org.teiid.designer.core.index.IndexConstants; import org.teiid.designer.core.index.IndexViewer; import org.teiid.designer.core.index.WordEntry; import org.teiid.designer.core.metadata.runtime.FakeSqlColumnAspect; import org.teiid.designer.core.metadata.runtime.FakeSqlModelAspect; import org.teiid.designer.core.metadata.runtime.FakeSqlTableAspect; import org.teiid.designer.core.metadata.runtime.RuntimeAdapter; import org.teiid.designer.metadata.runtime.ColumnRecord; import org.teiid.designer.metadata.runtime.MetadataRecord; import org.teiid.designer.metadata.runtime.TableRecord; import org.teiid.designer.query.metadata.IQueryMetadataInterface; /** * TestTransformationMetadata */ public class TestTransformationMetadata extends TestCase { private static final List WORD_ENTRIES = new ArrayList(7); private static final String TEST_INDEX_FILE_NAME = "test.INDEX"; //$NON-NLS-1$ private static final String TEST_INDEX_DIRECTORY_PATH = SmartTestDesignerSuite.getTestDataPath(TestTransformationMetadata.class); private static final String TEST_INDEX_FILE_PATH = TEST_INDEX_DIRECTORY_PATH + File.separator + TEST_INDEX_FILE_NAME; private static final String FAKE_FILE_PATH = SmartTestDesignerSuite.getTestDataPath(TestTransformationMetadata.class) + File.separator + "PartsSupplierVirtual.vdb"; //$NON-NLS-1$ /** * Constructor for TestTransformationMetadata. * * @param name */ public TestTransformationMetadata( String name ) { super(name); } /** * Construct the test suite, which uses a one-time setup call and a one-time tear-down call. */ public static Test suite() { TestSuite suite = new TestSuite("TestTransformationMetadata"); //$NON-NLS-1$ suite.addTestSuite(TestTransformationMetadata.class); return new TestSetup(suite) { // junit.extensions package // One-time setup and teardown @Override public void setUp() throws Exception { oneTimeSetUp(); } @Override public void tearDown() { oneTimeTearDown(); } }; } public static void main( String args[] ) { junit.textui.TestRunner.run(suite()); System.exit(0); } @Override protected void setUp() throws Exception { } @Override protected void tearDown() throws Exception { } public static void oneTimeSetUp() { helpCreateIndexFile(); } public static void oneTimeTearDown() { // Delete the index file used for testing final File testIndexFile = new File(TEST_INDEX_FILE_PATH); testIndexFile.delete(); } private static void helpCreateIndexFile() { // Create the index System.out.println(TEST_INDEX_FILE_PATH); final File indexDirectory = new File(TEST_INDEX_DIRECTORY_PATH); // create all index files needed for tests String[] indexes = new String[] {TEST_INDEX_FILE_NAME, IndexConstants.INDEX_NAME.TABLES_INDEX, IndexConstants.INDEX_NAME.COLUMNS_INDEX}; for (int i = 0; i < indexes.length; ++i) { Index index = null; try { index = new Index(indexDirectory, indexes[i], false); } catch (Throwable t) { t.printStackTrace(System.err); } assertNotNull(index); final IDocument doc = new TestDocument(FAKE_FILE_PATH); try { index.add(doc, new TestIndexer()); } catch (Throwable t) { t.printStackTrace(System.err); } // Save the index file try { index.save(); assertEquals(1, index.getNumDocuments()); } catch (Throwable t) { t.printStackTrace(System.err); } } } public static char[] helpCreateModelWord( String name, String alias, String path, String uuid, boolean supportsOrderBy, boolean supportsOuterJoin, boolean supportsWhereAll, boolean supportsDistinct, boolean supportsJoin, boolean isVisible, int maxSetSize ) { FakeSqlModelAspect aspect = new FakeSqlModelAspect(); aspect.fullName = path.replace(IPath.SEPARATOR, IndexConstants.NAME_DELIM_CHAR); aspect.name = name; aspect.nameInSource = alias; aspect.path = new Path(path); aspect.uuid = uuid; aspect.supportsOrderBy = supportsOrderBy; aspect.supportsOuterJoin = supportsOuterJoin; aspect.supportsWhereAll = supportsWhereAll; aspect.supportsDistinct = supportsDistinct; aspect.supportsJoin = supportsJoin; aspect.isVisible = isVisible; aspect.maxSetSize = maxSetSize; WORD_ENTRIES.clear(); RuntimeAdapter.addModelWord(aspect, null, null, WORD_ENTRIES); WordEntry word = (WordEntry)WORD_ENTRIES.get(0); System.out.println("word = " + word); //$NON-NLS-1$ return word.getWord(); } public static char[] helpCreateTableWord( String name, String alias, String path, String uuid, String pkID, String[] columnIDs, String[] foreignKeyIDs) { FakeSqlTableAspect aspect = new FakeSqlTableAspect(); aspect.name = name; aspect.nameInSource = alias; aspect.fullName = path.replace(IPath.SEPARATOR, IndexConstants.NAME_DELIM_CHAR); aspect.path = new Path(path); aspect.uuid = uuid; aspect.primaryKey = pkID; aspect.columns = Arrays.asList(columnIDs); aspect.foreignKeys = Arrays.asList(foreignKeyIDs); WORD_ENTRIES.clear(); RuntimeAdapter.addTableWord(aspect, null, null, null, WORD_ENTRIES); WordEntry word = (WordEntry)WORD_ENTRIES.get(0); System.out.println("word = " + word); //$NON-NLS-1$ return word.getWord(); } public static char[] helpCreateColumnWord( String name, String alias, String path, String uuid, String datatypeName, boolean selectable, boolean updatable, int nullType ) { FakeSqlColumnAspect aspect = new FakeSqlColumnAspect(); aspect.name = name; aspect.fullName = path.replace(IPath.SEPARATOR, IndexConstants.NAME_DELIM_CHAR); aspect.nameInSource = alias; aspect.path = new Path(path); aspect.uuid = uuid; aspect.datatypeName = datatypeName; aspect.selectable = selectable; aspect.updatable = updatable; aspect.nullType = nullType; WORD_ENTRIES.clear(); RuntimeAdapter.addColumnWord(aspect, null, null, WORD_ENTRIES); WordEntry word = (WordEntry)WORD_ENTRIES.get(0); System.out.println("word = " + word); //$NON-NLS-1$ return word.getWord(); } public void helpCheckQueryResults( IQueryResult[] results ) { assertNotNull(results); for (int i = 0; i < results.length; i++) { IQueryResult result = results[i]; assertNotNull(result); } } public void helpCheckQueryResults( IEntryResult[] results, char expectedRecordType ) { assertNotNull(results); for (int i = 0; i < results.length; i++) { IEntryResult result = results[i]; assertNotNull(result); assertEquals(expectedRecordType, result.getWord()[0]); } } public void helpCheckQueryResults( Object result, char expectedRecordType ) { assertNotNull(result); if (result instanceof MetadataRecord) { final MetadataRecord record = (MetadataRecord)result; assertEquals(expectedRecordType, record.getRecordType()); } else if (result instanceof Collection) { final Collection results = (Collection)result; System.out.println("\nMetadataRecords.size() = " + results.size()); //$NON-NLS-1$ for (Iterator iter = results.iterator(); iter.hasNext();) { Object obj = iter.next(); assertNotNull(obj); if (obj instanceof MetadataRecord) { MetadataRecord record = (MetadataRecord)obj; assertEquals(expectedRecordType, record.getRecordType()); } } } } public void printQueryResults( IQueryResult[] results ) { System.out.println("\nIQueryResult[].length = " + (results == null ? "null" : Integer.toString(results.length))); //$NON-NLS-1$ //$NON-NLS-2$ if (results != null) { for (int i = 0; i < results.length; i++) { System.out.println(" IQueryResult[] = " + results[i]); //$NON-NLS-1$ } } } public void printQueryResults( IEntryResult[] results ) { System.out.println("\nIEntryResult[].length = " + (results == null ? "null" : Integer.toString(results.length))); //$NON-NLS-1$ //$NON-NLS-2$ if (results != null) { for (int i = 0; i < results.length; i++) { System.out.println(" IEntryResult[] = " + results[i]); //$NON-NLS-1$ } } } public void printQueryResults( Object result ) { if (result == null) { System.out.println("\nMetadataRecord = null"); //$NON-NLS-1$ } else if (result instanceof MetadataRecord) { final MetadataRecord record = (MetadataRecord)result; System.out.println("\nMetadataRecord = " + record); //$NON-NLS-1$ } else if (result instanceof Collection) { final Collection results = (Collection)result; System.out.println("\nMetadataRecords.size() = " + results.size()); //$NON-NLS-1$ for (Iterator iter = results.iterator(); iter.hasNext();) { Object obj = iter.next(); if (obj instanceof MetadataRecord) { MetadataRecord record = (MetadataRecord)obj; System.out.println(" MetadataRecord = " + record); //$NON-NLS-1$ } else { System.out.println(" MetadataRecord = " + obj); //$NON-NLS-1$ } } } } public void printIndexFile() throws Exception { final File indexDirectory = new File(TEST_INDEX_DIRECTORY_PATH); Index index = new Index(indexDirectory, TEST_INDEX_FILE_NAME, true); String content = IndexViewer.getStringContent(index); System.out.println(content); } public void testCreate1() { System.out.println("\nTestTransformationMetadata.testCreate1()"); //$NON-NLS-1$ } public void testQueryIndexFile() throws Exception { System.out.println("\nTestTransformationMetadata.testQueryIndexFile()"); //$NON-NLS-1$ System.out.println(TEST_INDEX_FILE_PATH); final File indexDirectory = new File(TEST_INDEX_DIRECTORY_PATH); Index index = null; index = new Index(indexDirectory, TEST_INDEX_FILE_NAME, true); assertEquals(1, index.getNumDocuments()); String word = IndexConstants.RECORD_TYPE.TABLE + "*table1*"; //$NON-NLS-1$ char[] charWord = word.toCharArray(); IEntryResult[] results = index.queryEntriesMatching(charWord, true); helpCheckQueryResults(results, IndexConstants.RECORD_TYPE.TABLE); printQueryResults(results); word = IndexConstants.RECORD_TYPE.COLUMN + "*columnAlias1B*"; //$NON-NLS-1$ charWord = word.toCharArray(); results = index.queryEntriesMatching(charWord, true); helpCheckQueryResults(results, IndexConstants.RECORD_TYPE.COLUMN); printQueryResults(results); // fixed case sensitive look up with patterns word = IndexConstants.RECORD_TYPE.COLUMN + "*column*"; //$NON-NLS-1$ charWord = word.toCharArray(); results = index.queryEntriesMatching(charWord, true); helpCheckQueryResults(results, IndexConstants.RECORD_TYPE.COLUMN); printQueryResults(results); assertNotNull(index); } public void testQueryTransformationMetadata() throws Exception { System.out.println("\nTestTransformationMetadata.testQueryTransformationMetadata()"); //$NON-NLS-1$ final TestIndexSelector selector = new TestIndexSelector(IndexConstants.INDEX_NAME.COLUMNS_INDEX); selector.addIndexFileName(IndexConstants.INDEX_NAME.TABLES_INDEX); QueryMetadataContext context = new QueryMetadataContext(selector); IQueryMetadataInterface queryMetadata = new TestMetadata(context); Object result = queryMetadata.getGroupID("model1.table1"); //$NON-NLS-1$ assertNotNull(result); assertTrue(result instanceof TableRecord); assertEquals("table1", ((TableRecord)result).getName()); //$NON-NLS-1$ helpCheckQueryResults(result, IndexConstants.RECORD_TYPE.TABLE); printQueryResults(result); result = queryMetadata.getElementID("model1.table1.column1C"); //$NON-NLS-1$ assertNotNull(result); assertTrue(result instanceof ColumnRecord); assertEquals("column1C", ((ColumnRecord)result).getName()); //$NON-NLS-1$ helpCheckQueryResults(result, IndexConstants.RECORD_TYPE.COLUMN); printQueryResults(result); } public void testQueryTransformationMetadataForAllRecords() throws Exception { System.out.println("\nTestTransformationMetadata.testQueryTransformationMetadataForAllRecords()"); //$NON-NLS-1$ final TestIndexSelector selector = new TestIndexSelector(IndexConstants.INDEX_NAME.COLUMNS_INDEX); selector.addIndexFileName(IndexConstants.INDEX_NAME.TABLES_INDEX); QueryMetadataContext context = new QueryMetadataContext(selector); IQueryMetadataInterface queryMetadata = new TestMetadata(context); printIndexFile(); assertNotNull(queryMetadata.getGroupID("model1.table1")); //$NON-NLS-1$ assertNotNull(queryMetadata.getGroupID("model2.table2")); //$NON-NLS-1$ assertNotNull(queryMetadata.getGroupID("model2.table3")); //$NON-NLS-1$ assertNotNull(queryMetadata.getElementID("model1.table1.column1A")); //$NON-NLS-1$ assertNotNull(queryMetadata.getElementID("model1.table1.column1B")); //$NON-NLS-1$ assertNotNull(queryMetadata.getElementID("model1.table1.column1C")); //$NON-NLS-1$ assertNotNull(queryMetadata.getElementID("model2.table1.column2A")); //$NON-NLS-1$ assertNotNull(queryMetadata.getElementID("model2.table1.column2B")); //$NON-NLS-1$ assertNotNull(queryMetadata.getElementID("model2.table1.column2C")); //$NON-NLS-1$ } static class TestIndexer implements IIndexer { @Override public String[] getFileTypes() { return null; } @Override public void index( IDocument document, IIndexerOutput output ) { output.addDocument(document); if (document instanceof TestDocument) { output.addRef(helpCreateModelWord("model1", "modelAlias1", "model1", "mmuuid:id1", true, true, true, true, true, true, 10)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ output.addRef(helpCreateModelWord("model2", "modelAlias2", "model2", "mmuuid:id2", true, false, true, false, true, false, 5)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ output.addRef(helpCreateTableWord("table1", "tableAlias1", "model1/table1", "mmuuid:id3", "mmuuid:pk1", new String[] {"mmuuid:id5,mmuuid:id6,mmuuid:id7"}, new String[0])); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ output.addRef(helpCreateTableWord("table2", "tableAlias2", "model2/table2", "mmuuid:id4", "mmuuid:pk2", new String[] {"mmuuid:id8,mmuuid:id9,mmuuid:id10"}, new String[0])); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ output.addRef(helpCreateTableWord("table3", "tableAlias3", "model2/table3", "mmuuid:id11", "mmuuid:pk3", new String[0], new String[0])); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ output.addRef(helpCreateColumnWord("column1A", "columnAlias1A", "model1/table1/column1A", "mmuuid:id5", "String", true, true, 1)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ output.addRef(helpCreateColumnWord("column1B", "columnAlias1B", "model1/table1/column1B", "mmuuid:id6", "String", true, true, 1)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ output.addRef(helpCreateColumnWord("column1C", "columnAlias1C", "model1/table1/column1C", "mmuuid:id7", "String", true, true, 1)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ output.addRef(helpCreateColumnWord("column2A", "columnAlias2A", "model2/table1/column2A", "mmuuid:id8", "String", true, true, 1)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ output.addRef(helpCreateColumnWord("column2B", "columnAlias2B", "model2/table1/column2B", "mmuuid:id9", "String", true, true, 1)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ output.addRef(helpCreateColumnWord("column2C", "columnAlias2C", "model2/table1/column2C", "mmuuid:id10", "String", true, true, 1)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ } } @Override public void setFileTypes( String[] fileTypes ) { } @Override public boolean shouldIndex( IDocument document ) { return true; } } private static class TestDocument extends FileDocument { public TestDocument( String filePath ) { super(new File(filePath)); } } private static class TestIndexSelector extends AbstractIndexSelector { List indexNames = new ArrayList(); public TestIndexSelector( String theIndexFileName ) { addIndexFileName(theIndexFileName); } public void addIndexFileName( String theFileName ) { indexNames.add(theFileName); } @Override public Index[] getIndexes() throws IOException { final File indexDirectory = new File(TEST_INDEX_DIRECTORY_PATH); Index[] indexes = new Index[this.indexNames.size()]; for (int i = 0; i < indexes.length; ++i) { Index index = new Index(indexDirectory, (String)this.indexNames.get(i), true); assertNotNull(index); assertEquals(1, index.getNumDocuments()); indexes[i] = index; } return indexes; } } private class TestMetadata extends TransformationMetadata { public TestMetadata( QueryMetadataContext context ) { super(context); } } }