diff --git a/plugins/stats-collector/features/src/com/jetbrains/completion/feature/impl/FeatureUtils.kt b/plugins/stats-collector/features/src/com/jetbrains/completion/feature/impl/FeatureUtils.kt index b309d37fe93b..0498dc394f7c 100644 --- a/plugins/stats-collector/features/src/com/jetbrains/completion/feature/impl/FeatureUtils.kt +++ b/plugins/stats-collector/features/src/com/jetbrains/completion/feature/impl/FeatureUtils.kt @@ -31,40 +31,4 @@ object FeatureUtils { fun getOtherCategoryFeatureName(name: String): String = "$name=$OTHER" fun getUndefinedFeatureName(name: String): String = "$name=$UNDEFINED" - - fun asRelevanceMap(relevanceObjects: List>): MutableMap { - val relevanceMap = mutableMapOf() - for (pair in relevanceObjects) { - val name = pair.first.normalized() - val value = pair.second - if (value == null) continue - if (name == "proximity") { - val proximityMap = value.toString().asProximityMap("prox") - relevanceMap.putAll(proximityMap) - } - else { - relevanceMap[name] = value - } - } - - return relevanceMap - } - - fun normalizeFeatureName(name: String): String = name.normalized() - - private fun String.normalized(): String { - return substringBefore('@') - } - - /** - * Proximity features now came like [samePsiFile=true, openedInEditor=false], need to convert to proper map - */ - private fun String.asProximityMap(prefix: String): Map { - val items = this.replace("[", "").replace("]", "").split(",") - - return items.map { - val (key, value) = it.trim().split("=") - "${prefix}_$key" to value - }.toMap() - } } diff --git a/plugins/stats-collector/src/com/intellij/completion/sorting/MLSorter.kt b/plugins/stats-collector/src/com/intellij/completion/sorting/MLSorter.kt index 24bd7ceba39f..b5964182beea 100644 --- a/plugins/stats-collector/src/com/intellij/completion/sorting/MLSorter.kt +++ b/plugins/stats-collector/src/com/intellij/completion/sorting/MLSorter.kt @@ -16,6 +16,7 @@ import com.intellij.openapi.util.Pair import com.intellij.openapi.util.registry.Registry import com.intellij.psi.util.PsiUtilCore import com.intellij.stats.completion.CompletionUtil +import com.intellij.stats.completion.RelevanceUtil import com.intellij.stats.completion.prefixLength import com.intellij.stats.experiment.EmulatedExperiment import com.intellij.stats.experiment.WebServiceStatus @@ -109,7 +110,7 @@ class MLSorter : CompletionFinalSorter() { return items .mapIndexed { position, lookupElement -> positionsBefore[lookupElement] = position - val relevance = buildRelevanceMap(lookupElement, relevanceObjects[lookupElement]?.map { it.first to it.second }, + val relevance = buildRelevanceMap(lookupElement, relevanceObjects[lookupElement], lookup.prefixLength(), position, parameters) ?: return null val rank: Double = calculateElementRank(ranker, lookupElement, position, relevance, userFactors, prefixLength) ?: return null @@ -121,13 +122,13 @@ class MLSorter : CompletionFinalSorter() { } private fun buildRelevanceMap(lookupElement: LookupElement, - relevanceObjects: List>?, + relevanceObjects: List>?, prefixLength: Int, position: Int, parameters: CompletionParameters): Map? { if (relevanceObjects == null) return null - val relevanceMap = FeatureUtils.asRelevanceMap(relevanceObjects) + val relevanceMap = RelevanceUtil.asRelevanceMap(relevanceObjects) relevanceMap["position"] = position relevanceMap["query_length"] = prefixLength diff --git a/plugins/stats-collector/src/com/intellij/stats/completion/LookupStateManager.kt b/plugins/stats-collector/src/com/intellij/stats/completion/LookupStateManager.kt index f7aa4712a95d..e23b57e74036 100644 --- a/plugins/stats-collector/src/com/intellij/stats/completion/LookupStateManager.kt +++ b/plugins/stats-collector/src/com/intellij/stats/completion/LookupStateManager.kt @@ -71,10 +71,11 @@ class LookupStateManager { private fun List.toLookupInfos(lookup: LookupImpl): List { val relevanceObjects = lookup.getRelevanceObjects(this, false) - return this.map { - val id = getElementId(it)!! - val relevanceMap = relevanceObjects[it]?.associate { p -> FeatureUtils.normalizeFeatureName(p.first) to p.second?.toString() } - LookupEntryInfo(id, it.lookupString.length, relevanceMap) + return this.map { lookupElement -> + val relevanceMap = relevanceObjects[lookupElement]?.let { objects -> + RelevanceUtil.asRelevanceMap(objects).mapValues { entry -> entry.value.toString() } + } + LookupEntryInfo(getElementId(lookupElement)!!, lookupElement.lookupString.length, relevanceMap) } } } \ No newline at end of file diff --git a/plugins/stats-collector/src/com/intellij/stats/completion/RelevanceUtil.kt b/plugins/stats-collector/src/com/intellij/stats/completion/RelevanceUtil.kt new file mode 100644 index 000000000000..7cd49bb7040b --- /dev/null +++ b/plugins/stats-collector/src/com/intellij/stats/completion/RelevanceUtil.kt @@ -0,0 +1,37 @@ +package com.intellij.stats.completion + +object RelevanceUtil { + fun asRelevanceMap(relevanceObjects: List>): MutableMap { + val relevanceMap = mutableMapOf() + for (pair in relevanceObjects) { + val name = pair.first.normalized() + val value = pair.second + if (value == null) continue + if (name == "proximity") { + val proximityMap = value.toString().asProximityMap("prox") + relevanceMap.putAll(proximityMap) + } + else { + relevanceMap[name] = value + } + } + + return relevanceMap + } + + private fun String.normalized(): String { + return substringBefore('@') + } + + /** + * Proximity features now came like [samePsiFile=true, openedInEditor=false], need to convert to proper map + */ + private fun String.asProximityMap(prefix: String): Map { + val items = this.replace("[", "").replace("]", "").split(",") + + return items.map { + val (key, value) = it.trim().split("=") + "${prefix}_$key" to value + }.toMap() + } +} \ No newline at end of file