diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/SearchEverywhereMLStatisticsCollector.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/SearchEverywhereMLStatisticsCollector.kt index c9a78ed68cc5..4c8cff438830 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/SearchEverywhereMLStatisticsCollector.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/SearchEverywhereMLStatisticsCollector.kt @@ -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("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("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) diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/CoreStateFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/CoreStateFeaturesProvider.kt index 4a6b4ec62a9e..86b0bac426b3 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/CoreStateFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/CoreStateFeaturesProvider.kt @@ -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> = listOf( diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/GlobalStatisticsFields.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/GlobalStatisticsFields.kt index 6f120ff8f942..204e8f0102ee 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/GlobalStatisticsFields.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/GlobalStatisticsFields.kt @@ -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" } ?: "" } \ No newline at end of file diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereActionFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereActionFeaturesProvider.kt index bca8f65bbddd..ecc9a257efc4 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereActionFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereActionFeaturesProvider.kt @@ -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") - 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("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> { diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereClassFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereClassFeaturesProvider.kt index 4234832c5722..dd0fb2f90640 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereClassFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereClassFeaturesProvider.kt @@ -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> { diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereClassOrFileFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereClassOrFileFeaturesProvider.kt index 64b0d044f696..1728480c34bc 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereClassOrFileFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereClassOrFileFeaturesProvider.kt @@ -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> { diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereCommonFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereCommonFeaturesProvider.kt index c453ad610151..b62c5c208991 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereCommonFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereCommonFeaturesProvider.kt @@ -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 diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereContextFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereContextFeaturesProvider.kt index 356d2bf7c46c..eb343b4a72ef 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereContextFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereContextFeaturesProvider.kt @@ -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> { return buildList { diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereContributorFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereContributorFeaturesProvider.kt index ce8287d16e7b..a7fdd08dc706 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereContributorFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereContributorFeaturesProvider.kt @@ -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() diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereElementFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereElementFeaturesProvider.kt index 5fe9cc5b51dd..010f3edd196c 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereElementFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereElementFeaturesProvider.kt @@ -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>( - "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>( - "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> { - 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> - abstract fun getElementFeatures(element: Any, - currentTime: Long, - searchQuery: String, - elementPriority: Int, - cache: FeaturesProviderCache?, - correction: SearchEverywhereSpellCheckResult): List> + abstract fun getElementFeatures( + element: Any, + currentTime: Long, + searchQuery: String, + elementPriority: Int, + cache: FeaturesProviderCache?, + correction: SearchEverywhereSpellCheckResult, + ): List> 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> { + // 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 } } diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereFileFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereFileFeaturesProvider.kt index 0d1b76d00d0b..c7c76d5ab5cf 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereFileFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereFileFeaturesProvider.kt @@ -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>( - "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) } } } diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereFileGroupFeatureProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereFileGroupFeatureProvider.kt index e6f4620a0370..b38f323220f5 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereFileGroupFeatureProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereFileGroupFeatureProvider.kt @@ -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> = listOf(FILE_GROUP) diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereGeneralActionFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereGeneralActionFeaturesProvider.kt index fc346981f464..ba0f62abc09c 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereGeneralActionFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereGeneralActionFeaturesProvider.kt @@ -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("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> { diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereOptionFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereOptionFeaturesProvider.kt index 57c8cbce22e7..2225a191d9b7 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereOptionFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereOptionFeaturesProvider.kt @@ -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> { diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywherePsiElementFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywherePsiElementFeaturesProvider.kt index d6d2a24a2361..e140ca4ab261 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywherePsiElementFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywherePsiElementFeaturesProvider.kt @@ -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> = listOf( diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereRunConfigurationFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereRunConfigurationFeaturesProvider.kt index 5859a7e174b4..7a6dcda27a12 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereRunConfigurationFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereRunConfigurationFeaturesProvider.kt @@ -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> { diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereSymbolFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereSymbolFeaturesProvider.kt index 7dc778235a78..0cd5d34243ad 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereSymbolFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereSymbolFeaturesProvider.kt @@ -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> { diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereTextFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereTextFeaturesProvider.kt index 5733016d4dda..50cff67198dd 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereTextFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/SearchEverywhereTextFeaturesProvider.kt @@ -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") } } diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/statistician/ContributorsLocalStatisticsFields.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/statistician/ContributorsLocalStatisticsFields.kt index eed93e06dc6e..48aff9b9ea7c 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/statistician/ContributorsLocalStatisticsFields.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/features/statistician/ContributorsLocalStatisticsFields.kt @@ -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> = 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> = listOf(MAX_SELECTION_ALL, MIN_SELECTION_ALL, MAX_SELECTION_OTHER, diff --git a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/model/SearchEverywhereRankingModel.kt b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/model/SearchEverywhereRankingModel.kt index facf982e2c3f..efde2cf47896 100644 --- a/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/model/SearchEverywhereRankingModel.kt +++ b/plugins/search-everywhere-ml/ranking/core/src/com/intellij/searchEverywhereMl/ranking/core/model/SearchEverywhereRankingModel.kt @@ -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): 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): 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): 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 diff --git a/plugins/search-everywhere-ml/ranking/core/test/com/intellij/searchEverywhereMl/ranking/core/SearchEverywhereMlStatisticsCollectorTest.kt b/plugins/search-everywhere-ml/ranking/core/test/com/intellij/searchEverywhereMl/ranking/core/SearchEverywhereMlStatisticsCollectorTest.kt index facd8788d1ac..ebb54f41a7c2 100644 --- a/plugins/search-everywhere-ml/ranking/core/test/com/intellij/searchEverywhereMl/ranking/core/SearchEverywhereMlStatisticsCollectorTest.kt +++ b/plugins/search-everywhere-ml/ranking/core/test/com/intellij/searchEverywhereMl/ranking/core/SearchEverywhereMlStatisticsCollectorTest.kt @@ -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() + + 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() + + 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>.getFieldsRecursively(): List> { 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() } } } diff --git a/plugins/search-everywhere-ml/ranking/java/src/com/intellij/searchEverywhereMl/ranking/java/features/SearchEverywhereJavaPsiElementFeatureProvider.kt b/plugins/search-everywhere-ml/ranking/java/src/com/intellij/searchEverywhereMl/ranking/java/features/SearchEverywhereJavaPsiElementFeatureProvider.kt index 6241fb8684c4..d6cea8d716a2 100644 --- a/plugins/search-everywhere-ml/ranking/java/src/com/intellij/searchEverywhereMl/ranking/java/features/SearchEverywhereJavaPsiElementFeatureProvider.kt +++ b/plugins/search-everywhere-ml/ranking/java/src/com/intellij/searchEverywhereMl/ranking/java/features/SearchEverywhereJavaPsiElementFeatureProvider.kt @@ -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") } } diff --git a/plugins/search-everywhere-ml/ranking/vcs/src/com/intellij/searchEverywhereMl/ranking/vcs/SearchEverywhereVcsFileFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/vcs/src/com/intellij/searchEverywhereMl/ranking/vcs/SearchEverywhereVcsFileFeaturesProvider.kt index 66f4c3979689..59fb27dd09be 100644 --- a/plugins/search-everywhere-ml/ranking/vcs/src/com/intellij/searchEverywhereMl/ranking/vcs/SearchEverywhereVcsFileFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/vcs/src/com/intellij/searchEverywhereMl/ranking/vcs/SearchEverywhereVcsFileFeaturesProvider.kt @@ -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", diff --git a/plugins/search-everywhere-ml/ranking/yaml/src/com/intellij/searchEverywhereMl/ranking/yaml/SEYamlKeyFeaturesProvider.kt b/plugins/search-everywhere-ml/ranking/yaml/src/com/intellij/searchEverywhereMl/ranking/yaml/SEYamlKeyFeaturesProvider.kt index 7860ec402bd3..6be207a4126f 100644 --- a/plugins/search-everywhere-ml/ranking/yaml/src/com/intellij/searchEverywhereMl/ranking/yaml/SEYamlKeyFeaturesProvider.kt +++ b/plugins/search-everywhere-ml/ranking/yaml/src/com/intellij/searchEverywhereMl/ranking/yaml/SEYamlKeyFeaturesProvider.kt @@ -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> {