val lookup = event?.lookup as? LookupImpl ?: return
val element = lookup.currentItem ?: return
if (isSelectedByTyping(lookup, element)) {
- processTypedSelect(lookup)
- processElementSelected(lookup, element)
+ processTypedSelect(lookup, element)
}
}
override fun itemSelected(event: LookupEvent?) {
val lookup = event?.lookup as? LookupImpl ?: return
val element = event.item ?: return
- processExplicitSelect(lookup)
- processElementSelected(lookup, element)
+ processExplicitSelect(lookup, element)
}
private fun isSelectedByTyping(lookup: LookupImpl, element: LookupElement): Boolean =
relevanceMap.forEach { name, value -> userFactorsManager.getFeatureFactor(name)?.update(value) }
}
- private fun processExplicitSelect(lookup: LookupImpl) {
+ private fun processExplicitSelect(lookup: LookupImpl, element: LookupElement) {
+ processElementSelected(lookup, element)
+
UserFactorStorage.applyOnBoth(lookup.project, UserFactorDescriptions.COMPLETION_FINISH_TYPE) { updater ->
updater.fireExplicitCompletionPerformed()
}
+
+ val prefixLength = lookup.getPrefixLength(element)
+ UserFactorStorage.applyOnBoth(lookup.project, UserFactorDescriptions.PREFIX_LENGTH_ON_COMPLETION) { updater ->
+ updater.fireCompletionPerformed(prefixLength)
+ }
}
- private fun processTypedSelect(lookup: LookupImpl) {
+ private fun processTypedSelect(lookup: LookupImpl, element: LookupElement) {
+ processElementSelected(lookup, element)
+
UserFactorStorage.applyOnBoth(lookup.project, UserFactorDescriptions.COMPLETION_FINISH_TYPE) { updater ->
updater.fireTypedSelectPerformed()
}
--- /dev/null
+package com.intellij.stats.personalization
+
+/**
+ * @author Vitaliy.Bibaev
+ */
+abstract class UserFactorBase<in R : FactorReader>(override val id: String, private val descriptor: UserFactorDescription<*, R>) : UserFactor {
+ override final fun compute(storage: UserFactorStorage): String? {
+ return compute(storage.getFactorReader(descriptor))
+ }
+
+ abstract fun compute(reader: R): String?
+}
\ No newline at end of file
val COMPLETION_FINISH_TYPE =
Descriptor("completionFinishedType", ::CompletionFinishTypeUpdater, ::CompletionFinishTypeReader)
val COMPLETION_USAGE = Descriptor("completionUsage", ::CompletionUsageUpdater, ::CompletionUsageReader)
-
+ val PREFIX_LENGTH_ON_COMPLETION = Descriptor("prefixLength", ::PrefixLengthUpdater, ::PrefixLengthReader)
class Descriptor<out U : FactorUpdater, out R : FactorReader>(
override val factorId: String,
--- /dev/null
+package com.intellij.stats.personalization.impl
+
+import com.intellij.stats.personalization.*
+
+/**
+ * @author Vitaliy.Bibaev
+ */
+class PrefixLengthReader(factor: DailyAggregatedDoubleFactor) : UserFactorReaderBase(factor) {
+ fun getCountsByPrefixLength(): Map<Int, Double> {
+ return factor.aggregateSum().asIterable().associate { (key, value) -> key.toInt() to value }
+ }
+
+ fun getAveragePrefixLength(): Double? {
+ val lengthToCount = getCountsByPrefixLength()
+ if (lengthToCount.isEmpty()) return null
+
+ val totalChars = lengthToCount.asSequence().sumByDouble { it.key * it.value }
+ val completionCount = lengthToCount.asSequence().sumByDouble { it.value }
+
+ if (completionCount == 0.0) return null
+ return totalChars / completionCount
+ }
+}
+
+class PrefixLengthUpdater(factor: MutableDoubleFactor) : UserFactorUpdaterBase(factor) {
+ fun fireCompletionPerformed(prefixLength: Int) {
+ factor.incrementOnToday(prefixLength.toString())
+ }
+}
+
+class MostFrequentPrefixLength : UserFactorBase<PrefixLengthReader>("mostFrequentPrefixLength",
+ UserFactorDescriptions.PREFIX_LENGTH_ON_COMPLETION) {
+ override fun compute(reader: PrefixLengthReader): String? {
+ return reader.getCountsByPrefixLength().maxBy { it.value }?.key?.toString()
+ }
+}
+
+class AveragePrefixLength : UserFactorBase<PrefixLengthReader>("", UserFactorDescriptions.PREFIX_LENGTH_ON_COMPLETION) {
+ override fun compute(reader: PrefixLengthReader): String? {
+ return reader.getAveragePrefixLength()?.toString()
+ }
+}
\ No newline at end of file
register(TodayCompletionUsageCount())
register(TotalUsageCount())
register(WeekAverageUsageCount())
+
+ register(MostFrequentPrefixLength())
+ register(AveragePrefixLength())
}
override fun getAllFactors(): List<UserFactor> = userFactors.values.toList()