Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
andehen committed Feb 11, 2025
1 parent ef82712 commit 1b90665
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 56 deletions.
6 changes: 2 additions & 4 deletions frontend/src/scenes/experiments/Metrics/MetricModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { ExperimentFunnelsQuery, ExperimentTrendsQuery } from '~/queries/schema'
import { Experiment, InsightType } from '~/types'

import { experimentLogic } from '../experimentLogic'
import { getDefaultFunnelsMetric, getDefaultTrendsMetric } from '../utils'
import { getDefaultMetric, getDefaultTrendsMetric } from '../utils'
import { FunnelsMetricForm } from './FunnelsMetricForm'
import { TrendsMetricForm } from './TrendsMetricForm'

Expand Down Expand Up @@ -123,9 +123,7 @@ export function MetricModal({
...experiment,
[metricsField]: [
...metrics.slice(0, metricIdx),
newMetricType === InsightType.TRENDS
? getDefaultTrendsMetric()
: getDefaultFunnelsMetric(),
newMetricType === InsightType.TRENDS ? getDefaultTrendsMetric() : getDefaultMetric(),
...metrics.slice(metricIdx + 1),
],
})
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/scenes/experiments/Metrics/MetricSourceModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { useActions, useValues } from 'kea'
import { Experiment } from '~/types'

import { experimentLogic } from '../experimentLogic'
import { getDefaultFunnelsMetric } from '../utils'
import { getDefaultMetric } from '../utils'

