ML in SE: Ensure all names follow FUS-convention (IJPL-202712)

GitOrigin-RevId: e046800b339c536a47dd0db675217e8a07a9146c
This commit is contained in:
Adam Malek
2025-11-10 21:24:19 +00:00
committed by intellij-monorepo-bot
parent 55d053a213
commit 5351c38d9f
24 changed files with 311 additions and 273 deletions
@@ -159,49 +159,50 @@ object SearchEverywhereMLStatisticsCollector : CounterUsagesCollector() {
}
}
internal val GROUP = EventLogGroup("mlse.log", 126, MLSE_RECORDER_ID)
internal val GROUP = EventLogGroup("mlse.log", 127, MLSE_RECORDER_ID,
"ML in Search Everywhere Log Group")
internal val IS_INTERNAL = EventFields.Boolean("isInternal")
private val ORDER_BY_ML_GROUP = EventFields.Boolean("orderByMl")
internal val EXPERIMENT_GROUP = EventFields.Int("experimentGroup")
internal val EXPERIMENT_VERSION = EventFields.Int("experimentVersion")
private val FORCE_EXPERIMENT_GROUP = EventFields.Boolean("isForceExperiment")
internal val IS_INTERNAL = EventFields.Boolean("is_internal")
private val ORDER_BY_ML_GROUP = EventFields.Boolean("order_by_ml")
internal val EXPERIMENT_GROUP = EventFields.Int("experiment_group")
internal val EXPERIMENT_VERSION = EventFields.Int("experiment_version")
private val FORCE_EXPERIMENT_GROUP = EventFields.Boolean("is_force_experiment")
@VisibleForTesting
internal val SESSION_DURATION = EventFields.Int("sessionDuration", "Duration of the Search Everywhere session in ms")
private val TIME_TO_FIRST_RESULT_DATA_KEY = EventFields.Int("timeToFirstResult")
internal val SESSION_DURATION = EventFields.Int("session_duration", "Duration of the Search Everywhere session in ms")
private val TIME_TO_FIRST_RESULT_DATA_KEY = EventFields.Int("time_to_first_result")
// context fields
private val IS_PROJECT_OPEN = EventFields.Boolean("isProjectOpen")
private val IS_PROJECT_DISPOSED_KEY = EventFields.Boolean("projectDisposed")
internal val SE_TAB_ID_KEY = EventFields.String("seTabId", ALLOWED_CONTRIBUTOR_ID_LIST)
internal val SEARCH_START_TIME_KEY = EventFields.Long("startTime")
internal val REBUILD_REASON_KEY = EventFields.Enum<SearchRestartReason>("rebuildReason")
internal val SESSION_ID = EventFields.Int("sessionId")
internal val SEARCH_INDEX_DATA_KEY = EventFields.Int("searchIndex")
private val IS_PROJECT_OPEN = EventFields.Boolean("is_project_open")
private val IS_PROJECT_DISPOSED_KEY = EventFields.Boolean("project_disposed")
internal val SE_TAB_ID_KEY = EventFields.String("se_tab_id", ALLOWED_CONTRIBUTOR_ID_LIST)
internal val SEARCH_START_TIME_KEY = EventFields.Long("start_time")
internal val REBUILD_REASON_KEY = EventFields.Enum<SearchRestartReason>("rebuild_reason")
internal val SESSION_ID = EventFields.Int("session_id")
internal val SEARCH_INDEX_DATA_KEY = EventFields.Int("search_index")
private val TOTAL_NUMBER_OF_ITEMS_DATA_KEY = EventFields.Int("totalItems")
private val TOTAL_NUMBER_OF_ITEMS_DATA_KEY = EventFields.Int("total_items")
internal val SELECTED_INDEX = EventFields.Int("selectedIndex", "Selected index (0-based) of the item")
internal val SELECTED_INDEX = EventFields.Int("selected_index", "Selected index (0-based) of the item")
@VisibleForTesting
val SELECTED_ELEMENTS_DATA_KEY: IntListEventField = EventFields.IntList("selectedIds")
val SELECTED_ELEMENTS_DATA_KEY: IntListEventField = EventFields.IntList("selected_ids")
private val IS_MIXED_LIST = EventFields.Boolean("isMixedList")
private val IS_MIXED_LIST = EventFields.Boolean("is_mixed_list")
// item fields
private val SEARCH_STATE_FEATURES_DATA_KEY =
ObjectEventField("searchStateFeatures", *SearchEverywhereStateFeaturesProvider.getFields().toTypedArray())
ObjectEventField("search_state_features", *SearchEverywhereStateFeaturesProvider.getFields().toTypedArray())
@VisibleForTesting
val ID_KEY: IntEventField = EventFields.Int("id")
@Suppress("DEPRECATION")
internal val ACTION_ID_KEY = ActionsEventLogGroup.ActioID("actionId")
internal val ACTION_ID_KEY = ActionsEventLogGroup.ActioID("action_id")
@VisibleForTesting
val FEATURES_DATA_KEY: ObjectEventField = createFeaturesEventObject()
internal val ML_WEIGHT_KEY: DoubleEventField = EventFields.Double("mlWeight")
internal val ML_WEIGHT_KEY: DoubleEventField = EventFields.Double("ml_weight")
internal val PRIORITY_KEY: IntEventField = EventFields.Int("priority", "The final priority used for sorting elements")
internal val CONTRIBUTOR_FEATURES_LIST = ObjectListEventField(
"contributors",
@@ -218,7 +219,7 @@ object SearchEverywhereMLStatisticsCollector : CounterUsagesCollector() {
"Contributor name that provided the element")
val COLLECTED_RESULTS_DATA_KEY: ObjectListEventField = ObjectListEventField(
"collectedItems",
"collected_items",
ID_KEY, ELEMENT_CONTRIBUTOR, ACTION_ID_KEY,
FEATURES_DATA_KEY, ML_WEIGHT_KEY, PRIORITY_KEY,
)
@@ -226,7 +227,7 @@ object SearchEverywhereMLStatisticsCollector : CounterUsagesCollector() {
private val CLASSES_WITHOUT_KEY_PROVIDERS_FIELD = ClassListEventField("unsupported_classes")
// region Events
internal val SESSION_STARTED: VarargEventId = GROUP.registerVarargEvent("sessionStarted",
internal val SESSION_STARTED: VarargEventId = GROUP.registerVarargEvent("session.started",
"An event denoting a start of Search Everywhere session",
SESSION_ID, IS_PROJECT_OPEN,
SE_TAB_ID_KEY, EXPERIMENT_GROUP, EXPERIMENT_VERSION,
@@ -236,7 +237,7 @@ object SearchEverywhereMLStatisticsCollector : CounterUsagesCollector() {
IS_MIXED_LIST,
*SearchEverywhereContextFeaturesProvider.getContextFields().toTypedArray())
internal val STATE_CHANGED: VarargEventId = GROUP.registerVarargEvent("stateChanged",
internal val STATE_CHANGED: VarargEventId = GROUP.registerVarargEvent("state.changed",
"An event denoting change of the search state",
SESSION_ID, SEARCH_INDEX_DATA_KEY,
ORDER_BY_ML_GROUP,
@@ -244,13 +245,13 @@ object SearchEverywhereMLStatisticsCollector : CounterUsagesCollector() {
TIME_TO_FIRST_RESULT_DATA_KEY, REBUILD_REASON_KEY,
SEARCH_STATE_FEATURES_DATA_KEY, COLLECTED_RESULTS_DATA_KEY,
CONTRIBUTOR_FEATURES_LIST)
internal val ITEM_SELECTED: VarargEventId = GROUP.registerVarargEvent("itemSelected",
internal val ITEM_SELECTED: VarargEventId = GROUP.registerVarargEvent("item.selected",
"An event denoting selection of an item from search results",
SESSION_ID, SEARCH_INDEX_DATA_KEY,
SELECTED_INDEX)
@VisibleForTesting
val SESSION_FINISHED: VarargEventId = GROUP.registerVarargEvent("sessionFinished",
val SESSION_FINISHED: VarargEventId = GROUP.registerVarargEvent("session.finished",
"An event denoting finish of a session and closing of a popup",
SESSION_ID,
SESSION_DURATION, SE_TAB_ID_KEY)
@@ -31,21 +31,21 @@ import com.intellij.usages.impl.ScopeRuleValidator
internal class CoreStateFeaturesProvider : SearchEverywhereStateFeaturesProvider {
object Fields {
val QUERY_LENGTH_DATA_KEY = EventFields.Int("queryLength")
val IS_EMPTY_QUERY_DATA_KEY = EventFields.Boolean("isEmptyQuery")
val QUERY_CONTAINS_PATH_DATA_KEY = EventFields.Boolean("queryContainsPath")
val QUERY_CONTAINS_COMMAND_CHAR_DATA_KEY = EventFields.Boolean("queryContainsCommandChar")
val QUERY_CONTAINS_SPACES_DATA_KEY = EventFields.Boolean("queryContainsSpaces")
val QUERY_IS_CAMEL_CASE_DATA_KEY = EventFields.Boolean("queryIsCamelCase")
val QUERY_CONTAINS_ABBREVIATIONS_DATA_KEY = EventFields.Boolean("queryContainsAbbreviations")
val QUERY_IS_ALL_UPPERCASE_DATA_KEY = EventFields.Boolean("queryIsAllUppercase")
val IS_DUMB_MODE = EventFields.Boolean("isDumbMode")
val SEARCH_SCOPE_DATA_KEY = EventFields.StringValidatedByCustomRule("searchScope", ScopeRuleValidator::class.java)
val IS_SEARCH_EVERYWHERE_DATA_KEY = EventFields.Boolean("isSearchEverywhere")
val QUERY_LENGTH_DATA_KEY = EventFields.Int("query_length")
val IS_EMPTY_QUERY_DATA_KEY = EventFields.Boolean("is_empty_query")
val QUERY_CONTAINS_PATH_DATA_KEY = EventFields.Boolean("query_contains_path")
val QUERY_CONTAINS_COMMAND_CHAR_DATA_KEY = EventFields.Boolean("query_contains_command_char")
val QUERY_CONTAINS_SPACES_DATA_KEY = EventFields.Boolean("query_contains_spaces")
val QUERY_IS_CAMEL_CASE_DATA_KEY = EventFields.Boolean("query_is_camel_case")
val QUERY_CONTAINS_ABBREVIATIONS_DATA_KEY = EventFields.Boolean("query_contains_abbreviations")
val QUERY_IS_ALL_UPPERCASE_DATA_KEY = EventFields.Boolean("query_is_all_uppercase")
val IS_DUMB_MODE = EventFields.Boolean("is_dumb_mode")
val SEARCH_SCOPE_DATA_KEY = EventFields.StringValidatedByCustomRule("search_scope", ScopeRuleValidator::class.java)
val IS_SEARCH_EVERYWHERE_DATA_KEY = EventFields.Boolean("is_search_everywhere")
val IS_CASE_SENSITIVE = EventFields.Boolean("isCaseSensitive")
val IS_WHOLE_WORDS_ONLY = EventFields.Boolean("isWholeWordsOnly")
val IS_REGULAR_EXPRESSIONS = EventFields.Boolean("isRegularExpressions")
val IS_CASE_SENSITIVE = EventFields.Boolean("is_case_sensitive")
val IS_WHOLE_WORDS_ONLY = EventFields.Boolean("is_whole_words_only")
val IS_REGULAR_EXPRESSIONS = EventFields.Boolean("is_regular_expressions")
}
override val fields: List<EventField<*>> = listOf(
@@ -35,17 +35,17 @@ internal abstract class GlobalStatisticsFields(
}
internal class ContributorsGlobalStatisticsFields : GlobalStatisticsFields(
globalEventCountFieldName = "globalSelections",
globalEventCountToMaxFieldName = "globalSelectionsToMax",
usersRatioFieldName = "usersRatio",
eventPerUserRatioFieldName = "selectionsPerUserRatio"
globalEventCountFieldName = "global_selections",
globalEventCountToMaxFieldName = "global_selections_to_max",
usersRatioFieldName = "users_ratio",
eventPerUserRatioFieldName = "selections_per_user_ratio"
)
internal class ActionsGlobalStatisticsFields(version: Int? = null) : GlobalStatisticsFields(
globalEventCountFieldName = "globalUsage${versionSuffix(version)}",
globalEventCountToMaxFieldName = "globalUsageToMax${versionSuffix(version)}",
usersRatioFieldName = "usersRatio${versionSuffix(version)}",
eventPerUserRatioFieldName = "usagesPerUserRatio${versionSuffix(version)}"
globalEventCountFieldName = "global_usage${versionSuffix(version)}",
globalEventCountToMaxFieldName = "global_usage_to_max${versionSuffix(version)}",
usersRatioFieldName = "users_ratio${versionSuffix(version)}",
eventPerUserRatioFieldName = "usages_per_user_ratio${versionSuffix(version)}"
)
internal abstract class GlobalStatisticsContextFields(
@@ -66,15 +66,15 @@ internal abstract class GlobalStatisticsContextFields(
}
internal class ActionsGlobalStatisticsContextFields(version: Int? = null) : GlobalStatisticsContextFields(
globalMaxEventCountFieldName = "globalMaxUsage${versionSuffix(version)}",
globalMinEventCountFieldName = "globalMinUsage${versionSuffix(version)}"
globalMaxEventCountFieldName = "global_max_usage${versionSuffix(version)}",
globalMinEventCountFieldName = "global_min_usage${versionSuffix(version)}"
)
internal class ContributorsGlobalStatisticsContextFields : GlobalStatisticsContextFields(
globalMaxEventCountFieldName = "globalMaxSelection",
globalMinEventCountFieldName = "globalMinSelection"
globalMaxEventCountFieldName = "global_max_selection",
globalMinEventCountFieldName = "global_min_selection"
)
private fun versionSuffix(version: Int?): String {
return version?.let { "V$it" } ?: ""
return version?.let { "_v$it" } ?: ""
}
@@ -53,38 +53,38 @@ import com.intellij.util.Time
internal class SearchEverywhereActionFeaturesProvider :
SearchEverywhereElementFeaturesProvider(ActionSearchEverywhereContributor::class.java, TopHitSEContributor::class.java) {
object Fields {
internal val IS_ACTION_DATA_KEY = EventFields.Boolean("isAction")
internal val IS_TOGGLE_ACTION_DATA_KEY = EventFields.Boolean("isToggleAction")
internal val IS_EDITOR_ACTION = EventFields.Boolean("isEditorAction")
internal val IS_SEARCH_ACTION = EventFields.Boolean("isSearchAction")
internal val IS_ACTION_DATA_KEY = EventFields.Boolean("is_action")
internal val IS_TOGGLE_ACTION_DATA_KEY = EventFields.Boolean("is_toggle_action")
internal val IS_EDITOR_ACTION = EventFields.Boolean("is_editor_action")
internal val IS_SEARCH_ACTION = EventFields.Boolean("is_search_action")
internal val MATCH_MODE_KEY = EventFields.Enum<MatchMode>("matchMode")
internal val TEXT_LENGTH_KEY = EventFields.Int("textLength")
internal val IS_GROUP_KEY = EventFields.Boolean("isGroup")
internal val GROUP_LENGTH_KEY = EventFields.Int("groupLength")
internal val HAS_ICON_KEY = EventFields.Boolean("withIcon")
internal val PLUGIN_TYPE = EventFields.StringValidatedByEnum("pluginType", "plugin_type")
internal val PLUGIN_ID = EventFields.StringValidatedByCustomRule("pluginId", PluginIdRuleValidator::class.java)
internal val MATCH_MODE_KEY = EventFields.Enum<MatchMode>("match_mode")
internal val TEXT_LENGTH_KEY = EventFields.Int("text_length")
internal val IS_GROUP_KEY = EventFields.Boolean("is_group")
internal val GROUP_LENGTH_KEY = EventFields.Int("group_length")
internal val HAS_ICON_KEY = EventFields.Boolean("with_icon")
internal val PLUGIN_TYPE = EventFields.StringValidatedByEnum("plugin_type", "plugin_type")
internal val PLUGIN_ID = EventFields.StringValidatedByCustomRule("plugin_id", PluginIdRuleValidator::class.java)
internal val GLOBAL_STATISTICS_DEFAULT = ActionsGlobalStatisticsFields(ActionsGlobalSummaryManager.STATISTICS_VERSION)
internal val GLOBAL_STATISTICS_UPDATED = ActionsGlobalStatisticsFields(ActionsGlobalSummaryManager.UPDATED_STATISTICS_VERSION)
internal val USAGE = EventFields.Int("usage")
internal val USAGE_SE = EventFields.Int("usageSe")
internal val USAGE_TO_MAX = EventFields.Double("usageToMax")
internal val USAGE_TO_MAX_SE = EventFields.Double("usageToMaxSe")
internal val USAGE_SE = EventFields.Int("usage_se")
internal val USAGE_TO_MAX = EventFields.Double("usage_to_max")
internal val USAGE_TO_MAX_SE = EventFields.Double("usage_to_max_se")
internal val TIME_SINCE_LAST_USAGE = EventFields.Long("timeSinceLastUsage")
internal val TIME_SINCE_LAST_USAGE_SE = EventFields.Long("timeSinceLastUsageSe")
internal val WAS_USED_IN_LAST_MINUTE = EventFields.Boolean("wasUsedInLastMinute")
internal val WAS_USED_IN_LAST_MINUTE_SE = EventFields.Boolean("wasUsedInLastMinuteSe")
internal val WAS_USED_IN_LAST_HOUR = EventFields.Boolean("wasUsedInLastHour")
internal val WAS_USED_IN_LAST_HOUR_SE = EventFields.Boolean("wasUsedInLastHourSe")
internal val WAS_USED_IN_LAST_DAY = EventFields.Boolean("wasUsedInLastDay")
internal val WAS_USED_IN_LAST_DAY_SE = EventFields.Boolean("wasUsedInLastDaySe")
internal val WAS_USED_IN_LAST_MONTH = EventFields.Boolean("wasUsedInLastMonth")
internal val WAS_USED_IN_LAST_MONTH_SE = EventFields.Boolean("wasUsedInLastMonthSe")
internal val TIME_SINCE_LAST_USAGE = EventFields.Long("time_since_last_usage")
internal val TIME_SINCE_LAST_USAGE_SE = EventFields.Long("time_since_last_usage_se")
internal val WAS_USED_IN_LAST_MINUTE = EventFields.Boolean("was_used_in_last_minute")
internal val WAS_USED_IN_LAST_MINUTE_SE = EventFields.Boolean("was_used_in_last_minute_se")
internal val WAS_USED_IN_LAST_HOUR = EventFields.Boolean("was_used_in_last_hour")
internal val WAS_USED_IN_LAST_HOUR_SE = EventFields.Boolean("was_used_in_last_hour_se")
internal val WAS_USED_IN_LAST_DAY = EventFields.Boolean("was_used_in_last_day")
internal val WAS_USED_IN_LAST_DAY_SE = EventFields.Boolean("was_used_in_last_day_se")
internal val WAS_USED_IN_LAST_MONTH = EventFields.Boolean("was_used_in_last_month")
internal val WAS_USED_IN_LAST_MONTH_SE = EventFields.Boolean("was_used_in_last_month_se")
}
override fun getFeaturesDeclarations(): List<EventField<*>> {
@@ -15,7 +15,7 @@ import org.jetbrains.annotations.ApiStatus
@ApiStatus.Internal
class SearchEverywhereClassFeaturesProvider : SearchEverywhereElementFeaturesProvider(ClassSearchEverywhereContributor::class.java) {
object Fields {
val IS_DEPRECATED = EventFields.Boolean("isDeprecated")
val IS_DEPRECATED = EventFields.Boolean("is_deprecated")
}
override fun getFeaturesDeclarations(): List<EventField<*>> {
@@ -62,39 +62,39 @@ class SearchEverywhereClassOrFileFeaturesProvider : SearchEverywhereElementFeatu
RecentFilesSEContributor::class.java
) {
object Fields {
val IS_ACCESSIBLE_FROM_MODULE = EventFields.Boolean("isAccessibleFromModule")
val IS_ACCESSIBLE_FROM_MODULE = EventFields.Boolean("is_accessible_from_module")
val IS_SAME_MODULE_DATA_KEY = EventFields.Boolean("isSameModule")
val IS_SAME_MODULE_DATA_KEY = EventFields.Boolean("is_same_module")
val DIRECTORY_DEPTH_DATA_KEY = EventFields.Int("directoryDepth")
val IS_SAME_FILETYPE_AS_OPENED_FILE_DATA_KEY = EventFields.Boolean("isSameFileTypeAsOpenedFile")
val DIRECTORY_DEPTH_DATA_KEY = EventFields.Int("directory_depth")
val IS_SAME_FILETYPE_AS_OPENED_FILE_DATA_KEY = EventFields.Boolean("is_same_file_type_as_opened_file")
val IS_IN_SOURCE_DATA_KEY = EventFields.Boolean("isInSource")
val IS_IN_TEST_SOURCES_DATA_KEY = EventFields.Boolean("isInTestSources")
val IS_IN_LIBRARY_DATA_KEY = EventFields.Boolean("isFromLibrary")
val IS_EXCLUDED_DATA_KEY = EventFields.Boolean("isInExcluded")
val IS_IN_SOURCE_DATA_KEY = EventFields.Boolean("is_in_source")
val IS_IN_TEST_SOURCES_DATA_KEY = EventFields.Boolean("is_in_test_sources")
val IS_IN_LIBRARY_DATA_KEY = EventFields.Boolean("is_in_library")
val IS_EXCLUDED_DATA_KEY = EventFields.Boolean("is_in_excluded")
val FILETYPE_USAGE_RATIO_DATA_KEY = EventFields.Double("fileTypeUsageRatio")
val FILETYPE_USAGE_RATIO_TO_MAX_DATA_KEY = EventFields.Double("fileTypeUsageRatioToMax")
val FILETYPE_USAGE_RATIO_TO_MIN_DATA_KEY = EventFields.Double("fileTypeUsageRatioToMin")
val TIME_SINCE_LAST_FILETYPE_USAGE_DATA_KEY = EventFields.Long("timeSinceLastFileTypeUsage")
val FILETYPE_USED_IN_LAST_MINUTE_DATA_KEY = EventFields.Boolean("fileTypeUsedInLastMinute")
val FILETYPE_USED_IN_LAST_HOUR_DATA_KEY = EventFields.Boolean("fileTypeUsedInLastHour")
val FILETYPE_USED_IN_LAST_DAY_DATA_KEY = EventFields.Boolean("fileTypeUsedInLastDay")
val FILETYPE_USED_IN_LAST_MONTH_DATA_KEY = EventFields.Boolean("fileTypeUsedInLastMonth")
val FILETYPE_USAGE_RATIO_DATA_KEY = EventFields.Double("file_type_usage_ratio")
val FILETYPE_USAGE_RATIO_TO_MAX_DATA_KEY = EventFields.Double("file_type_usage_ratio_to_max")
val FILETYPE_USAGE_RATIO_TO_MIN_DATA_KEY = EventFields.Double("file_type_usage_ratio_to_min")
val TIME_SINCE_LAST_FILETYPE_USAGE_DATA_KEY = EventFields.Long("time_since_last_file_type_usage")
val FILETYPE_USED_IN_LAST_MINUTE_DATA_KEY = EventFields.Boolean("file_type_used_in_last_minute")
val FILETYPE_USED_IN_LAST_HOUR_DATA_KEY = EventFields.Boolean("file_type_used_in_last_hour")
val FILETYPE_USED_IN_LAST_DAY_DATA_KEY = EventFields.Boolean("file_type_used_in_last_day")
val FILETYPE_USED_IN_LAST_MONTH_DATA_KEY = EventFields.Boolean("file_type_used_in_last_month")
val RECENT_INDEX_DATA_KEY = EventFields.Int("recentFilesIndex")
val PREDICTION_SCORE_DATA_KEY = EventFields.Double("predictionScore")
val RECENT_INDEX_DATA_KEY = EventFields.Int("recent_files_index")
val PREDICTION_SCORE_DATA_KEY = EventFields.Double("prediction_score")
val IS_OPENED_DATA_KEY = EventFields.Boolean("isOpened")
val IS_OPENED_DATA_KEY = EventFields.Boolean("is_opened")
val TIME_SINCE_LAST_MODIFICATION_DATA_KEY = EventFields.Long("timeSinceLastModification")
val WAS_MODIFIED_IN_LAST_MINUTE_DATA_KEY = EventFields.Boolean("wasModifiedInLastMinute")
val WAS_MODIFIED_IN_LAST_HOUR_DATA_KEY = EventFields.Boolean("wasModifiedInLastHour")
val WAS_MODIFIED_IN_LAST_DAY_DATA_KEY = EventFields.Boolean("wasModifiedInLastDay")
val WAS_MODIFIED_IN_LAST_MONTH_DATA_KEY = EventFields.Boolean("wasModifiedInLastMonth")
val TIME_SINCE_LAST_MODIFICATION_DATA_KEY = EventFields.Long("time_since_last_modification")
val WAS_MODIFIED_IN_LAST_MINUTE_DATA_KEY = EventFields.Boolean("was_modified_in_last_minute")
val WAS_MODIFIED_IN_LAST_HOUR_DATA_KEY = EventFields.Boolean("was_modified_in_last_hour")
val WAS_MODIFIED_IN_LAST_DAY_DATA_KEY = EventFields.Boolean("was_modified_in_last_day")
val WAS_MODIFIED_IN_LAST_MONTH_DATA_KEY = EventFields.Boolean("was_modified_in_last_month")
val ALL_INITIAL_LETTERS_MATCH_DATA_KEY = EventFields.Boolean("allInitialLettersMatch")
val ALL_INITIAL_LETTERS_MATCH_DATA_KEY = EventFields.Boolean("all_initial_letters_match")
}
override fun getFeaturesDeclarations(): List<EventField<*>> {
@@ -17,14 +17,14 @@ import com.intellij.searchEverywhereMl.ranking.core.features.statistician.Search
internal class SearchEverywhereCommonFeaturesProvider : SearchEverywhereElementFeaturesProvider() {
object Fields {
internal val PRIORITY_DATA_KEY = EventFields.Int("heuristicPriority")
internal val PRIORITY_DATA_KEY = EventFields.Int("heuristic_priority")
internal val STATISTICIAN_USE_COUNT_DATA_KEY = EventFields.Int("statUseCount")
internal val STATISTICIAN_IS_MOST_POPULAR_DATA_KEY = EventFields.Boolean("statIsMostPopular")
internal val STATISTICIAN_RECENCY_DATA_KEY = EventFields.Int("statRecency")
internal val STATISTICIAN_IS_MOST_RECENT_DATA_KEY = EventFields.Boolean("statIsMostRecent")
internal val IS_SPELL_CHECKED_DATA_KEY = EventFields.Boolean("isSpellChecked")
internal val CORRECTION_CONFIDENCE_DATA_KEY = EventFields.Double("correctionConfidence")
internal val STATISTICIAN_USE_COUNT_DATA_KEY = EventFields.Int("stat_use_count")
internal val STATISTICIAN_IS_MOST_POPULAR_DATA_KEY = EventFields.Boolean("stat_is_most_popular")
internal val STATISTICIAN_RECENCY_DATA_KEY = EventFields.Int("stat_recency")
internal val STATISTICIAN_IS_MOST_RECENT_DATA_KEY = EventFields.Boolean("stat_is_most_recent")
internal val IS_SPELL_CHECKED_DATA_KEY = EventFields.Boolean("is_spell_checked")
internal val CORRECTION_CONFIDENCE_DATA_KEY = EventFields.Double("correction_confidence")
}
override fun isContributorSupported(contributorId: String): Boolean = true
@@ -17,10 +17,10 @@ import com.intellij.searchEverywhereMl.ranking.core.features.statistician.Contri
internal class SearchEverywhereContextFeaturesProvider {
companion object {
internal val LOCAL_MAX_USAGE_COUNT_KEY = EventFields.Int("maxUsage")
internal val LOCAL_MIN_USAGE_COUNT_KEY = EventFields.Int("minUsage")
internal val LOCAL_MAX_USAGE_SE_COUNT_KEY = EventFields.Int("maxUsageSE")
internal val LOCAL_MIN_USAGE_SE_COUNT_KEY = EventFields.Int("minUsageSE")
internal val LOCAL_MAX_USAGE_COUNT_KEY = EventFields.Int("max_usage")
internal val LOCAL_MIN_USAGE_COUNT_KEY = EventFields.Int("min_usage")
internal val LOCAL_MAX_USAGE_SE_COUNT_KEY = EventFields.Int("max_usage_se")
internal val LOCAL_MIN_USAGE_SE_COUNT_KEY = EventFields.Int("min_usage_se")
private val ACTIONS_GLOBAL_STATISTICS_CONTEXT_DEFAULT = ActionsGlobalStatisticsContextFields(ActionsGlobalSummaryManager.STATISTICS_VERSION)
private val ACTIONS_GLOBAL_STATISTICS_CONTEXT_UPDATED = ActionsGlobalStatisticsContextFields(ActionsGlobalSummaryManager.UPDATED_STATISTICS_VERSION)
@@ -28,9 +28,9 @@ internal class SearchEverywhereContextFeaturesProvider {
private val CONTRIBUTORS_LOCAL_STATISTICS_CONTEXT = ContributorsLocalStatisticsContextFields()
internal val OPEN_FILE_TYPES_KEY = EventFields.StringListValidatedByCustomRule("openFileTypes", FileTypeUsagesCollector.ValidationRule::class.java)
internal val NUMBER_OF_OPEN_EDITORS_KEY = EventFields.Int("numberOfOpenEditors")
internal val IS_SINGLE_MODULE_PROJECT = EventFields.Boolean("isSingleModuleProject")
internal val OPEN_FILE_TYPES_KEY = EventFields.StringListValidatedByCustomRule("open_file_types", FileTypeUsagesCollector.ValidationRule::class.java)
internal val NUMBER_OF_OPEN_EDITORS_KEY = EventFields.Int("number_of_open_editors")
internal val IS_SINGLE_MODULE_PROJECT = EventFields.Boolean("is_single_module_project")
internal fun getContextFields(): List<EventField<*>> {
return buildList {
@@ -15,13 +15,13 @@ import com.intellij.searchEverywhereMl.ranking.core.features.statistician.Contri
import com.intellij.searchEverywhereMl.ranking.core.features.statistician.getContributorStatistics
internal object SearchEverywhereContributorFeaturesProvider {
val CONTRIBUTOR_INFO_ID = EventFields.String("contributorId", ALLOWED_CONTRIBUTOR_ID_LIST)
val CONTRIBUTOR_PRIORITY = EventFields.Int("contributorPriority")
val CONTRIBUTOR_WEIGHT = EventFields.Int("contributorWeight")
val CONTRIBUTOR_IS_MOST_POPULAR = EventFields.Boolean("contributorIsMostPopular")
val CONTRIBUTOR_POPULARITY_INDEX = EventFields.Int("contributorPopularityIndex")
val IS_ESSENTIAL_CONTRIBUTOR = EventFields.Boolean("contributorIsEssential")
val ESSENTIAL_CONTRIBUTOR_PREDICTION = EventFields.Float("contributorIsEssentialPrediction")
val CONTRIBUTOR_INFO_ID = EventFields.String("contributor_id", ALLOWED_CONTRIBUTOR_ID_LIST)
val CONTRIBUTOR_PRIORITY = EventFields.Int("contributor_priority")
val CONTRIBUTOR_WEIGHT = EventFields.Int("contributor_weight")
val CONTRIBUTOR_IS_MOST_POPULAR = EventFields.Boolean("contributor_is_most_popular")
val CONTRIBUTOR_POPULARITY_INDEX = EventFields.Int("contributor_popularity_index")
val IS_ESSENTIAL_CONTRIBUTOR = EventFields.Boolean("contributor_is_essential")
val ESSENTIAL_CONTRIBUTOR_PREDICTION = EventFields.Float("contributor_is_essential_prediction")
private val LOCAL_STATISTICS = ContributorsLocalStatisticsFields()
private val GLOBAL_STATISTICS = ContributorsGlobalStatisticsFields()
@@ -31,46 +31,48 @@ abstract class SearchEverywhereElementFeaturesProvider(private val supportedCont
}
}
internal val NAME_LENGTH = EventFields.RoundedInt("nameLength")
internal val ML_SCORE_KEY = EventFields.Double("mlScore")
internal val SIMILARITY_SCORE = EventFields.Double("similarityScore")
internal val IS_SEMANTIC_ONLY = EventFields.Boolean("isSemanticOnly")
internal val BUFFERED_TIMESTAMP = EventFields.Long("bufferedTimestamp")
internal val NAME_LENGTH = EventFields.RoundedInt("name_length")
internal val ML_SCORE_KEY = EventFields.Double("ml_score")
internal val SIMILARITY_SCORE = EventFields.Double("similarity_score")
internal val IS_SEMANTIC_ONLY = EventFields.Boolean("is_semantic_only")
internal val BUFFERED_TIMESTAMP = EventFields.Long("buffered_timestamp")
internal val PREFIX_SAME_START_COUNT = EventFields.Int("prefix_same_start_count")
internal val PREFIX_GREEDY_SCORE = EventFields.Double("prefix_greedy_score")
internal val PREFIX_GREEDY_WITH_CASE_SCORE = EventFields.Double("prefix_greedy_with_case_score")
internal val PREFIX_MATCHED_WORDS_SCORE = EventFields.Double("prefix_matched_words_score")
internal val PREFIX_MATCHED_WORDS_RELATIVE = EventFields.Double("prefix_matched_words_relative")
internal val PREFIX_MATCHED_WORDS_WITH_CASE_SCORE = EventFields.Double("prefix_matched_words_with_case_score")
internal val PREFIX_MATCHED_WORDS_WITH_CASE_RELATIVE = EventFields.Double("prefix_matched_words_with_case_relative")
internal val PREFIX_SKIPPED_WORDS = EventFields.Int("prefix_skipped_words")
internal val PREFIX_MATCHING_TYPE = EventFields.String(
"prefix_matching_type", PrefixMatchingType.entries.map { it.name }
)
internal val PREFIX_EXACT = EventFields.Boolean("prefix_exact")
internal val PREFIX_MATCHED_LAST_WORD = EventFields.Boolean("prefix_matched_last_word")
internal val prefixMatchingNameFeatureToField = hashMapOf<String, EventField<*>>(
"prefix_same_start_count" to EventFields.Int("${PrefixMatchingUtil.baseName}SameStartCount"),
"prefix_greedy_score" to EventFields.Double("${PrefixMatchingUtil.baseName}GreedyScore"),
"prefix_greedy_with_case_score" to EventFields.Double("${PrefixMatchingUtil.baseName}GreedyWithCaseScore"),
"prefix_matched_words_score" to EventFields.Double("${PrefixMatchingUtil.baseName}MatchedWordsScore"),
"prefix_matched_words_relative" to EventFields.Double("${PrefixMatchingUtil.baseName}MatchedWordsRelative"),
"prefix_matched_words_with_case_score" to EventFields.Double("${PrefixMatchingUtil.baseName}MatchedWordsWithCaseScore"),
"prefix_matched_words_with_case_relative" to EventFields.Double("${PrefixMatchingUtil.baseName}MatchedWordsWithCaseRelative"),
"prefix_skipped_words" to EventFields.Int("${PrefixMatchingUtil.baseName}SkippedWords"),
"prefix_matching_type" to EventFields.String(
"${PrefixMatchingUtil.baseName}MatchingType", PrefixMatchingType.entries.map { it.name }
),
"prefix_exact" to EventFields.Boolean("${PrefixMatchingUtil.baseName}Exact"),
"prefix_matched_last_word" to EventFields.Boolean("${PrefixMatchingUtil.baseName}MatchedLastWord"),
)
internal val wholeMatchingNameFeatureToField = hashMapOf<String, EventField<*>>(
"levenshtein_distance" to EventFields.Double("${WholeTextMatchUtil.baseName}LevenshteinDistance",
"Levenshtein distance normalized by query lengths"),
"levenshtein_distance_case_insensitive" to
EventFields.Double("${WholeTextMatchUtil.baseName}LevenshteinDistanceCaseInsensitive",
"Levenshtein distance with case insensitive matching, normalized by query length"),
"words_in_query" to EventFields.Int("${WholeTextMatchUtil.baseName}WordsInQuery", "Number of words in the query"),
"words_in_element" to EventFields.Int("${WholeTextMatchUtil.baseName}WordsInElement", "Number of words in the element text"),
"exactly_matched_words" to EventFields.Int("${WholeTextMatchUtil.baseName}ExactlyMatchedWords")
)
internal val WHOLE_LEVENSHTEIN_DISTANCE = EventFields.Double("levenshtein_distance",
"Levenshtein distance normalized by query lengths")
internal val WHOLE_LEVENSHTEIN_DISTANCE_CASE_INSENSITIVE =
EventFields.Double("levenshtein_distance_case_insensitive",
"Levenshtein distance with case insensitive matching, normalized by query length")
internal val WHOLE_WORDS_IN_QUERY = EventFields.Int("words_in_query", "Number of words in the query")
internal val WHOLE_WORDS_IN_ELEMENT = EventFields.Int("words_in_element", "Number of words in the element text")
internal val WHOLE_EXACTLY_MATCHED_WORDS = EventFields.Int("exactly_matched_words")
fun getDefaultFields(): List<EventField<*>> {
return listOf(NAME_LENGTH, ML_SCORE_KEY, SIMILARITY_SCORE, IS_SEMANTIC_ONLY, BUFFERED_TIMESTAMP) +
prefixMatchingNameFeatureToField.values + wholeMatchingNameFeatureToField.values
return listOf(
NAME_LENGTH, ML_SCORE_KEY, SIMILARITY_SCORE, IS_SEMANTIC_ONLY, BUFFERED_TIMESTAMP,
PREFIX_SAME_START_COUNT, PREFIX_GREEDY_SCORE, PREFIX_GREEDY_WITH_CASE_SCORE,
PREFIX_MATCHED_WORDS_SCORE, PREFIX_MATCHED_WORDS_RELATIVE, PREFIX_MATCHED_WORDS_WITH_CASE_SCORE,
PREFIX_MATCHED_WORDS_WITH_CASE_RELATIVE, PREFIX_SKIPPED_WORDS, PREFIX_MATCHING_TYPE, PREFIX_EXACT,
PREFIX_MATCHED_LAST_WORD,
WHOLE_LEVENSHTEIN_DISTANCE, WHOLE_LEVENSHTEIN_DISTANCE_CASE_INSENSITIVE,
WHOLE_WORDS_IN_QUERY, WHOLE_WORDS_IN_ELEMENT, WHOLE_EXACTLY_MATCHED_WORDS
)
}
internal fun roundDouble(value: Double): Double {
if (!value.isFinite()) return -1.0
return round(value * 100000) / 100000
@@ -88,12 +90,14 @@ abstract class SearchEverywhereElementFeaturesProvider(private val supportedCont
abstract fun getFeaturesDeclarations(): List<EventField<*>>
abstract fun getElementFeatures(element: Any,
currentTime: Long,
searchQuery: String,
elementPriority: Int,
cache: FeaturesProviderCache?,
correction: SearchEverywhereSpellCheckResult): List<EventPair<*>>
abstract fun getElementFeatures(
element: Any,
currentTime: Long,
searchQuery: String,
elementPriority: Int,
cache: FeaturesProviderCache?,
correction: SearchEverywhereSpellCheckResult,
): List<EventPair<*>>
protected fun withUpperBound(value: Int): Int {
if (value > 100) return 101
@@ -101,23 +105,26 @@ abstract class SearchEverywhereElementFeaturesProvider(private val supportedCont
}
protected fun getNameMatchingFeatures(nameOfFoundElement: String, searchQuery: String): Collection<EventPair<*>> {
// For a quicker lookup
val nameToFeature = getDefaultFields()
.associateBy { it.name }
return buildList {
buildMap {
PrefixMatchingUtil.calculateFeatures(nameOfFoundElement, searchQuery, this)
putAll(
WholeTextMatchUtil.calculateFeatures(nameOfFoundElement, searchQuery)
)
}.map { (featureName, value) ->
val field = prefixMatchingNameFeatureToField[featureName]
setMatchValueToField(value, field)
}.filterNotNull()
.forEach {
val field = nameToFeature.getValue(featureName)
field.tryWith(value)
}.forEach {
add(it)
}
add(NAME_LENGTH.with(nameOfFoundElement.length))
addAll(WholeTextMatchUtil.calculateFeatures(nameOfFoundElement, searchQuery).map { (key, value) ->
setMatchValueToField(value, wholeMatchingNameFeatureToField[key])
}.filterNotNull())
}
}
@@ -125,21 +132,14 @@ abstract class SearchEverywhereElementFeaturesProvider(private val supportedCont
return searchEverywhereMlRankingService?.getCurrentSession()?.getSearchQueryEmbedding(queryText, split)
}
internal fun setMatchValueToField(matchValue: Any,
field: EventField<*>?): EventPair<*>? {
if (matchValue is Boolean && field is BooleanEventField) {
return field.with(matchValue)
fun EventField<*>.tryWith(value: Any): EventPair<*> {
return when (this) {
is BooleanEventField -> this.with(value as Boolean)
is DoubleEventField -> this.with(value as Double)
is IntEventField -> this.with(value as Int)
is StringEventField -> this.with(value.toString())
else -> throw IllegalArgumentException("Could not associate a value with unsupported field type: ${this::class.java}")
}
else if (matchValue is Double && field is DoubleEventField) {
return field.with(roundDouble(matchValue))
}
else if (matchValue is Int && field is IntEventField) {
return field.with(matchValue)
}
else if (matchValue is Enum<*> && field is StringEventField) {
return field.with(matchValue.toString())
}
return null
}
}
@@ -34,20 +34,20 @@ class SearchEverywhereFileFeaturesProvider
: SearchEverywhereElementFeaturesProvider(FileSearchEverywhereContributor::class.java, RecentFilesSEContributor::class.java) {
object Fields {
val FILETYPE_DATA_KEY = EventFields.StringValidatedByCustomRule("fileType", FileTypeUsagesCollector.ValidationRule::class.java)
val IS_BOOKMARK_DATA_KEY = EventFields.Boolean("isBookmark")
val FILETYPE_DATA_KEY = EventFields.StringValidatedByCustomRule("file_type", FileTypeUsagesCollector.ValidationRule::class.java)
val IS_BOOKMARK_DATA_KEY = EventFields.Boolean("is_bookmark")
val IS_DIRECTORY_DATA_KEY = EventFields.Boolean("isDirectory")
val IS_EXACT_MATCH_DATA_KEY = EventFields.Boolean("isExactMatch")
val FILETYPE_MATCHES_QUERY_DATA_KEY = EventFields.Boolean("fileTypeMatchesQuery")
val IS_TOP_LEVEL_DATA_KEY = EventFields.Boolean("isTopLevel")
val IS_EXACT_MATCH_WITH_REL_PATH_DATA_KEY = EventFields.Boolean("isExactRelativePath")
val IS_DIRECTORY_DATA_KEY = EventFields.Boolean("is_directory")
val IS_EXACT_MATCH_DATA_KEY = EventFields.Boolean("is_exact_match")
val FILETYPE_MATCHES_QUERY_DATA_KEY = EventFields.Boolean("file_type_matches_query")
val IS_TOP_LEVEL_DATA_KEY = EventFields.Boolean("is_top_level")
val IS_EXACT_MATCH_WITH_REL_PATH_DATA_KEY = EventFields.Boolean("is_exact_relative_path")
val REL_PATH_NAME_FEATURE_TO_FIELD = hashMapOf<String, EventField<*>>(
"prefix_same_start_count" to EventFields.Int("relPathPrefixSameStartCount"),
"prefix_greedy_score" to EventFields.Double("relPathPrefixGreedyScore"),
"prefix_matched_words_score" to EventFields.Double("relPathPrefixMatchedWordsScore"),
"prefix_matched_words_relative" to EventFields.Double("relPathPrefixMatchedWordsRelative")
"prefix_same_start_count" to EventFields.Int("rel_path_prefix_same_start_count"),
"prefix_greedy_score" to EventFields.Double("rel_path_prefix_greedy_score"),
"prefix_matched_words_score" to EventFields.Double("rel_path_prefix_matched_words_score"),
"prefix_matched_words_relative" to EventFields.Double("rel_path_prefix_matched_words_relative")
)
}
@@ -156,15 +156,11 @@ class SearchEverywhereFileFeaturesProvider
return buildList {
val prefixMatchingFeatures = buildMap {
buildMap {
PrefixMatchingUtil.calculateFeatures(relativePath.toString(), searchQuery, this)
}
REL_PATH_NAME_FEATURE_TO_FIELD.forEach { (key, field) ->
val matchValue = prefixMatchingFeatures[key] ?: return@forEach
setMatchValueToField(matchValue, field)?.let {
add(it)
}
}.mapNotNullTo(this@buildList) { (featureName, value) ->
val field = REL_PATH_NAME_FEATURE_TO_FIELD[featureName] ?: return@mapNotNullTo null
field.tryWith(value)
}
}
}
@@ -15,7 +15,7 @@ class SearchEverywhereFileGroupFeatureProvider : SearchEverywhereElementFeatures
RecentFilesSEContributor::class.java) {
object Fields {
val FILE_GROUP = EventFields.Enum("fileGroup", FileGroup::class.java)
val FILE_GROUP = EventFields.Enum("file_group", FileGroup::class.java)
}
override fun getFeaturesDeclarations(): List<EventField<*>> = listOf(FILE_GROUP)
@@ -21,11 +21,11 @@ import com.intellij.searchEverywhereMl.ranking.core.features.SearchEverywhereGen
internal class SearchEverywhereGeneralActionFeaturesProvider
: SearchEverywhereElementFeaturesProvider(ActionSearchEverywhereContributor::class.java, TopHitSEContributor::class.java) {
object Fields {
internal val IS_ENABLED = EventFields.Boolean("isEnabled")
internal val IS_ENABLED = EventFields.Boolean("is_enabled")
internal val ITEM_TYPE = EventFields.Enum<GotoActionModel.MatchedValueType>("type")
internal val TYPE_WEIGHT = EventFields.Int("typeWeight")
internal val IS_HIGH_PRIORITY = EventFields.Boolean("isHighPriority")
internal val TYPE_WEIGHT = EventFields.Int("type_weight")
internal val IS_HIGH_PRIORITY = EventFields.Boolean("is_high_priority")
}
override fun getFeaturesDeclarations(): List<EventField<*>> {
@@ -23,11 +23,11 @@ import com.intellij.searchEverywhereMl.ranking.core.features.SearchEverywhereOpt
internal class SearchEverywhereOptionFeaturesProvider :
SearchEverywhereElementFeaturesProvider(ActionSearchEverywhereContributor::class.java, TopHitSEContributor::class.java) {
object Fields {
internal val IS_OPTION = EventFields.Boolean("isOption")
internal val IS_BOOLEAN_OPTION = EventFields.Boolean("isBooleanOption")
internal val IS_REGISTRY_OPTION = EventFields.Boolean("isRegistryOption")
internal val IS_NOT_DEFAULT = EventFields.Boolean("isNotDefault")
internal val FROM_CONFIGURABLE = EventFields.Boolean("fromConfigurable")
internal val IS_OPTION = EventFields.Boolean("is_option")
internal val IS_BOOLEAN_OPTION = EventFields.Boolean("is_boolean_option")
internal val IS_REGISTRY_OPTION = EventFields.Boolean("is_registry_option")
internal val IS_NOT_DEFAULT = EventFields.Boolean("is_not_default")
internal val FROM_CONFIGURABLE = EventFields.Boolean("from_configurable")
}
override fun getFeaturesDeclarations(): List<EventField<*>> {
@@ -42,17 +42,17 @@ class SearchEverywherePsiElementFeaturesProvider : SearchEverywhereElementFeatur
) {
object Fields {
@JvmStatic
val IS_INVALID_DATA_KEY = EventFields.Boolean("isInvalid")
val IS_INVALID_DATA_KEY = EventFields.Boolean("is_invalid")
val LANGUAGE_DATA_KEY = EventFields.StringValidatedByCustomRule("language", LangCustomRuleValidator::class.java)
val LANGUAGE_USE_COUNT_DATA_KEY = EventFields.Int("langUseCount")
val LANGUAGE_IS_MOST_USED_DATA_KEY = EventFields.Boolean("langIsMostUsed")
val LANGUAGE_IS_IN_TOP_3_MOST_USED_DATA_KEY = EventFields.Boolean("langIsInTop3MostUsed")
val LANGUAGE_USED_IN_LAST_DAY = EventFields.Boolean("langUsedInLastDay")
val LANGUAGE_USED_IN_LAST_WEEK = EventFields.Boolean("langUsedInLastWeek")
val LANGUAGE_USED_IN_LAST_MONTH = EventFields.Boolean("langUsedInLastMonth")
val LANGUAGE_NEVER_USED_DATA_KEY = EventFields.Boolean("langNeverUsed")
val LANGUAGE_IS_SAME_AS_OPENED_FILE = EventFields.Boolean("langSameAsOpenedFile")
val LANGUAGE_USE_COUNT_DATA_KEY = EventFields.Int("lang_use_count")
val LANGUAGE_IS_MOST_USED_DATA_KEY = EventFields.Boolean("lang_is_most_used")
val LANGUAGE_IS_IN_TOP_3_MOST_USED_DATA_KEY = EventFields.Boolean("lang_is_in_top_3_most_used")
val LANGUAGE_USED_IN_LAST_DAY = EventFields.Boolean("lang_used_in_last_day")
val LANGUAGE_USED_IN_LAST_WEEK = EventFields.Boolean("lang_used_in_last_week")
val LANGUAGE_USED_IN_LAST_MONTH = EventFields.Boolean("lang_used_in_last_month")
val LANGUAGE_NEVER_USED_DATA_KEY = EventFields.Boolean("lang_never_used")
val LANGUAGE_IS_SAME_AS_OPENED_FILE = EventFields.Boolean("lang_same_as_opened_file")
}
override fun getFeaturesDeclarations(): List<EventField<*>> = listOf(
@@ -19,9 +19,9 @@ import com.intellij.searchEverywhereMl.ranking.core.features.SearchEverywhereRun
private class SearchEverywhereRunConfigurationFeaturesProvider
: SearchEverywhereElementFeaturesProvider(RunConfigurationsSEContributor::class.java) {
object Fields {
val IS_SHARED = EventFields.Boolean("isShared")
val IS_TEMPORARY = EventFields.Boolean("isTemporary")
val RUN_CONFIGURATION_TYPE = EventFields.StringValidatedByCustomRule("runConfigType", SearchEverywhereRunConfigurationTypeValidator::class.java)
val IS_SHARED = EventFields.Boolean("is_shared")
val IS_TEMPORARY = EventFields.Boolean("is_temporary")
val RUN_CONFIGURATION_TYPE = EventFields.StringValidatedByCustomRule("run_config_type", SearchEverywhereRunConfigurationTypeValidator::class.java)
}
override fun getFeaturesDeclarations(): List<EventField<*>> {
@@ -18,10 +18,10 @@ import com.intellij.searchEverywhereMl.ranking.core.features.statistician.Search
internal class SearchEverywhereSymbolFeaturesProvider
: SearchEverywhereElementFeaturesProvider(SymbolSearchEverywhereContributor::class.java) {
object Fields {
val PARENT_STAT_USE_COUNT_DATA_KEY = EventFields.Int("parentStatUseCount")
val PARENT_STAT_IS_MOST_POPULAR_DATA_KEY = EventFields.Boolean("parentStatIsMostPopular")
val PARENT_STAT_RECENCY_DATA_KEY = EventFields.Int("parentStatRecency")
val PARENT_STAT_IS_MOST_RECENT_DATA_KEY = EventFields.Boolean("parentStatIsMostRecent")
val PARENT_STAT_USE_COUNT_DATA_KEY = EventFields.Int("parent_stat_use_count")
val PARENT_STAT_IS_MOST_POPULAR_DATA_KEY = EventFields.Boolean("parent_stat_is_most_popular")
val PARENT_STAT_RECENCY_DATA_KEY = EventFields.Int("parent_stat_recency")
val PARENT_STAT_IS_MOST_RECENT_DATA_KEY = EventFields.Boolean("parent_stat_is_most_recent")
}
override fun getFeaturesDeclarations(): List<EventField<*>> {
@@ -46,6 +46,6 @@ internal class SearchEverywhereTextFeaturesProvider : SearchEverywhereElementFea
private object Fields {
val IS_IN_COMMENT = EventFields.Boolean("isInComment")
val IS_IN_COMMENT = EventFields.Boolean("is_in_comment")
}
}
@@ -11,20 +11,20 @@ import com.intellij.searchEverywhereMl.ranking.core.features.addIfTrue
internal class ContributorsLocalStatisticsFields {
companion object {
val SELECTION_ALL = EventFields.Int("selectionAll")
val SELECTION_OTHER = EventFields.Int("selectionOther")
val SELECTION_TO_MAX_ALL = EventFields.Double("selectionToMaxAll")
val SELECTION_TO_MAX_OTHER = EventFields.Double("selectionToMaxOther")
val TIME_SINCE_LAST_SELECTION_ALL = EventFields.Long("timeSinceLastSelectionAll")
val TIME_SINCE_LAST_SELECTION_OTHER = EventFields.Long("timeSinceLastSelectionOther")
val WAS_SELECTED_IN_LAST_MINUTE_ALL = EventFields.Boolean("wasSelectedInLastMinuteAll")
val WAS_SELECTED_IN_LAST_MINUTE_OTHER = EventFields.Boolean("wasSelectedInLastMinuteOther")
val WAS_SELECTED_IN_LAST_HOUR_ALL = EventFields.Boolean("wasSelectedInLastHourAll")
val WAS_SELECTED_IN_LAST_HOUR_OTHER = EventFields.Boolean("wasSelectedInLastHourOther")
val WAS_SELECTED_IN_LAST_DAY_ALL = EventFields.Boolean("wasSelectedInLastDayAll")
val WAS_SELECTED_IN_LAST_DAY_OTHER = EventFields.Boolean("wasSelectedInLastDayOther")
val WAS_SELECTED_IN_LAST_MONTH_ALL = EventFields.Boolean("wasSelectedInLastMonthAll")
val WAS_SELECTED_IN_LAST_MONTH_OTHER = EventFields.Boolean("wasSelectedInLastMonthOther")
val SELECTION_ALL = EventFields.Int("selection_all")
val SELECTION_OTHER = EventFields.Int("selection_other")
val SELECTION_TO_MAX_ALL = EventFields.Double("selection_to_max_all")
val SELECTION_TO_MAX_OTHER = EventFields.Double("selection_to_max_other")
val TIME_SINCE_LAST_SELECTION_ALL = EventFields.Long("time_since_last_selection_all")
val TIME_SINCE_LAST_SELECTION_OTHER = EventFields.Long("time_since_last_selection_other")
val WAS_SELECTED_IN_LAST_MINUTE_ALL = EventFields.Boolean("was_selected_in_last_minute_all")
val WAS_SELECTED_IN_LAST_MINUTE_OTHER = EventFields.Boolean("was_selected_in_last_minute_other")
val WAS_SELECTED_IN_LAST_HOUR_ALL = EventFields.Boolean("was_selected_in_last_hour_all")
val WAS_SELECTED_IN_LAST_HOUR_OTHER = EventFields.Boolean("was_selected_in_last_hour_other")
val WAS_SELECTED_IN_LAST_DAY_ALL = EventFields.Boolean("was_selected_in_last_day_all")
val WAS_SELECTED_IN_LAST_DAY_OTHER = EventFields.Boolean("was_selected_in_last_day_other")
val WAS_SELECTED_IN_LAST_MONTH_ALL = EventFields.Boolean("was_selected_in_last_month_all")
val WAS_SELECTED_IN_LAST_MONTH_OTHER = EventFields.Boolean("was_selected_in_last_month_other")
}
fun getFieldsDeclaration(): List<EventField<*>> = listOf(
@@ -102,10 +102,10 @@ internal class ContributorsLocalStatisticsFields {
internal class ContributorsLocalStatisticsContextFields {
companion object {
val MAX_SELECTION_ALL = EventFields.Int("maxSelectionAll")
val MIN_SELECTION_ALL = EventFields.Int("minSelectionAll")
val MAX_SELECTION_OTHER = EventFields.Int("maxSelectionOther")
val MIN_SELECTION_OTHER = EventFields.Int("minSelectionOther")
val MAX_SELECTION_ALL = EventFields.Int("max_selection_all")
val MIN_SELECTION_ALL = EventFields.Int("min_selection_all")
val MAX_SELECTION_OTHER = EventFields.Int("max_selection_other")
val MIN_SELECTION_OTHER = EventFields.Int("min_selection_other")
}
fun getFieldsDeclaration(): List<EventField<*>> = listOf(MAX_SELECTION_ALL, MIN_SELECTION_ALL, MAX_SELECTION_OTHER,
@@ -3,7 +3,11 @@ package com.intellij.searchEverywhereMl.ranking.core.model
import com.intellij.internal.ml.DecisionFunction
import com.intellij.internal.ml.FeatureMapper
import com.intellij.textMatching.WholeTextMatchUtil
import com.intellij.searchEverywhereMl.ranking.core.features.SearchEverywhereElementFeaturesProvider.Companion.WHOLE_EXACTLY_MATCHED_WORDS
import com.intellij.searchEverywhereMl.ranking.core.features.SearchEverywhereElementFeaturesProvider.Companion.WHOLE_LEVENSHTEIN_DISTANCE_CASE_INSENSITIVE
import com.intellij.searchEverywhereMl.ranking.core.features.SearchEverywhereElementFeaturesProvider.Companion.WHOLE_WORDS_IN_ELEMENT
import com.intellij.searchEverywhereMl.ranking.core.features.SearchEverywhereElementFeaturesProvider.Companion.WHOLE_WORDS_IN_QUERY
import com.intellij.searchEverywhereMl.ranking.core.features.SearchEverywhereFileFeaturesProvider.Fields.FILETYPE_MATCHES_QUERY_DATA_KEY
internal abstract class SearchEverywhereRankingModel(protected val model: DecisionFunction) {
abstract fun predict(features: Map<String, Any?>): Double
@@ -55,10 +59,10 @@ internal class ExactMatchSearchEverywhereRankingModel(model: DecisionFunction) :
* @return true if the features represent an exact match, false otherwise.
*/
private fun isExactMatch(features: Map<String, Any?>): Boolean {
val wordsInQuery = features.getOrDefault("${WholeTextMatchUtil.baseName}WordsInQuery", 0)
val wordsInElement = features.getOrDefault("${WholeTextMatchUtil.baseName}WordsInElement", 0)
val exactlyMatchedWords = features.getOrDefault("${WholeTextMatchUtil.baseName}ExactlyMatchedWords", 0)
val levenshteinDistance = features.getOrDefault("${WholeTextMatchUtil.baseName}LevenshteinDistanceCaseInsensitive", 1.0)
val wordsInQuery = features.getOrDefault(WHOLE_WORDS_IN_QUERY.name, 0)
val wordsInElement = features.getOrDefault(WHOLE_WORDS_IN_ELEMENT.name, 0)
val exactlyMatchedWords = features.getOrDefault(WHOLE_EXACTLY_MATCHED_WORDS.name, 0)
val levenshteinDistance = features.getOrDefault(WHOLE_LEVENSHTEIN_DISTANCE_CASE_INSENSITIVE.name, 1.0)
val allWordsMatch = (wordsInElement == wordsInQuery
&& wordsInElement == exactlyMatchedWords
&& exactlyMatchedWords != 0)
@@ -69,7 +73,7 @@ internal class ExactMatchSearchEverywhereRankingModel(model: DecisionFunction) :
override fun predict(features: Map<String, Any?>): Double {
val isExactMatch = isExactMatch(features)
val isExtensionMatch = features.getOrDefault("fileTypeMatchesQuery", false) == true
val isExtensionMatch = features.getOrDefault(FILETYPE_MATCHES_QUERY_DATA_KEY.name, false) == true
val mlPrediction = simpleModel.predict(features)
val isNameAndExtensionMatch = isExactMatch && isExtensionMatch
val isNameOnlyMatch = isExactMatch && !isExtensionMatch
@@ -14,6 +14,7 @@ import com.intellij.searchEverywhereMl.ranking.core.SearchEverywhereMLStatistics
import com.intellij.searchEverywhereMl.ranking.core.SearchEverywhereMLStatisticsCollector.GROUP
import com.intellij.searchEverywhereMl.ranking.core.SearchEverywhereMLStatisticsCollector.ITEM_SELECTED
import com.intellij.searchEverywhereMl.ranking.core.SearchEverywhereMLStatisticsCollector.REBUILD_REASON_KEY
import com.intellij.searchEverywhereMl.ranking.core.SearchEverywhereMLStatisticsCollector.SEARCH_INDEX_DATA_KEY
import com.intellij.searchEverywhereMl.ranking.core.SearchEverywhereMLStatisticsCollector.SESSION_DURATION
import com.intellij.searchEverywhereMl.ranking.core.SearchEverywhereMLStatisticsCollector.SESSION_FINISHED
import com.intellij.searchEverywhereMl.ranking.core.SearchEverywhereMLStatisticsCollector.SESSION_ID
@@ -184,7 +185,7 @@ class SearchEverywhereMlStatisticsCollectorTest : SearchEverywhereLoggingTestCas
// Check that search index is incremented for each search restart
var previousIndex = -1
for (event in searchRestartedEvents) {
val currentIndex = event.event.data["searchIndex"] as Int
val currentIndex = event.event.data[SEARCH_INDEX_DATA_KEY.name] as Int
assertTrue("Search index should be incremented", currentIndex > previousIndex)
previousIndex = currentIndex
}
@@ -213,13 +214,49 @@ class SearchEverywhereMlStatisticsCollectorTest : SearchEverywhereLoggingTestCas
}
}
@Test
fun `all EventField names are snake_case`() {
val snakeCase = Regex("^[a-z0-9]+(?:_[a-z0-9]+)*$")
val errors = mutableListOf<String>()
GROUP.events.forEach { event ->
event.getFields()
.getFieldsRecursively()
.forEach { field ->
if (!snakeCase.matches(field.name)) {
errors.add("Event ${event.eventId} has non-snake_case field name '${field.name}'")
}
}
}
if (errors.isNotEmpty()) {
fail(errors.joinToString("\n"))
}
}
@Test
fun `all event ids are lowercase dot separated words`() {
val dotSeparatedLower = Regex("^[a-z0-9]+(?:\\.[a-z0-9]+)*$")
val errors = mutableListOf<String>()
GROUP.events.forEach { event ->
if (!dotSeparatedLower.matches(event.eventId)) {
errors.add("Event id '${event.eventId}' is not lowercase dot-separated words")
}
}
if (errors.isNotEmpty()) {
fail(errors.joinToString("\n"))
}
}
private fun List<EventField<*>>.getFieldsRecursively(): List<EventField<*>> {
return fold(emptyList()) { acc, field ->
when (field) {
is PrimitiveEventField<*> -> acc + field
is ListEventField<*> -> acc + field
is ObjectEventField -> acc + field.fields.toList().getFieldsRecursively()
is ObjectListEventField -> acc + field.fields.toList().getFieldsRecursively()
is ObjectEventField -> acc + field + field.fields.toList().getFieldsRecursively()
is ObjectListEventField -> acc + field + field.fields.toList().getFieldsRecursively()
}
}
}
@@ -122,7 +122,7 @@ internal class SearchEverywhereJavaPsiElementFeatureProvider : SearchEverywhereE
}
internal object Fields {
val PACKAGE_DISTANCE_DATA_KEY = EventFields.Int("packageDistance")
val PACKAGE_DISTANCE_NORMALIZED_DATA_KEY = EventFields.Double("packageDistanceNorm")
val PACKAGE_DISTANCE_DATA_KEY = EventFields.Int("package_distance")
val PACKAGE_DISTANCE_NORMALIZED_DATA_KEY = EventFields.Double("package_distance_norm")
}
}
@@ -16,10 +16,10 @@ import com.intellij.searchEverywhereMl.ranking.vcs.SearchEverywhereVcsFileFeatur
class SearchEverywhereVcsFileFeaturesProvider : SearchEverywhereElementFeaturesProvider(FileSearchEverywhereContributor::class.java) {
object Fields {
val IS_IGNORED_DATA_KEY = EventFields.Boolean("isIgnored")
val IS_CHANGED_DATA_KEY = EventFields.Boolean("isChanged")
val IS_IGNORED_DATA_KEY = EventFields.Boolean("is_ignored")
val IS_CHANGED_DATA_KEY = EventFields.Boolean("is_changed")
val FILE_STATUS_DATA_KEY = EventFields.String(
"fileStatus",
"file_status",
listOf(
"NOT_CHANGED", "NOT_CHANGED_IMMEDIATE", "NOT_CHANGED_RECURSIVE",
"DELETED", "MODIFIED", "ADDED", "MERGED", "UNKNOWN",
@@ -29,17 +29,17 @@ import org.jetbrains.yaml.navigation.YAMLKeysSearchEverywhereContributor
private class SEYamlKeyFeaturesProvider : SearchEverywhereElementFeaturesProvider(YAMLKeysSearchEverywhereContributor::class.java) {
object Fields {
val KEY_IS_MOST_RECENTLY_USED = EventFields.Boolean("yamlKeyIsMostRecentlyUsed")
val KEY_IS_IN_TOP_5_RECENTLY_USED = EventFields.Boolean("yamlKeyIsInTop5RecentlyUsed")
val KEY_NEVER_USED = EventFields.Boolean("yamlKeyNeverUsed")
val KEY_IS_MOST_POPULAR = EventFields.Boolean("yamlKeyIsMostPopular")
val KEY_IS_MOST_RECENTLY_USED = EventFields.Boolean("yaml_key_is_most_recently_used")
val KEY_IS_IN_TOP_5_RECENTLY_USED = EventFields.Boolean("yaml_key_is_in_top_5_recently_used")
val KEY_NEVER_USED = EventFields.Boolean("yaml_key_never_used")
val KEY_IS_MOST_POPULAR = EventFields.Boolean("yaml_key_is_most_popular")
val FILE_RECENCY_INDEX = EventFields.Int("yamlFileRecencyIndex")
val FILE_TIME_SINCE_LAST_MODIFICATION = EventFields.Long("yamlTimeSinceLastModification")
val FILE_MODIFIED_IN_LAST_HOUR = EventFields.Boolean("yamlFileModifiedInLastHour")
val FILE_MODIFIED_IN_LAST_DAY = EventFields.Boolean("yamlFileModifiedInLastDay")
val FILE_MODIFIED_IN_LAST_WEEK = EventFields.Boolean("yamlFileModifiedInLastWeek")
val FILE_MODIFIED_IN_LAST_MONTH = EventFields.Boolean("yamlFileModifiedInLastMonth")
val FILE_RECENCY_INDEX = EventFields.Int("yaml_file_recency_index")
val FILE_TIME_SINCE_LAST_MODIFICATION = EventFields.Long("yaml_time_since_last_modification")
val FILE_MODIFIED_IN_LAST_HOUR = EventFields.Boolean("yaml_file_modified_in_last_hour")
val FILE_MODIFIED_IN_LAST_DAY = EventFields.Boolean("yaml_file_modified_in_last_day")
val FILE_MODIFIED_IN_LAST_WEEK = EventFields.Boolean("yaml_file_modified_in_last_week")
val FILE_MODIFIED_IN_LAST_MONTH = EventFields.Boolean("yaml_file_modified_in_last_month")
}
override fun getFeaturesDeclarations(): List<EventField<*>> {