diff --git a/api/src/org/labkey/api/query/QueryService.java b/api/src/org/labkey/api/query/QueryService.java index cbb7016aa96..ca864247b89 100644 --- a/api/src/org/labkey/api/query/QueryService.java +++ b/api/src/org/labkey/api/query/QueryService.java @@ -174,11 +174,14 @@ UserSchema createLinkedSchema(User user, Container container, String name, Strin */ List getSharedCustomViews(@NotNull User user, Container container, @Nullable String schemaName, @Nullable String queryName, boolean includeInherited); + @Deprecated // Use the three parameter version of the function to get views in product containers + List getDatabaseCustomViews(@NotNull User user, Container container, @Nullable User owner, @Nullable String schemaName, @Nullable String queryName, boolean includeInherited, boolean sharedOnly); + /** * Returns custom views stored in the database (not module custom views) that meet the criteria. This is not appropriate * for UI operations (see getCustomViews() for that), but it's important for query change listeners. See #21641 and #21862. */ - List getDatabaseCustomViews(@NotNull User user, Container container, @Nullable User owner, @Nullable String schemaName, @Nullable String queryName, boolean includeInherited, boolean sharedOnly); + List getDatabaseCustomViews(@NotNull User user, @NotNull Container container, @Nullable String schemaName, @Nullable String queryName); int importCustomViews(User user, Container container, VirtualFile viewDir) throws IOException; diff --git a/query/src/org/labkey/query/CustomViewQueryChangeListener.java b/query/src/org/labkey/query/CustomViewQueryChangeListener.java index ff9cc681eb1..cb485ff30ae 100644 --- a/query/src/org/labkey/query/CustomViewQueryChangeListener.java +++ b/query/src/org/labkey/query/CustomViewQueryChangeListener.java @@ -93,7 +93,7 @@ private void _updateCustomViewColumnTypeChange(User user, Container container, S String columnName = newDp.getName() == null ? oldDp.getName() : newDp.getName(); - List databaseCustomViews = QueryService.get().getDatabaseCustomViews(user, container, null, schema.toString(), queryName, false, false); + List databaseCustomViews = QueryService.get().getDatabaseCustomViews(user, container, schema.toString(), queryName); for (CustomView customView : databaseCustomViews) { @@ -230,7 +230,7 @@ private void _updateCustomViewQueryNameChange(User user, Container container, Sc queryNameChangeMap.put((String)qpc.getOldValue(), (String)qpc.getNewValue()); } - List databaseCustomViews = QueryService.get().getDatabaseCustomViews(user, container, null, schemaKey.toString(), null, false, false); + List databaseCustomViews = QueryService.get().getDatabaseCustomViews(user, container, schemaKey.toString(), null); for (CustomView customView : databaseCustomViews) { @@ -279,7 +279,7 @@ private void _updateCustomViewSchemaNameChange(User user, Container container, C { String newSchema = schemaNameChangeMap.get(oldSchema); - List databaseCustomViews = QueryService.get().getDatabaseCustomViews(user, container, null, oldSchema, null, false, false); + List databaseCustomViews = QueryService.get().getDatabaseCustomViews(user, container, oldSchema, null); for (CustomView customView : databaseCustomViews) { diff --git a/query/src/org/labkey/query/QueryServiceImpl.java b/query/src/org/labkey/query/QueryServiceImpl.java index 3ffd2f26a1a..586567167b6 100644 --- a/query/src/org/labkey/query/QueryServiceImpl.java +++ b/query/src/org/labkey/query/QueryServiceImpl.java @@ -1295,6 +1295,7 @@ private List _getCustomViews(final @NotNull User user, final Contain return new ArrayList<>(views); } + @Deprecated @Override public List getDatabaseCustomViews(@NotNull User user, Container container, @Nullable User owner, @Nullable String schemaName, @Nullable String queryName, boolean includeInherited, boolean sharedOnly) { @@ -1335,6 +1336,73 @@ public List getDatabaseCustomViews(@NotNull User user, Container con return allViews.stream().filter(view -> !(view instanceof ModuleCustomView)).collect(Collectors.toList()); } + @Override + public List getDatabaseCustomViews(@NotNull User user, @NotNull Container container, @Nullable String schemaName, @Nullable String queryName) + { + // GitHub Issue 1058: Sample Finder saved views in subfolder break after MVTC to TC conversion + Collection containerIds = container.getProductFoldersDataContainerFilter(user).getIds(); + + SimpleFilter filter = new SimpleFilter(); + if (containerIds != null) + filter.addInClause(FieldKey.fromParts("Container"), containerIds); + else + filter = SimpleFilter.createContainerFilter(container, "Container"); + + if (schemaName != null) + filter.addCondition(FieldKey.fromParts("Schema"), schemaName); + if (queryName != null) + filter.addCondition(FieldKey.fromParts("QueryName"), queryName); + + List cstmViews = new TableSelector(QueryManager.get().getTableInfoCustomView(), filter, null).getArrayList(CstmView.class); + + List result = new ArrayList<>(); + + Map> containerViews = new HashMap<>(); + for (CstmView cstmView : cstmViews) + { + Container viewContainer = cstmView.lookupContainer(); + if (viewContainer != null) + containerViews.computeIfAbsent(viewContainer, k -> new ArrayList<>()).add(cstmView); + } + + for (Map.Entry> containerCstmViews: containerViews.entrySet()) + { + Map schemas = new HashMap<>(); + Map, QueryDefinition> queryDefs = new HashMap<>(); + Container viewContainer = containerCstmViews.getKey(); + List views = containerCstmViews.getValue(); + DefaultSchema defaultSchema = DefaultSchema.get(user, viewContainer); + + for (CstmView cstmView : views) + { + Pair key = new Pair<>(cstmView.getSchema(), cstmView.getQueryName()); + QueryDefinition queryDef = queryDefs.get(key); + if (queryDef == null) + { + UserSchema schema = schemas.get(cstmView.getSchema()); + if (schema == null) + { + schema = defaultSchema.getUserSchema(cstmView.getSchema()); + schemas.put(cstmView.getSchema(), schema); + } + if (schema != null) + { + queryDef = schema.getQueryDefForTable(cstmView.getQueryName()); + queryDefs.put(key, queryDef); + } + } + + if (queryDef != null) + { + result.add(new CustomViewImpl(queryDef, cstmView)); + } + } + } + + return result; + } + + @Override public List getFileBasedCustomViews(Container container, QueryDefinition qd, Path path, String query, Module... extraModules) {