protected RelNode optimizeLoopbackLink( RelOptCluster cluster, RelOptConnection connection, String[] actualName) throws SQLException { if (directory == null) { return null; } if (directory.server == null) { return null; } if ((directory.server.schemaName != null) && !directory.server.useSchemaNameAsForeignQualifier) { // Schema name should never be specified for a connection to // Farrago; if it is, bail. return null; } Connection loopbackConnection = directory.server.getConnection(); if (!(loopbackConnection instanceof FarragoJdbcEngineConnection)) { Connection conn = loopbackConnection; while ((conn != null) && (conn instanceof DelegatingConnection)) { conn = ((DelegatingConnection) conn).getDelegate(); } if (!(conn instanceof FarragoJdbcEngineConnection)) { return null; } } String catalogName = directory.server.catalogName; if (catalogName == null) { // No catalog name specified, so try to query the connection for // it. catalogName = loopbackConnection.getCatalog(); if (catalogName == null) { return null; } } if (actualName[0] == null) { actualName[0] = catalogName; } // REVIEW jvs 14-Aug-2006: Security security security. RelOptTable realTable = getPreparingStmt().getTableForMember(actualName); if (realTable == null) { return null; } return realTable.toRel(cluster, connection); }
// implement FarragoMedDataServer public FarragoMedColumnSet newColumnSet( String[] localName, Properties tableProps, FarragoTypeFactory typeFactory, RelDataType rowType, Map<String, Properties> columnPropMap) throws SQLException { if (rowType == null) { rowType = createMockRowType(typeFactory); } assert (rowType.getFieldList().size() == 1); RelDataType type = rowType.getFields()[0].getType(); assert (!type.isNullable()); assert (typeFactory.getClassForPrimitive(type) != null); // TODO jvs 5-Aug-2005: clean up usage of server properties // as defaults long nRows = -1; String rowCountSql = tableProps.getProperty(PROP_ROW_COUNT_SQL); if (rowCountSql != null) { // Attempt to issue a loopback query into Farrago to // get the number of rows to produce. DataSource loopbackDataSource = getLoopbackDataSource(); Connection connection = null; if (loopbackDataSource != null) { try { connection = loopbackDataSource.getConnection(); Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(rowCountSql); if (resultSet.next()) { nRows = resultSet.getLong(1); } } finally { // It's OK not to clean up stmt and resultSet; // connection.close() will do that for us. if (connection != null) { connection.close(); } } } } if (nRows == -1) { nRows = getLongProperty( tableProps, PROP_ROW_COUNT, getLongProperty(getProperties(), PROP_ROW_COUNT, 10)); } String executorImpl = tableProps.getProperty( PROP_EXECUTOR_IMPL, getProperties().getProperty(PROP_EXECUTOR_IMPL, PROPVAL_JAVA)); assert (executorImpl.equals(PROPVAL_JAVA) || executorImpl.equals(PROPVAL_FENNEL)); String udxSpecificName = tableProps.getProperty(PROP_UDX_SPECIFIC_NAME); if (udxSpecificName != null) { assert (executorImpl.equals(PROPVAL_JAVA)); } checkNameMatch(getForeignSchemaName(), tableProps.getProperty(PROP_SCHEMA_NAME)); checkNameMatch(getForeignTableName(), tableProps.getProperty(PROP_TABLE_NAME)); return new MedMockColumnSet(this, localName, rowType, nRows, executorImpl, udxSpecificName); }