Skip to content

Commit 4f2039a

Browse files
committed
rm extra dmv parser - mdx parser can do this , dmv is mdx statement
Signed-off-by: Stefan Bischof <[email protected]>
1 parent f616b3f commit 4f2039a

File tree

3 files changed

+68
-41
lines changed

3 files changed

+68
-41
lines changed

common/src/main/java/org/eclipse/daanse/olap/connection/ConnectionBase.java

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
import java.util.List;
2828
import java.util.Optional;
29-
import java.util.Set;
3029

3130
import org.eclipse.daanse.mdx.model.api.MdxStatement;
3231
import org.eclipse.daanse.mdx.parser.api.MdxParser;
@@ -112,31 +111,27 @@ public QueryComponent parseStatement(
112111

113112
MdxParser parser;
114113
try {
115-
parser = getContext().getMdxParserProvider().newParser(queryToParse, funTable.getPropertyWords());
116-
MdxStatement mdxStatement = parser.parseMdxStatement();
117-
return getQueryProvider().createQuery(statement, mdxStatement, strictValidation);
114+
parser = getContext().getMdxParserProvider().newParser(queryToParse, funTable.getPropertyWords());
115+
MdxStatement mdxStatement = parser.parseMdxStatement();
116+
return getQueryProvider().createQuery(statement, mdxStatement, strictValidation);
118117
} catch (MdxParserException mdxPE) {
119-
try {
120-
parser = getContext().getMdxParserProvider().newParser(queryToParse, Set.of());
121-
MdxStatement mdxStatement = parser.parseDMVStatement();
122-
return getQueryProvider().createQuery(statement, mdxStatement, strictValidation);
123-
} catch (MdxParserException mdxPE1) {
124-
Optional<SqlGuardFactory> oSqlGuardFactory = getContext().getSqlGuardFactory();
125-
if (oSqlGuardFactory.isEmpty()) {
118+
119+
Optional<SqlGuardFactory> oSqlGuardFactory = getContext().getSqlGuardFactory();
120+
if (oSqlGuardFactory.isEmpty()) {
121+
throw new FailedToParseQueryException(queryToParse, mdxPE);
122+
} else {
123+
List<DatabaseSchema> ds = (List<DatabaseSchema>) this.getCatalogReader().getDatabaseSchemas();
124+
org.eclipse.daanse.sql.guard.api.elements.DatabaseCatalog dc = new DatabaseCatalogImpl("", ds);
125+
SqlGuard guard = oSqlGuardFactory.get().create("", "", dc, List.of(), this.getContext().getDialect());
126+
// TODO add white list functions
127+
try {
128+
String sanetizedSql = guard.guard(queryToParse);
129+
return new SqlQueryImpl(sanetizedSql, getContext().getDataSource());
130+
} catch (UnparsableStatementGuardException uex) {
131+
// when can´t be parse then we decide to throw the exception of MDX
126132
throw new FailedToParseQueryException(queryToParse, mdxPE);
127-
} else {
128-
List<DatabaseSchema> ds = (List<DatabaseSchema>) this.getCatalogReader().getDatabaseSchemas();
129-
org.eclipse.daanse.sql.guard.api.elements.DatabaseCatalog dc = new DatabaseCatalogImpl("", ds);
130-
SqlGuard guard = oSqlGuardFactory.get().create("", "", dc, List.of(), this.getContext().getDialect() ); //TODO add white list functions
131-
try {
132-
String sanetizedSql= guard.guard(queryToParse);
133-
return new SqlQueryImpl(sanetizedSql, getContext().getDataSource());
134-
} catch (UnparsableStatementGuardException uex) {
135-
// when can´t be parse then we decide to throw the exception of MDX
136-
throw new FailedToParseQueryException(queryToParse, mdxPE);
137-
} catch (GuardException guasdEx) {
138-
throw new FailedToParseQueryException(queryToParse, guasdEx);
139-
}
133+
} catch (GuardException guasdEx) {
134+
throw new FailedToParseQueryException(queryToParse, guasdEx);
140135
}
141136
}
142137
}

xmla/bridge/src/main/java/org/eclipse/daanse/olap/xmla/bridge/ContextsSupplyerImpl.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ public ContextsSupplyerImpl(ContextGroup contextsGroup) {
3737

3838
@Override
3939
public List<Catalog> get(Optional<String> sessionId) {
40-
return getContexts().stream().map(context -> getConnection(sessionId, context.getName())).map(Connection::getCatalog).toList();
40+
return getContexts().stream().map(context -> getConnection(sessionId, context.getName()))
41+
.map(Connection::getCatalog).toList();
4142
}
4243

4344
@Override
44-
public Optional<Catalog> tryGetFirstByName(String catalogName, Optional<String> sessionId) {
45+
public Optional<Catalog> tryGetFirstByName(String catalogName, Optional<String> sessionId) {
4546
return Optional.of(getConnection(sessionId, catalogName).getCatalog());
4647
}
4748

@@ -64,12 +65,20 @@ public Map<String, Map<String, Connection>> getSessionCache() {
6465
@Override
6566
public Connection getConnection(Optional<String> sessionId, String catalogName) {
6667
if (sessionId.isPresent() && sessionCache.containsKey(sessionId.get())) {
67-
Map<String, Connection> connectionMap = sessionCache.get(sessionId.get());
68+
Map<String, Connection> connectionMap = sessionCache.get(sessionId.get());
6869
if (connectionMap.containsKey(catalogName)) {
6970
return connectionMap.get(catalogName);
7071
}
72+
} else {
73+
Connection connection = getContexts().stream().filter(c -> c.getName().equals(catalogName)).findFirst()
74+
.map(context -> {
75+
Connection con = context.getConnection(new ConnectionProps(List.of()));
76+
return con;
77+
}).orElseThrow(() -> new RuntimeException("No context found for catalog " + catalogName));
78+
return connection;
7179
}
72-
throw new RuntimeException("Connection is absent in cache for session " + sessionId + " for catalog " + catalogName);
80+
throw new RuntimeException(
81+
"Connection is absent in cache for session " + sessionId + " for catalog " + catalogName);
7382
}
7483

7584
}

xmla/bridge/src/main/java/org/eclipse/daanse/olap/xmla/bridge/execute/OlapExecuteService.java

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -264,10 +264,8 @@ public StatementResponse statement(StatementRequest statementRequest, RequestMet
264264
} else if (queryComponent instanceof CalculatedFormula calculatedFormula) {
265265
return executeCalculatedFormula(connection, calculatedFormula);
266266
} else if (queryComponent instanceof DmvQuery dmvQuery) {
267-
return executeDmvQuery(connection, dmvQuery, metaData, statementRequest); // toto:
268-
// remove
269-
// userRolePrincipal,
270-
// metaData,
267+
return executeDmvQuery(connection, dmvQuery, metaData, statementRequest);
268+
// TODO: remove userRolePrincipal, metaData,
271269
} else if (queryComponent instanceof Refresh refresh) {
272270
return executeRefresh(connection, refresh);
273271
} else if (queryComponent instanceof Update update) {
@@ -287,17 +285,42 @@ public StatementResponse statement(StatementRequest statementRequest, RequestMet
287285
&& !contextsListSupplyer.getContexts().isEmpty()) {
288286
Connection connection = contextsListSupplyer.getContexts().get(0).getConnection(new ConnectionProps(RoleUtils.getRoles(contextsListSupplyer, r -> userRolePrincipal.hasRole(r))));
289287
QueryComponent queryComponent = connection.parseStatement(statement);
290-
if (queryComponent instanceof DmvQuery dmvQuery
291-
&& dmvQuery.getTableName().equals(OperationNames.DBSCHEMA_CATALOGS)) {
292-
List<DbSchemaCatalogsResponseRow> dbSchemaCatalogsResponseRowSetList = new ArrayList<DbSchemaCatalogsResponseRow>();
293-
for (Context c : contextsListSupplyer.getContexts()) {
294-
dbSchemaCatalogsResponseRowSetList.add(dbSchemaService.dbSchemaCatalogsRow(c));
288+
if (queryComponent instanceof DmvQuery dmvQuery) {
289+
290+
System.out.println("!!!! use sesscioncach to et the open connection is session exists");
291+
String tableName = dmvQuery.getTableName();
292+
if (tableName.equalsIgnoreCase(OperationNames.DBSCHEMA_CATALOGS)) {
293+
List<DbSchemaCatalogsResponseRow> dbSchemaCatalogsResponseRowSetList = new ArrayList<DbSchemaCatalogsResponseRow>();
294+
for (Context c : contextsListSupplyer.getContexts()) {
295+
dbSchemaCatalogsResponseRowSetList.add(dbSchemaService.dbSchemaCatalogsRow(c));
296+
}
297+
RowSetR rowSet = DiscoveryResponseConvertor
298+
.dbSchemaCatalogsResponseRowToRowSet(dbSchemaCatalogsResponseRowSetList);
299+
return new StatementResponseR(null, filterRowSetByColumns(rowSet, dmvQuery.getColumns(),
300+
dmvQuery.getWhereExpression(), statementRequest.parameters()));
301+
} else if (tableName.equalsIgnoreCase(OperationNames.MDSCHEMA_CUBES)) {
302+
// special case for MDSCHEMA_CUBES without catalog : return from all catalogs
303+
List<RowSetRow> rsrs = new ArrayList<>();
304+
for (Context<?> c : contextsListSupplyer.getContexts()) {
305+
Connection conn = c.getConnection(new ConnectionProps(
306+
RoleUtils.getRoles(contextsListSupplyer, r -> userRolePrincipal.hasRole(r))));
307+
Catalog catalog = conn.getCatalog();
308+
System.out.println("!!!!!!!!!!!!!!!!USE Catalogreader to enforce the roles");
309+
MdSchemaCubesRequest mdSchemaCubesRequest = new MdSchemaCubesRequestR(
310+
(PropertiesR) statementRequest.properties(),
311+
new MdSchemaCubesRestrictionsR(null, empty(), empty(), empty(), empty(), empty()));
312+
RowSetR rowSet = DiscoveryResponseConvertor.mdSchemaCubesResponseRowToRowSet(
313+
mdSchemaService.mdSchemaCubes(mdSchemaCubesRequest, metaData));
314+
rsrs.addAll(rowSet.rowSetRows());
315+
}
316+
RowSetR combinedRowSet = new RowSetR(rsrs);
317+
return new StatementResponseR(null, filterRowSetByColumns(combinedRowSet, dmvQuery.getColumns(),
318+
dmvQuery.getWhereExpression(), statementRequest.parameters()));
319+
295320
}
296-
RowSetR rowSet = DiscoveryResponseConvertor
297-
.dbSchemaCatalogsResponseRowToRowSet(dbSchemaCatalogsResponseRowSetList);
298-
return new StatementResponseR(null, filterRowSetByColumns(rowSet, dmvQuery.getColumns(),
299-
dmvQuery.getWhereExpression(), statementRequest.parameters()));
321+
300322
}
323+
// here
301324
}
302325
}
303326

0 commit comments

Comments
 (0)