Skip to content

Commit ce89ade

Browse files
authored
fix(q_dev): include more metrics, prevent data duplication (#8498)
1 parent c77916a commit ce89ade

File tree

8 files changed

+515
-347
lines changed

8 files changed

+515
-347
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
Licensed to the Apache Software Foundation (ASF) under one or more
3+
contributor license agreements. See the NOTICE file distributed with
4+
this work for additional information regarding copyright ownership.
5+
The ASF licenses this file to You under the Apache License, Version 2.0
6+
(the "License"); you may not use this file except in compliance with
7+
the License. You may obtain a copy of the License at
8+
9+
http://www.apache.org/licenses/LICENSE-2.0
10+
11+
Unless required by applicable law or agreed to in writing, software
12+
distributed under the License is distributed on an "AS IS" BASIS,
13+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
See the License for the specific language governing permissions and
15+
limitations under the License.
16+
*/
17+
18+
package migrationscripts
19+
20+
import (
21+
"github.com/apache/incubator-devlake/core/context"
22+
"github.com/apache/incubator-devlake/core/errors"
23+
"github.com/apache/incubator-devlake/core/plugin"
24+
)
25+
26+
var _ plugin.MigrationScript = (*addMissingMetrics)(nil)
27+
28+
type addMissingMetrics struct{}
29+
30+
func (*addMissingMetrics) Up(basicRes context.BasicRes) errors.Error {
31+
db := basicRes.GetDal()
32+
33+
// Add all missing metrics columns to _tool_q_dev_user_data table
34+
// All columns are integer type with default value 0
35+
// Using snake_case column names to match GORM's default naming convention
36+
_ = db.Exec(`
37+
ALTER TABLE _tool_q_dev_user_data
38+
ADD COLUMN chat_ai_code_lines INT DEFAULT 0,
39+
ADD COLUMN chat_messages_interacted INT DEFAULT 0,
40+
ADD COLUMN chat_messages_sent INT DEFAULT 0,
41+
ADD COLUMN code_fix_acceptance_event_count INT DEFAULT 0,
42+
ADD COLUMN code_fix_accepted_lines INT DEFAULT 0,
43+
ADD COLUMN code_fix_generated_lines INT DEFAULT 0,
44+
ADD COLUMN code_fix_generation_event_count INT DEFAULT 0,
45+
ADD COLUMN code_review_failed_event_count INT DEFAULT 0,
46+
ADD COLUMN dev_acceptance_event_count INT DEFAULT 0,
47+
ADD COLUMN dev_accepted_lines INT DEFAULT 0,
48+
ADD COLUMN dev_generated_lines INT DEFAULT 0,
49+
ADD COLUMN dev_generation_event_count INT DEFAULT 0,
50+
ADD COLUMN doc_generation_accepted_file_updates INT DEFAULT 0,
51+
ADD COLUMN doc_generation_accepted_files_creations INT DEFAULT 0,
52+
ADD COLUMN doc_generation_accepted_line_additions INT DEFAULT 0,
53+
ADD COLUMN doc_generation_accepted_line_updates INT DEFAULT 0,
54+
ADD COLUMN doc_generation_event_count INT DEFAULT 0,
55+
ADD COLUMN doc_generation_rejected_file_creations INT DEFAULT 0,
56+
ADD COLUMN doc_generation_rejected_file_updates INT DEFAULT 0,
57+
ADD COLUMN doc_generation_rejected_line_additions INT DEFAULT 0,
58+
ADD COLUMN doc_generation_rejected_line_updates INT DEFAULT 0,
59+
ADD COLUMN test_generation_accepted_lines INT DEFAULT 0,
60+
ADD COLUMN test_generation_accepted_tests INT DEFAULT 0,
61+
ADD COLUMN test_generation_event_count INT DEFAULT 0,
62+
ADD COLUMN test_generation_generated_lines INT DEFAULT 0,
63+
ADD COLUMN test_generation_generated_tests INT DEFAULT 0,
64+
ADD COLUMN transformation_event_count INT DEFAULT 0,
65+
ADD COLUMN transformation_lines_generated INT DEFAULT 0,
66+
ADD COLUMN transformation_lines_ingested INT DEFAULT 0
67+
`)
68+
69+
return nil
70+
}
71+
72+
func (*addMissingMetrics) Version() uint64 {
73+
return 20250710000001
74+
}
75+
76+
func (*addMissingMetrics) Name() string {
77+
return "add missing metrics columns to QDevUserData table"
78+
}

backend/plugins/q_dev/models/migrationscripts/register.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,6 @@ func All() []plugin.MigrationScript {
2727
new(initTables),
2828
new(modifyFileMetaTable),
2929
new(addDisplayNameFields),
30+
new(addMissingMetrics),
3031
}
3132
}

