From a8ee32f847f543984ee6a38902c40a22d8b8ee56 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 7 Dec 2017 21:15:04 +0300 Subject: [PATCH] PY-27360 Use multimap to initialize Conda package cache Also use TreeSet as the container for values to sort versions in descending order and keep them unique at the same time. --- .../python/packaging/PyCondaPackageCache.java | 14 +++++++------- .../packaging/PyCondaPackageService.java | 18 +++++++++--------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/python/src/com/jetbrains/python/packaging/PyCondaPackageCache.java b/python/src/com/jetbrains/python/packaging/PyCondaPackageCache.java index 25fcfd4b55a9..20ceda3cede6 100644 --- a/python/src/com/jetbrains/python/packaging/PyCondaPackageCache.java +++ b/python/src/com/jetbrains/python/packaging/PyCondaPackageCache.java @@ -1,10 +1,10 @@ // Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.jetbrains.python.packaging; +import com.google.common.collect.Multimap; import org.jetbrains.annotations.NotNull; -import java.util.List; -import java.util.Map; +import java.util.ArrayList; /** * @author Mikhail Golubev @@ -23,8 +23,8 @@ public class PyCondaPackageCache extends PyAbstractPackageCache { } @NotNull - public static synchronized PyCondaPackageCache reload(@NotNull Map> packageNames) { - ourInstance = new PyCondaPackageCache(packageNames); + public static synchronized PyCondaPackageCache reload(@NotNull Multimap nameToVersion) { + ourInstance = new PyCondaPackageCache(nameToVersion); store(ourInstance, CACHE_FILE_NAME); return ourInstance; } @@ -32,9 +32,9 @@ public class PyCondaPackageCache extends PyAbstractPackageCache { private PyCondaPackageCache() { } - private PyCondaPackageCache(@NotNull Map> nameToVersion) { - for (Map.Entry> entry : nameToVersion.entrySet()) { - myPackages.put(entry.getKey(), new PyAbstractPackageCache.PackageInfo(entry.getValue())); + private PyCondaPackageCache(@NotNull Multimap nameToVersion) { + for (String name : nameToVersion.keySet()) { + myPackages.put(name, new PyAbstractPackageCache.PackageInfo(new ArrayList<>(nameToVersion.get(name)))); } } } diff --git a/python/src/com/jetbrains/python/packaging/PyCondaPackageService.java b/python/src/com/jetbrains/python/packaging/PyCondaPackageService.java index 9a434fdad271..2984cf4206c1 100644 --- a/python/src/com/jetbrains/python/packaging/PyCondaPackageService.java +++ b/python/src/com/jetbrains/python/packaging/PyCondaPackageService.java @@ -15,6 +15,8 @@ */ package com.jetbrains.python.packaging; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; import com.intellij.execution.configurations.PathEnvironmentVariableUtil; import com.intellij.execution.process.ProcessOutput; import com.intellij.openapi.components.*; @@ -35,7 +37,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; @State(name = "PyCondaPackageService", storages = @Storage(value="conda_packages.xml", roamingType = RoamingType.DISABLED)) public class PyCondaPackageService implements PersistentStateComponent { @@ -182,17 +187,12 @@ public class PyCondaPackageService implements PersistentStateComponent> nameToVersions = new HashMap<>(); + final Multimap nameToVersions = + Multimaps.newSortedSetMultimap(new HashMap<>(), () -> new TreeSet<>(VersionComparatorUtil.COMPARATOR.reversed())); for (String line : output.getStdoutLines()) { final List split = StringUtil.split(line, "\t"); if (split.size() < 2) continue; - final String packageName = split.get(0); - final String packageVersion = split.get(1); - final List versions = nameToVersions.computeIfAbsent(packageName, k -> new ArrayList<>()); - final int sortedIndex = Collections.binarySearch(versions, packageVersion, VersionComparatorUtil.COMPARATOR.reversed()); - if (sortedIndex < 0) { - versions.add(-(sortedIndex + 1), packageVersion); - } + nameToVersions.put(split.get(0), split.get(1)); } PyCondaPackageCache.reload(nameToVersions); LAST_TIME_CHECKED = System.currentTimeMillis();