export function MetricSourceModal({
experimentId,
Expand Down Expand Up @@ -40,7 +40,7 @@ export function MetricSourceModal({
onClick={() => {
closeCurrentModal()

const newMetrics = [...experiment[metricsField], getDefaultFunnelsMetric()]
const newMetrics = [...experiment[metricsField], getDefaultMetric()]
setExperiment({
[metricsField]: newMetrics,
})
Expand Down
18 changes: 9 additions & 9 deletions frontend/src/scenes/experiments/Metrics/NewMetricForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ import { teamLogic } from 'scenes/teamLogic'

import { actionsAndEventsToSeries } from '~/queries/nodes/InsightQuery/utils/filtersToQueryNode'
import { Query } from '~/queries/Query/Query'
import { ExperimentQuery, NodeKind, ExperimentMetricType } from '~/queries/schema/schema-general'
import { ExperimentQuery, NodeKind, ExperimentMetricType, ExperimentMetric } from '~/queries/schema/schema-general'
import { FilterType } from '~/types'

import { experimentLogic } from '../experimentLogic'
import { commonActionFilterProps } from './Selectors'
import { metricQueryToFilter } from '../utils'
import { metricToFilter } from '../utils'

export function NewMetricForm({ isSecondary = false }: { isSecondary?: boolean }): JSX.Element {
const { experiment, isExperimentRunning, editingPrimaryMetricIndex, editingSecondaryMetricIndex } =
Expand All @@ -30,7 +30,7 @@ export function NewMetricForm({ isSecondary = false }: { isSecondary?: boolean }
}

// Cast to unknown first to avoid type errors when transitioning to the new ExperimentQuery type
const currentMetric = metrics[metricIdx] as unknown as ExperimentQuery
const currentMetric = metrics[metricIdx] as unknown as ExperimentMetric

return (
<>
Expand All @@ -41,26 +41,26 @@ export function NewMetricForm({ isSecondary = false }: { isSecondary?: boolean }
onChange={(newName) => {
setMetric({
metricIdx,
name: newName,
metric: currentMetric.metric,
metric: {
...currentMetric,
name: newName,
},
isSecondary,
})
}}
/>
</div>
<ActionFilter
bordered
filters={metricQueryToFilter(currentMetric)}
filters={metricToFilter(currentMetric)}
setFilters={({ actions, events }: Partial<FilterType>): void => {
// We only support one event/action for experiment metrics
const entity = events?.[0] || actions?.[0]
if (entity) {
setMetric({
metricIdx,
name: currentMetric.name,
metric: {
kind: 'ExperimentMetric',
metric_type: ExperimentMetricType.COUNT,
...currentMetric,
metric_config: {
kind: 'ExperimentEventMetricConfig',
event: entity.id as string,
Expand Down
7 changes: 4 additions & 3 deletions frontend/src/scenes/experiments/Metrics/NewMetricModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { LemonButton, LemonDialog, LemonModal } from '@posthog/lemon-ui'
import { useActions, useValues } from 'kea'
import { LemonRadio } from 'lib/lemon-ui/LemonRadio'

import { ExperimentMetricType, ExperimentQuery } from '~/queries/schema/schema-general'
import { ExperimentMetric, ExperimentMetricType } from '~/queries/schema/schema-general'
import { Experiment } from '~/types'

import { experimentLogic } from '../experimentLogic'
Expand Down Expand Up @@ -41,14 +41,16 @@ export function NewMetricModal({
}

const metrics = experiment[metricsField]
const metric = metrics[metricIdx] as ExperimentQuery
const metric = metrics[metricIdx] as ExperimentMetric
const metricType = getNewMetricType(metric)

const onClose = (): void => {
restoreUnmodifiedExperiment()
isSecondary ? closeSecondaryMetricModal() : closePrimaryMetricModal()
}

console.log('experiment', experiment)

return (
<LemonModal
isOpen={isSecondary ? isSecondaryMetricModalOpen : isPrimaryMetricModalOpen}
Expand Down Expand Up @@ -122,7 +124,6 @@ export function NewMetricModal({
...metrics.slice(metricIdx + 1),
],
})
console.log('experiment', experiment)
}}
options={[
{ value: ExperimentMetricType.COUNT, label: 'Count' },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { themeLogic } from '~/layout/navigation-3000/themeLogic'
import { tagsModel } from '~/models/tagsModel'
import { NodeKind } from '~/queries/schema/schema-general'

import { getDefaultFunnelsMetric, getDefaultTrendsMetric } from '../utils'
import { getDefaultMetric, getDefaultTrendsMetric } from '../utils'
import { SharedFunnelsMetricForm } from './SharedFunnelsMetricForm'
import { sharedMetricLogic } from './sharedMetricLogic'
import { SharedTrendsMetricForm } from './SharedTrendsMetricForm'
Expand Down Expand Up @@ -70,7 +70,7 @@ export function SharedMetric(): JSX.Element {
}`}
onClick={() => {
setSharedMetric({
query: getDefaultFunnelsMetric(),
query: getDefaultMetric(),
})
}}
>
Expand Down
13 changes: 5 additions & 8 deletions frontend/src/scenes/experiments/experimentLogic.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -353,15 +353,12 @@ export const experimentLogic = kea<experimentLogicType>([
},
}
},
setMetric: (state, { metricIdx, name, metric, isSecondary }) => {
setMetric: (state, { metricIdx, metric, isSecondary }) => {
console.log('setMetric', metric)
const metricsKey = isSecondary ? 'metrics_secondary' : 'metrics'
const metrics = [...(state?.[metricsKey] || [])]

metrics[metricIdx] = {
kind: NodeKind.ExperimentQuery,
name,
metric,
}
metrics[metricIdx] = metric

return {
...state,
Expand Down Expand Up @@ -1303,8 +1300,8 @@ export const experimentLogic = kea<experimentLogicType>([
getNewMetricType: [
() => [],
() =>
(metric: ExperimentQuery | undefined): ExperimentMetricType => {
return metric?.metric?.metric_type || ExperimentMetricType.COUNT
(metric: ExperimentMetric | undefined): ExperimentMetricType => {
return metric?.metric_type || ExperimentMetricType.COUNT
},
],
isExperimentRunning: [
Expand Down
63 changes: 37 additions & 26 deletions frontend/src/scenes/experiments/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import merge from 'lodash.merge'
import { objectClean } from 'lib/utils'

import { ExperimentFunnelsQuery, ExperimentTrendsQuery } from '~/queries/schema'
import { AnyEntityNode, type FunnelsQuery, NodeKind, type TrendsQuery } from '~/queries/schema/schema-general'
import { AnyEntityNode, ExperimentMetric, type FunnelsQuery, NodeKind, type TrendsQuery } from '~/queries/schema/schema-general'
import { isFunnelsQuery, isTrendsQuery } from '~/queries/utils'
import { isNodeWithSource, isValidQueryForExperiment } from '~/queries/utils'
import {
Expand Down Expand Up @@ -235,7 +235,14 @@ export function getDefaultTrendsMetric(): ExperimentTrendsQuery {
}
}

export function getDefaultFunnelsMetric(): ExperimentFunnelsQuery {
// Feature flag to control experiment metric initialization behavior
export const EXPERIMENT_METRIC_INIT_FLAG = true

export function getDefaultMetric(): ExperimentFunnelsQuery | ExperimentMetric {
if (EXPERIMENT_METRIC_INIT_FLAG) {
return getDefaultCountMetric()
}

return {
kind: NodeKind.ExperimentFunnelsQuery,
funnels_query: {
Expand Down Expand Up @@ -268,31 +275,25 @@ export function getDefaultFunnelsMetric(): ExperimentFunnelsQuery {
}
}

export function getDefaultCountMetric(): ExperimentQuery {
export function getDefaultCountMetric(): ExperimentMetric {
return {
kind: NodeKind.ExperimentQuery,
metric: {
kind: 'ExperimentMetric',
metric_type: ExperimentMetricType.COUNT,
metric_config: {
kind: 'ExperimentEventMetricConfig',
event: '$pageview',
},
kind: NodeKind.ExperimentMetric,
metric_type: ExperimentMetricType.COUNT,
metric_config: {
kind: 'ExperimentEventMetricConfig',
event: '$pageview',
},
}
}

export function getDefaultContinuousMetric(): ExperimentQuery {
export function getDefaultContinuousMetric(): ExperimentMetric {
return {
kind: NodeKind.ExperimentQuery,
metric: {
kind: 'ExperimentMetric',
metric_type: ExperimentMetricType.CONTINUOUS,
metric_config: {
kind: 'ExperimentEventMetricConfig',
event: '$pageview',
math: 'sum',
},
kind: NodeKind.ExperimentMetric,
metric_type: ExperimentMetricType.CONTINUOUS,
metric_config: {
kind: 'ExperimentEventMetricConfig',
event: '$pageview',
math: 'sum',
},
}
}
Expand All @@ -307,7 +308,7 @@ export function getExperimentMetricFromInsight(
const metricName = (insight?.name || insight?.derived_name) ?? undefined

if (isFunnelsQuery(insight.query.source)) {
const defaultFunnelsQuery = getDefaultFunnelsMetric().funnels_query
const defaultFunnelsQuery = getDefaultMetric().funnels_query

const funnelsQuery: FunnelsQuery = merge(defaultFunnelsQuery, {
series: insight.query.source.series,
Expand Down Expand Up @@ -397,12 +398,22 @@ export function getNewExperimentMetricFromInsight(
return undefined
}

export function metricQueryToFilter(query: ExperimentQuery): FilterType {
if (!query.metric?.metric_config) {
return {}
export function metricToFilter(metric: ExperimentMetric): FilterType {
if (!metric.metric_config) {
return {
events: [{
id: '$pageview',
name: '$pageview',
type: 'events',
math: 'total',
math_property: null,
math_hogql: null,
}],
actions: [],
}
}

const config = query.metric.metric_config
const config = metric.metric_config
if (config.kind === 'ExperimentEventMetricConfig') {
return {
events: [{
Expand Down
5 changes: 3 additions & 2 deletions frontend/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import type {
DashboardFilter,
DatabaseSchemaField,
ExperimentFunnelsQuery,
ExperimentMetric,
ExperimentQuery,
ExperimentTrendsQuery,
HogQLQuery,
Expand Down Expand Up @@ -3339,8 +3340,8 @@ export interface Experiment {
feature_flag?: FeatureFlagBasicType
exposure_cohort?: number
filters: TrendsFilterType | FunnelsFilterType
metrics: (ExperimentTrendsQuery | ExperimentFunnelsQuery | ExperimentQuery)[]
metrics_secondary: (ExperimentTrendsQuery | ExperimentFunnelsQuery | ExperimentQuery)[]
metrics: (ExperimentTrendsQuery | ExperimentFunnelsQuery | ExperimentMetric)[]
metrics_secondary: (ExperimentTrendsQuery | ExperimentFunnelsQuery | ExperimentMetric)[]
saved_metrics_ids: { id: number; metadata: { type: 'primary' | 'secondary' } }[]
saved_metrics: any[]
parameters: {
Expand Down

0 comments on commit 1b90665

Please sign in to comment.