/** * Reserve a token for expansion of view owned by given user name. * * @param viewOwner Name of the user who owns the view. * @return An instance of {@link com.dremio.exec.ops.ViewExpansionContext.ViewExpansionToken} which must be * released when done using the token. */ public ViewExpansionToken reserveViewExpansionToken(String viewOwner) { int totalTokens = 1; if (!Objects.equals(queryUser, viewOwner)) { // We want to track the tokens only if the "viewOwner" is not same as the "queryUser". if (userTokens.containsKey(viewOwner)) { totalTokens += userTokens.get(viewOwner); } userTokens.put(viewOwner, totalTokens); logger.debug("Issued view expansion token for user '{}'", viewOwner); } return new ViewExpansionToken(viewOwner); }
public static RelRoot expandView(NamespaceKey path, final String viewOwner, final String queryString, final List<String> context, final SqlConverter sqlConverter) { ViewExpansionToken token = null; try { //RelDataType rowType = view.getRowType(cluster.getTypeFactory()); token = sqlConverter.getViewExpansionContext().reserveViewExpansionToken(viewOwner); final DremioCatalogReader catalog; if(viewOwner != null) { catalog = sqlConverter.getCatalogReader().withSchemaPathAndUser(viewOwner, context); } else { catalog = sqlConverter.getCatalogReader().withSchemaPath(context); } final SqlConverter newConverter = new SqlConverter(sqlConverter, catalog); final SqlNode parsedNode = newConverter.parse(queryString); final SqlNode validatedNode = newConverter.validate(parsedNode); final RelRootPlus root = newConverter.toConvertibleRelRoot(validatedNode, true); if(path == null) { return root; } // we need to make sure that if a inner expansion is context sensitive, we consider the current // expansion context sensitive even if it isn't locally. final boolean contextSensitive = root.isContextSensitive() || ExpansionNode.isContextSensitive(root.rel); return new RelRoot(ExpansionNode.wrap(path, root.rel, contextSensitive), root.validatedRowType, root.kind, root.fields, root.collation); } finally { if (token != null) { token.release(); } } }