backend/plugins/q_dev/models/user_data.go

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,55 @@ import (
2626
// QDevUserData 存储从CSV中提取的原始数据
2727
type QDevUserData struct {
2828
common.Model
29-
ConnectionId uint64 `gorm:"primaryKey"`
30-
UserId string `gorm:"index" json:"userId"`
31-
Date time.Time `gorm:"index" json:"date"`
32-
DisplayName string `gorm:"type:varchar(255)" json:"displayName"` // New field for user display name
33-
CodeReview_FindingsCount int
34-
CodeReview_SucceededEventCount int
35-
InlineChat_AcceptanceEventCount int
36-
InlineChat_AcceptedLineAdditions int
37-
InlineChat_AcceptedLineDeletions int
38-
InlineChat_DismissalEventCount int
39-
InlineChat_DismissedLineAdditions int
40-
InlineChat_DismissedLineDeletions int
41-
InlineChat_RejectedLineAdditions int
42-
InlineChat_RejectedLineDeletions int
43-
InlineChat_RejectionEventCount int
44-
InlineChat_TotalEventCount int
45-
Inline_AICodeLines int
46-
Inline_AcceptanceCount int
47-
Inline_SuggestionsCount int
29+
ConnectionId uint64 `gorm:"primaryKey"`
30+
UserId string `gorm:"index" json:"userId"`
31+
Date time.Time `gorm:"index" json:"date"`
32+
DisplayName string `gorm:"type:varchar(255)" json:"displayName"` // New field for user display name
33+
34+
CodeReview_FindingsCount int
35+
CodeReview_SucceededEventCount int
36+
InlineChat_AcceptanceEventCount int
37+
InlineChat_AcceptedLineAdditions int
38+
InlineChat_AcceptedLineDeletions int
39+
InlineChat_DismissalEventCount int
40+
InlineChat_DismissedLineAdditions int
41+
InlineChat_DismissedLineDeletions int
42+
InlineChat_RejectedLineAdditions int
43+
InlineChat_RejectedLineDeletions int
44+
InlineChat_RejectionEventCount int
45+
InlineChat_TotalEventCount int
46+
Inline_AICodeLines int
47+
Inline_AcceptanceCount int
48+
Inline_SuggestionsCount int
49+
Chat_AICodeLines int
50+
Chat_MessagesInteracted int
51+
Chat_MessagesSent int
52+
CodeFix_AcceptanceEventCount int
53+
CodeFix_AcceptedLines int
54+
CodeFix_GeneratedLines int
55+
CodeFix_GenerationEventCount int
56+
CodeReview_FailedEventCount int
57+
Dev_AcceptanceEventCount int
58+
Dev_AcceptedLines int
59+
Dev_GeneratedLines int
60+
Dev_GenerationEventCount int
61+
DocGeneration_AcceptedFileUpdates int
62+
DocGeneration_AcceptedFilesCreations int
63+
DocGeneration_AcceptedLineAdditions int
64+
DocGeneration_AcceptedLineUpdates int
65+
DocGeneration_EventCount int
66+
DocGeneration_RejectedFileCreations int
67+
DocGeneration_RejectedFileUpdates int
68+
DocGeneration_RejectedLineAdditions int
69+
DocGeneration_RejectedLineUpdates int
70+
TestGeneration_AcceptedLines int
71+
TestGeneration_AcceptedTests int
72+
TestGeneration_EventCount int
73+
TestGeneration_GeneratedLines int
74+
TestGeneration_GeneratedTests int
75+
Transformation_EventCount int
76+
Transformation_LinesGenerated int
77+
Transformation_LinesIngested int
4878
}
4979

5080
func (QDevUserData) TableName() string {

backend/plugins/q_dev/models/user_data_test.go

Lines changed: 106 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -20,99 +20,118 @@ package models
2020
import (
2121
"testing"
2222
"time"
23-
23+
2424
"github.com/stretchr/testify/assert"
2525
)
2626

27-
func TestQDevUserData_WithDisplayName(t *testing.T) {
28-
userData := QDevUserData{
29-
ConnectionId: 1,
30-
UserId: "uuid-123",
31-
DisplayName: "John Doe",
32-
Date: time.Now(),
33-
CodeReview_FindingsCount: 5,
34-
Inline_AcceptanceCount: 10,
35-
}
36-
37-
assert.Equal(t, "John Doe", userData.DisplayName)
38-
assert.Equal(t, "uuid-123", userData.UserId)
39-
assert.Equal(t, uint64(1), userData.ConnectionId)
40-
assert.Equal(t, 5, userData.CodeReview_FindingsCount)
41-
assert.Equal(t, 10, userData.Inline_AcceptanceCount)
42-
}
43-
44-
func TestQDevUserData_WithFallbackDisplayName(t *testing.T) {
45-
userData := QDevUserData{
46-
ConnectionId: 1,
47-
UserId: "uuid-456",
48-
DisplayName: "uuid-456", // Fallback case when display name resolution fails
49-
Date: time.Now(),
50-
}
51-
52-
assert.Equal(t, "uuid-456", userData.DisplayName)
53-
assert.Equal(t, userData.UserId, userData.DisplayName) // Should match when fallback
54-
}
55-
56-
func TestQDevUserData_EmptyDisplayName(t *testing.T) {
57-
userData := QDevUserData{
27+
func TestQDevUserDataAllMetrics(t *testing.T) {
28+
// Create a test user data object with all metrics
29+
userData := &QDevUserData{
5830
ConnectionId: 1,
59-
UserId: "uuid-789",
60-
DisplayName: "", // Empty display name
61-
Date: time.Now(),
31+
UserId: "test-user-id",
32+
Date: time.Now(),
33+
DisplayName: "Test User",
34+
35+
// Set values for existing metrics
36+
CodeReview_FindingsCount: 10,
37+
CodeReview_SucceededEventCount: 11,
38+
InlineChat_AcceptanceEventCount: 12,
39+
InlineChat_AcceptedLineAdditions: 13,
40+
InlineChat_AcceptedLineDeletions: 14,
41+
InlineChat_DismissalEventCount: 15,
42+
InlineChat_DismissedLineAdditions: 16,
43+
InlineChat_DismissedLineDeletions: 17,
44+
InlineChat_RejectedLineAdditions: 18,
45+
InlineChat_RejectedLineDeletions: 19,
46+
InlineChat_RejectionEventCount: 20,
47+
InlineChat_TotalEventCount: 21,
48+
Inline_AICodeLines: 22,
49+
Inline_AcceptanceCount: 23,
50+
Inline_SuggestionsCount: 24,
51+
52+
// Set values for new metrics
53+
Chat_AICodeLines: 25,
54+
Chat_MessagesInteracted: 26,
55+
Chat_MessagesSent: 27,
56+
CodeFix_AcceptanceEventCount: 28,
57+
CodeFix_AcceptedLines: 29,
58+
CodeFix_GeneratedLines: 30,
59+
CodeFix_GenerationEventCount: 31,
60+
CodeReview_FailedEventCount: 32,
61+
Dev_AcceptanceEventCount: 33,
62+
Dev_AcceptedLines: 34,
63+
Dev_GeneratedLines: 35,
64+
Dev_GenerationEventCount: 36,
65+
DocGeneration_AcceptedFileUpdates: 37,
66+
DocGeneration_AcceptedFilesCreations: 38,
67+
DocGeneration_AcceptedLineAdditions: 39,
68+
DocGeneration_AcceptedLineUpdates: 40,
69+
DocGeneration_EventCount: 41,
70+
DocGeneration_RejectedFileCreations: 42,
71+
DocGeneration_RejectedFileUpdates: 43,
72+
DocGeneration_RejectedLineAdditions: 44,
73+
DocGeneration_RejectedLineUpdates: 45,
74+
TestGeneration_AcceptedLines: 46,
75+
TestGeneration_AcceptedTests: 47,
76+
TestGeneration_EventCount: 48,
77+
TestGeneration_GeneratedLines: 49,
78+
TestGeneration_GeneratedTests: 50,
79+
Transformation_EventCount: 51,
80+
Transformation_LinesGenerated: 52,
81+
Transformation_LinesIngested: 53,
6282
}
63-
64-
assert.Equal(t, "", userData.DisplayName)
65-
assert.Equal(t, "uuid-789", userData.UserId)
66-
assert.NotEqual(t, userData.UserId, userData.DisplayName)
83+
84+
// Verify that all metrics are accessible
85+
// Existing metrics
86+
assert.Equal(t, 10, userData.CodeReview_FindingsCount)
87+
assert.Equal(t, 11, userData.CodeReview_SucceededEventCount)
88+
assert.Equal(t, 12, userData.InlineChat_AcceptanceEventCount)
89+
assert.Equal(t, 13, userData.InlineChat_AcceptedLineAdditions)
90+
assert.Equal(t, 14, userData.InlineChat_AcceptedLineDeletions)
91+
assert.Equal(t, 15, userData.InlineChat_DismissalEventCount)
92+
assert.Equal(t, 16, userData.InlineChat_DismissedLineAdditions)
93+
assert.Equal(t, 17, userData.InlineChat_DismissedLineDeletions)
94+
assert.Equal(t, 18, userData.InlineChat_RejectedLineAdditions)
95+
assert.Equal(t, 19, userData.InlineChat_RejectedLineDeletions)
96+
assert.Equal(t, 20, userData.InlineChat_RejectionEventCount)
97+
assert.Equal(t, 21, userData.InlineChat_TotalEventCount)
98+
assert.Equal(t, 22, userData.Inline_AICodeLines)
99+
assert.Equal(t, 23, userData.Inline_AcceptanceCount)
100+
assert.Equal(t, 24, userData.Inline_SuggestionsCount)
101+
102+
// New metrics
103+
assert.Equal(t, 25, userData.Chat_AICodeLines)
104+
assert.Equal(t, 26, userData.Chat_MessagesInteracted)
105+
assert.Equal(t, 27, userData.Chat_MessagesSent)
106+
assert.Equal(t, 28, userData.CodeFix_AcceptanceEventCount)
107+
assert.Equal(t, 29, userData.CodeFix_AcceptedLines)
108+
assert.Equal(t, 30, userData.CodeFix_GeneratedLines)
109+
assert.Equal(t, 31, userData.CodeFix_GenerationEventCount)
110+
assert.Equal(t, 32, userData.CodeReview_FailedEventCount)
111+
assert.Equal(t, 33, userData.Dev_AcceptanceEventCount)
112+
assert.Equal(t, 34, userData.Dev_AcceptedLines)
113+
assert.Equal(t, 35, userData.Dev_GeneratedLines)
114+
assert.Equal(t, 36, userData.Dev_GenerationEventCount)
115+
assert.Equal(t, 37, userData.DocGeneration_AcceptedFileUpdates)
116+
assert.Equal(t, 38, userData.DocGeneration_AcceptedFilesCreations)
117+
assert.Equal(t, 39, userData.DocGeneration_AcceptedLineAdditions)
118+
assert.Equal(t, 40, userData.DocGeneration_AcceptedLineUpdates)
119+
assert.Equal(t, 41, userData.DocGeneration_EventCount)
120+
assert.Equal(t, 42, userData.DocGeneration_RejectedFileCreations)
121+
assert.Equal(t, 43, userData.DocGeneration_RejectedFileUpdates)
122+
assert.Equal(t, 44, userData.DocGeneration_RejectedLineAdditions)
123+
assert.Equal(t, 45, userData.DocGeneration_RejectedLineUpdates)
124+
assert.Equal(t, 46, userData.TestGeneration_AcceptedLines)
125+
assert.Equal(t, 47, userData.TestGeneration_AcceptedTests)
126+
assert.Equal(t, 48, userData.TestGeneration_EventCount)
127+
assert.Equal(t, 49, userData.TestGeneration_GeneratedLines)
128+
assert.Equal(t, 50, userData.TestGeneration_GeneratedTests)
129+
assert.Equal(t, 51, userData.Transformation_EventCount)
130+
assert.Equal(t, 52, userData.Transformation_LinesGenerated)
131+
assert.Equal(t, 53, userData.Transformation_LinesIngested)
67132
}
68133

69-
func TestQDevUserData_TableName(t *testing.T) {
70-
userData := QDevUserData{}
134+
func TestQDevUserDataTableName(t *testing.T) {
135+
userData := &QDevUserData{}
71136
assert.Equal(t, "_tool_q_dev_user_data", userData.TableName())
72137
}
73-
74-
func TestQDevUserData_AllFields(t *testing.T) {
75-
now := time.Now()
76-
userData := QDevUserData{
77-
ConnectionId: 1,
78-
UserId: "test-user",
79-
DisplayName: "Test User",
80-
Date: now,
81-
CodeReview_FindingsCount: 1,
82-
CodeReview_SucceededEventCount: 2,
83-
InlineChat_AcceptanceEventCount: 3,
84-
InlineChat_AcceptedLineAdditions: 4,
85-
InlineChat_AcceptedLineDeletions: 5,
86-
InlineChat_DismissalEventCount: 6,
87-
InlineChat_DismissedLineAdditions: 7,
88-
InlineChat_DismissedLineDeletions: 8,
89-
InlineChat_RejectedLineAdditions: 9,
90-
InlineChat_RejectedLineDeletions: 10,
91-
InlineChat_RejectionEventCount: 11,
92-
InlineChat_TotalEventCount: 12,
93-
Inline_AICodeLines: 13,
94-
Inline_AcceptanceCount: 14,
95-
Inline_SuggestionsCount: 15,
96-
}
97-
98-
// Verify all fields are properly set
99-
assert.Equal(t, uint64(1), userData.ConnectionId)
100-
assert.Equal(t, "test-user", userData.UserId)
101-
assert.Equal(t, "Test User", userData.DisplayName)
102-
assert.Equal(t, now, userData.Date)
103-
assert.Equal(t, 1, userData.CodeReview_FindingsCount)
104-
assert.Equal(t, 2, userData.CodeReview_SucceededEventCount)
105-
assert.Equal(t, 3, userData.InlineChat_AcceptanceEventCount)
106-
assert.Equal(t, 4, userData.InlineChat_AcceptedLineAdditions)
107-
assert.Equal(t, 5, userData.InlineChat_AcceptedLineDeletions)
108-
assert.Equal(t, 6, userData.InlineChat_DismissalEventCount)
109-
assert.Equal(t, 7, userData.InlineChat_DismissedLineAdditions)
110-
assert.Equal(t, 8, userData.InlineChat_DismissedLineDeletions)
111-
assert.Equal(t, 9, userData.InlineChat_RejectedLineAdditions)
112-
assert.Equal(t, 10, userData.InlineChat_RejectedLineDeletions)
113-
assert.Equal(t, 11, userData.InlineChat_RejectionEventCount)
114-
assert.Equal(t, 12, userData.InlineChat_TotalEventCount)
115-
assert.Equal(t, 13, userData.Inline_AICodeLines)
116-
assert.Equal(t, 14, userData.Inline_AcceptanceCount)
117-
assert.Equal(t, 15, userData.Inline_SuggestionsCount)
118-
}

0 commit comments

Comments
 (0)