Skip to content

Commit 6f9e048

Browse files
author
amvanbaren
committed
Optimize namespace details endpoint
1 parent 1fb7ac4 commit 6f9e048

File tree

4 files changed

+77
-16
lines changed

4 files changed

+77
-16
lines changed

server/src/main/java/org/eclipse/openvsx/LocalRegistryService.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -395,27 +395,23 @@ public NamespaceDetailsJson getNamespaceDetails(String namespaceName) {
395395
? storageUtil.getNamespaceLogoLocation(namespace).toString()
396396
: null;
397397

398-
json.extensions = repositories.findActiveExtensions(namespace).stream()
399-
.sorted(Comparator.comparingLong(Extension::getDownloadCount).reversed())
400-
.map(this::toSearchEntryJson)
398+
var serverUrl = UrlUtil.getBaseUrl();
399+
json.extensions = repositories.findLatestVersions(namespace).stream()
400+
.map(extVersion -> {
401+
var entry = extVersion.toSearchEntryJson();
402+
entry.url = createApiUrl(serverUrl, "api", entry.namespace, entry.name);
403+
entry.files = storageUtil.getFileUrls(extVersion, serverUrl, withFileTypes(DOWNLOAD, ICON));
404+
if(entry.files.containsKey(DOWNLOAD_SIG)) {
405+
entry.files.put(PUBLIC_KEY, UrlUtil.getPublicKeyUrl(extVersion));
406+
}
407+
408+
return entry;
409+
})
401410
.collect(Collectors.toList());
402411

403412
return json;
404413
}
405414

