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.
This commit is contained in:
Mikhail Golubev
2017-12-14 21:29:12 +03:00
parent dba31cf0d8
commit a8ee32f847
2 changed files with 16 additions and 16 deletions
@@ -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<String, List<String>> packageNames) {
ourInstance = new PyCondaPackageCache(packageNames);
public static synchronized PyCondaPackageCache reload(@NotNull Multimap<String, String> 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<String, List<String>> nameToVersion) {
for (Map.Entry<String, List<String>> entry : nameToVersion.entrySet()) {
myPackages.put(entry.getKey(), new PyAbstractPackageCache.PackageInfo(entry.getValue()));
private PyCondaPackageCache(@NotNull Multimap<String, String> nameToVersion) {
for (String name : nameToVersion.keySet()) {
myPackages.put(name, new PyAbstractPackageCache.PackageInfo(new ArrayList<>(nameToVersion.get(name))));
}
}
}
@@ -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<PyCondaPackageService> {
@@ -182,17 +187,12 @@ public class PyCondaPackageService implements PersistentStateComponent<PyCondaPa
return;
}
final Map<String, List<String>> nameToVersions = new HashMap<>();
final Multimap<String, String> nameToVersions =
Multimaps.newSortedSetMultimap(new HashMap<>(), () -> new TreeSet<>(VersionComparatorUtil.COMPARATOR.reversed()));
for (String line : output.getStdoutLines()) {
final List<String> split = StringUtil.split(line, "\t");
if (split.size() < 2) continue;
final String packageName = split.get(0);
final String packageVersion = split.get(1);
final List<String> 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();