Skip to content

Commit

Permalink
Merge pull request #900 from amvanbaren/optimize-namespace-details
Browse files Browse the repository at this point in the history
Optimize namespace details endpoint
  • Loading branch information
amvanbaren authored Apr 18, 2024
2 parents 1fb7ac4 + 6f9e048 commit 4dcafa5
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 16 deletions.
28 changes: 12 additions & 16 deletions server/src/main/java/org/eclipse/openvsx/LocalRegistryService.java
Original file line number Diff line number Diff line change
Expand Up @@ -395,27 +395,23 @@ public NamespaceDetailsJson getNamespaceDetails(String namespaceName) {
? storageUtil.getNamespaceLogoLocation(namespace).toString()
: null;

json.extensions = repositories.findActiveExtensions(namespace).stream()
.sorted(Comparator.comparingLong(Extension::getDownloadCount).reversed())
.map(this::toSearchEntryJson)
var serverUrl = UrlUtil.getBaseUrl();
json.extensions = repositories.findLatestVersions(namespace).stream()
.map(extVersion -> {
var entry = extVersion.toSearchEntryJson();
entry.url = createApiUrl(serverUrl, "api", entry.namespace, entry.name);
entry.files = storageUtil.getFileUrls(extVersion, serverUrl, withFileTypes(DOWNLOAD, ICON));
if(entry.files.containsKey(DOWNLOAD_SIG)) {
entry.files.put(PUBLIC_KEY, UrlUtil.getPublicKeyUrl(extVersion));
}

return entry;
})
.collect(Collectors.toList());

return json;
}

private SearchEntryJson toSearchEntryJson(Extension extension) {
var serverUrl = UrlUtil.getBaseUrl();
var extVersion = repositories.findLatestVersion(extension, null, false, true);
var entry = extVersion.toSearchEntryJson();
entry.url = createApiUrl(serverUrl, "api", entry.namespace, entry.name);
entry.files = storageUtil.getFileUrls(extVersion, serverUrl, withFileTypes(DOWNLOAD, ICON));
if(entry.files.containsKey(DOWNLOAD_SIG)) {
entry.files.put(PUBLIC_KEY, UrlUtil.getPublicKeyUrl(extVersion));
}

return entry;
}

private String[] withFileTypes(String... types) {
var typesList = new ArrayList<>(List.of(types));
if(typesList.contains(DOWNLOAD)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,66 @@ public ExtensionVersion findLatest(
return query.fetchOne((record) -> toExtensionVersionFull(record, extension));
}

public List<ExtensionVersion> findLatest(Namespace namespace) {
var latestQuery = findLatestQuery(null, false, true);
latestQuery.addSelect(
EXTENSION_VERSION.ID,
EXTENSION_VERSION.VERSION,
EXTENSION_VERSION.TIMESTAMP,
EXTENSION_VERSION.DISPLAY_NAME,
EXTENSION_VERSION.DESCRIPTION,
SIGNATURE_KEY_PAIR.PUBLIC_ID
);
latestQuery.addConditions(EXTENSION_VERSION.EXTENSION_ID.eq(EXTENSION.ID));
latestQuery.addJoin(SIGNATURE_KEY_PAIR, JoinType.LEFT_OUTER_JOIN, SIGNATURE_KEY_PAIR.ID.eq(EXTENSION_VERSION.SIGNATURE_KEY_PAIR_ID));
var latest = latestQuery.asTable();

var query = dsl.selectQuery();
query.addSelect(
EXTENSION.ID,
EXTENSION.NAME,
EXTENSION.AVERAGE_RATING,
EXTENSION.REVIEW_COUNT,
EXTENSION.DOWNLOAD_COUNT,
latest.field(EXTENSION_VERSION.ID),
latest.field(EXTENSION_VERSION.VERSION),
latest.field(EXTENSION_VERSION.TIMESTAMP),
latest.field(EXTENSION_VERSION.DISPLAY_NAME),
latest.field(EXTENSION_VERSION.DESCRIPTION),
latest.field(SIGNATURE_KEY_PAIR.PUBLIC_ID)
);
query.addFrom(EXTENSION, DSL.lateral(latest));
query.addConditions(
EXTENSION.NAMESPACE_ID.eq(namespace.getId()),
EXTENSION.ACTIVE.eq(true)
);
query.addOrderBy(EXTENSION.DOWNLOAD_COUNT.desc());

return query.fetch(record -> {
var extension = new Extension();
extension.setId(record.get(EXTENSION.ID));
extension.setName(record.get(EXTENSION.NAME));
extension.setAverageRating(record.get(EXTENSION.AVERAGE_RATING));
extension.setReviewCount(record.get(EXTENSION.REVIEW_COUNT));
extension.setDownloadCount(record.get(EXTENSION.DOWNLOAD_COUNT));
extension.setNamespace(namespace);

var extVersion = new ExtensionVersion();
extVersion.setId(record.get(latest.field(EXTENSION_VERSION.ID)));
extVersion.setVersion(record.get(latest.field(EXTENSION_VERSION.VERSION)));
extVersion.setTimestamp(record.get(latest.field(EXTENSION_VERSION.TIMESTAMP)));
extVersion.setDisplayName(record.get(latest.field(EXTENSION_VERSION.DISPLAY_NAME)));
extVersion.setDescription(record.get(latest.field(EXTENSION_VERSION.DESCRIPTION)));
extVersion.setExtension(extension);

var keyPair = new SignatureKeyPair();
keyPair.setPublicId(record.get(latest.field(SIGNATURE_KEY_PAIR.PUBLIC_ID)));
extVersion.setSignatureKeyPair(keyPair);

return extVersion;
});
}

public ExtensionVersion findLatestForAllUrls(
Extension extension,
String targetPlatform,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,10 @@ public ExtensionVersion findLatestVersion(Extension extension, String targetPlat
return extensionVersionJooqRepo.findLatest(extension, targetPlatform, onlyPreRelease, onlyActive);
}

public List<ExtensionVersion> findLatestVersions(Namespace namespace) {
return extensionVersionJooqRepo.findLatest(namespace);
}

public List<String> findExtensionTargetPlatforms(Extension extension) {
return extensionVersionJooqRepo.findDistinctTargetPlatforms(extension);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ void testExecuteQueries() {
() -> repositories.findExtensionVersion("namespaceName", "extensionName", "targetPlatform", "version"),
() -> repositories.findLatestVersionForAllUrls(extension, "targetPlatform", false, false),
() -> repositories.findLatestVersion(extension, "targetPlatform", false, false),
() -> repositories.findLatestVersions(namespace),
() -> repositories.findExtensionTargetPlatforms(extension)
);

Expand Down

0 comments on commit 4dcafa5

Please sign in to comment.