406-
private SearchEntryJson toSearchEntryJson(Extension extension) {
407-
var serverUrl = UrlUtil.getBaseUrl();
408-
var extVersion = repositories.findLatestVersion(extension, null, false, true);
409-
var entry = extVersion.toSearchEntryJson();
410-
entry.url = createApiUrl(serverUrl, "api", entry.namespace, entry.name);
411-
entry.files = storageUtil.getFileUrls(extVersion, serverUrl, withFileTypes(DOWNLOAD, ICON));
412-
if(entry.files.containsKey(DOWNLOAD_SIG)) {
413-
entry.files.put(PUBLIC_KEY, UrlUtil.getPublicKeyUrl(extVersion));
414-
}
415-
416-
return entry;
417-
}
418-
419415
private String[] withFileTypes(String... types) {
420416
var typesList = new ArrayList<>(List.of(types));
421417
if(typesList.contains(DOWNLOAD)) {

server/src/main/java/org/eclipse/openvsx/repositories/ExtensionVersionJooqRepository.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,66 @@ public ExtensionVersion findLatest(
656656
return query.fetchOne((record) -> toExtensionVersionFull(record, extension));
657657
}
658658

659+
public List<ExtensionVersion> findLatest(Namespace namespace) {
660+
var latestQuery = findLatestQuery(null, false, true);
661+
latestQuery.addSelect(
662+
EXTENSION_VERSION.ID,
663+
EXTENSION_VERSION.VERSION,
664+
EXTENSION_VERSION.TIMESTAMP,
665+
EXTENSION_VERSION.DISPLAY_NAME,
666+
EXTENSION_VERSION.DESCRIPTION,
667+
SIGNATURE_KEY_PAIR.PUBLIC_ID
668+
);
669+
latestQuery.addConditions(EXTENSION_VERSION.EXTENSION_ID.eq(EXTENSION.ID));
670+
latestQuery.addJoin(SIGNATURE_KEY_PAIR, JoinType.LEFT_OUTER_JOIN, SIGNATURE_KEY_PAIR.ID.eq(EXTENSION_VERSION.SIGNATURE_KEY_PAIR_ID));
671+
var latest = latestQuery.asTable();
672+
673+
var query = dsl.selectQuery();
674+
query.addSelect(
675+
EXTENSION.ID,
676+
EXTENSION.NAME,
677+
EXTENSION.AVERAGE_RATING,
678+
EXTENSION.REVIEW_COUNT,
679+
EXTENSION.DOWNLOAD_COUNT,
680+
latest.field(EXTENSION_VERSION.ID),
681+
latest.field(EXTENSION_VERSION.VERSION),
682+
latest.field(EXTENSION_VERSION.TIMESTAMP),
683+
latest.field(EXTENSION_VERSION.DISPLAY_NAME),
684+
latest.field(EXTENSION_VERSION.DESCRIPTION),
685+
latest.field(SIGNATURE_KEY_PAIR.PUBLIC_ID)
686+
);
687+
query.addFrom(EXTENSION, DSL.lateral(latest));
688+
query.addConditions(
689+
EXTENSION.NAMESPACE_ID.eq(namespace.getId()),
690+
EXTENSION.ACTIVE.eq(true)
691+
);
692+
query.addOrderBy(EXTENSION.DOWNLOAD_COUNT.desc());
693+
694+
return query.fetch(record -> {
695+
var extension = new Extension();
696+
extension.setId(record.get(EXTENSION.ID));
697+
extension.setName(record.get(EXTENSION.NAME));
698+
extension.setAverageRating(record.get(EXTENSION.AVERAGE_RATING));
699+
extension.setReviewCount(record.get(EXTENSION.REVIEW_COUNT));
700+
extension.setDownloadCount(record.get(EXTENSION.DOWNLOAD_COUNT));
701+
extension.setNamespace(namespace);
702+
703+
var extVersion = new ExtensionVersion();
704+
extVersion.setId(record.get(latest.field(EXTENSION_VERSION.ID)));
705+
extVersion.setVersion(record.get(latest.field(EXTENSION_VERSION.VERSION)));
706+
extVersion.setTimestamp(record.get(latest.field(EXTENSION_VERSION.TIMESTAMP)));
707+
extVersion.setDisplayName(record.get(latest.field(EXTENSION_VERSION.DISPLAY_NAME)));
708+
extVersion.setDescription(record.get(latest.field(EXTENSION_VERSION.DESCRIPTION)));
709+
extVersion.setExtension(extension);
710+
711+
var keyPair = new SignatureKeyPair();
712+
keyPair.setPublicId(record.get(latest.field(SIGNATURE_KEY_PAIR.PUBLIC_ID)));
713+
extVersion.setSignatureKeyPair(keyPair);
714+
715+
return extVersion;
716+
});
717+
}
718+
659719
public ExtensionVersion findLatestForAllUrls(
660720
Extension extension,
661721
String targetPlatform,

server/src/main/java/org/eclipse/openvsx/repositories/RepositoryService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,10 @@ public ExtensionVersion findLatestVersion(Extension extension, String targetPlat
548548
return extensionVersionJooqRepo.findLatest(extension, targetPlatform, onlyPreRelease, onlyActive);
549549
}
550550

551+
public List<ExtensionVersion> findLatestVersions(Namespace namespace) {
552+
return extensionVersionJooqRepo.findLatest(namespace);
553+
}
554+
551555
public List<String> findExtensionTargetPlatforms(Extension extension) {
552556
return extensionVersionJooqRepo.findDistinctTargetPlatforms(extension);
553557
}

server/src/test/java/org/eclipse/openvsx/repositories/RepositoryServiceSmokeTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ void testExecuteQueries() {
200200
() -> repositories.findExtensionVersion("namespaceName", "extensionName", "targetPlatform", "version"),
201201
() -> repositories.findLatestVersionForAllUrls(extension, "targetPlatform", false, false),
202202
() -> repositories.findLatestVersion(extension, "targetPlatform", false, false),
203+
() -> repositories.findLatestVersions(namespace),
203204
() -> repositories.findExtensionTargetPlatforms(extension)
204205
);
205206

0 commit comments

Comments
 (0)