You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

user_analysis_for_activity.go 14 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. package models
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "time"
  6. "code.gitea.io/gitea/modules/log"
  7. "code.gitea.io/gitea/modules/timeutil"
  8. )
  9. type UserBusinessAnalysisForActivity struct {
  10. ID int64 `xorm:"pk"`
  11. CountDate int64 `xorm:"pk"`
  12. //action :ActionMergePullRequest // 11
  13. CodeMergeCount int `xorm:"NOT NULL DEFAULT 0"`
  14. //action :ActionCommitRepo
  15. CommitCount int `xorm:"NOT NULL DEFAULT 0"`
  16. //issue // 10
  17. IssueCount int `xorm:"NOT NULL DEFAULT 0"`
  18. //comment table current date
  19. CommentCount int `xorm:"NOT NULL DEFAULT 0"`
  20. //follow table
  21. WatchedCount int `xorm:"NOT NULL DEFAULT 0"`
  22. CommitCodeSize int `xorm:"NOT NULL DEFAULT 0"`
  23. //issue, issueassigees
  24. SolveIssueCount int `xorm:"NOT NULL DEFAULT 0"`
  25. //use
  26. RegistDate timeutil.TimeStamp `xorm:"NOT NULL"`
  27. //user
  28. Email string `xorm:"NOT NULL"`
  29. Phone string `xorm:"NULL"`
  30. //user
  31. Name string `xorm:"NOT NULL"`
  32. DataDate string `xorm:"NULL"`
  33. CloudBrainTaskNum int `xorm:"NOT NULL DEFAULT 0"`
  34. CommitDatasetNum int `xorm:"NOT NULL DEFAULT 0"`
  35. //0
  36. CommitModelCount int `xorm:"NOT NULL DEFAULT 0"`
  37. }
  38. func QueryDataForActivity(startTime time.Time, endTime time.Time) []*UserBusinessAnalysisForActivity {
  39. sess := x.NewSession()
  40. defer sess.Close()
  41. result := make([]*UserBusinessAnalysisForActivity, 0)
  42. publicRepo := queryPublicRepo()
  43. start_unix := startTime.Unix()
  44. end_unix := endTime.Unix()
  45. CodeMergeCountMap := queryPullRequestPublic(start_unix, end_unix, publicRepo)
  46. CommitCodeSizeMap, err := GetAllUserPublicRepoKPIStats(startTime, endTime)
  47. if err != nil {
  48. log.Info("error,info=" + err.Error())
  49. }
  50. CommitCountMap := queryCommitActionPublic(start_unix, end_unix, 5, publicRepo)
  51. IssueCountMap, publicRepoIssueIdMap := queryCreateIssuePublic(start_unix, end_unix, publicRepo)
  52. SolveIssueCountMap := querySolveIssuePublic(start_unix, end_unix, publicRepoIssueIdMap)
  53. WatchedCountMap, _ := queryFollow(start_unix, end_unix)
  54. CommentCountMap := queryCommentPublic(start_unix, end_unix, publicRepoIssueIdMap)
  55. PublicDataSet := queryAllPublicDataSet(publicRepo)
  56. DatasetFileNums := queryPublicDatasetFileNums(start_unix, end_unix, PublicDataSet)
  57. AiModelManageMap := queryUserModelPublic(start_unix, end_unix, publicRepo)
  58. cond := "type != 1 and is_active=true"
  59. count, err := sess.Where(cond).Count(new(User))
  60. var indexTotal int64
  61. indexTotal = 0
  62. for {
  63. sess.Select("`user`.*").Table("user").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  64. userList := make([]*User, 0)
  65. sess.Find(&userList)
  66. for i, userRecord := range userList {
  67. var dateRecord UserBusinessAnalysisForActivity
  68. dateRecord.ID = userRecord.ID
  69. log.Info("i=" + fmt.Sprint(i) + " userName=" + userRecord.Name)
  70. dateRecord.Email = userRecord.Email
  71. dateRecord.Phone = userRecord.PhoneNumber
  72. dateRecord.RegistDate = userRecord.CreatedUnix
  73. dateRecord.Name = userRecord.Name
  74. dateRecord.CodeMergeCount = getMapValue(dateRecord.ID, CodeMergeCountMap)
  75. dateRecord.CommitCount = getMapValue(dateRecord.ID, CommitCountMap)
  76. dateRecord.WatchedCount = getMapValue(dateRecord.ID, WatchedCountMap)
  77. dateRecord.CommitDatasetNum = getMapValue(dateRecord.ID, DatasetFileNums)
  78. dateRecord.IssueCount = getMapValue(dateRecord.ID, IssueCountMap)
  79. dateRecord.CommentCount = getMapValue(dateRecord.ID, CommentCountMap)
  80. if _, ok := CommitCodeSizeMap[dateRecord.Email]; !ok {
  81. dateRecord.CommitCodeSize = 0
  82. } else {
  83. dateRecord.CommitCodeSize = int(CommitCodeSizeMap[dateRecord.Email].CommitLines)
  84. }
  85. dateRecord.SolveIssueCount = getMapValue(dateRecord.ID, SolveIssueCountMap)
  86. dateRecord.CommitModelCount = getMapValue(dateRecord.ID, AiModelManageMap)
  87. result = append(result, &dateRecord)
  88. }
  89. indexTotal += PAGE_SIZE
  90. if indexTotal >= count {
  91. break
  92. }
  93. }
  94. return result
  95. }
  96. func querySolveIssuePublic(start_unix int64, end_unix int64, publicRepoIssueIdMap map[int64]int) map[int64]int {
  97. sess := x.NewSession()
  98. defer sess.Close()
  99. resultMap := make(map[int64]int)
  100. cond := "issue.is_closed=true and issue.closed_unix>=" + fmt.Sprint(start_unix) + " and issue.closed_unix<=" + fmt.Sprint(end_unix)
  101. count, err := sess.Table("issue_assignees").Join("inner", "issue", "issue.id=issue_assignees.issue_id").Where(cond).Count(new(IssueAssignees))
  102. if err != nil {
  103. log.Info("query issue error. return.")
  104. return resultMap
  105. }
  106. var indexTotal int64
  107. indexTotal = 0
  108. for {
  109. issueAssigneesList := make([]*IssueAssignees, 0)
  110. sess.Select("issue_assignees.*").Table("issue_assignees").
  111. Join("inner", "issue", "issue.id=issue_assignees.issue_id").
  112. Where(cond).OrderBy("issue_assignees.id asc").Limit(PAGE_SIZE, int(indexTotal))
  113. sess.Find(&issueAssigneesList)
  114. log.Info("query IssueAssignees size=" + fmt.Sprint(len(issueAssigneesList)))
  115. for _, issueAssigneesRecord := range issueAssigneesList {
  116. if isPublicRepo(issueAssigneesRecord.IssueID, publicRepoIssueIdMap) {
  117. if _, ok := resultMap[issueAssigneesRecord.AssigneeID]; !ok {
  118. resultMap[issueAssigneesRecord.AssigneeID] = 1
  119. } else {
  120. resultMap[issueAssigneesRecord.AssigneeID] += 1
  121. }
  122. }
  123. }
  124. indexTotal += PAGE_SIZE
  125. if indexTotal >= count {
  126. break
  127. }
  128. }
  129. return resultMap
  130. }
  131. func queryPublicRepo() map[int64]int {
  132. sess := x.NewSession()
  133. defer sess.Close()
  134. resultMap := make(map[int64]int)
  135. count, err := sess.Table("repository").Count(new(Repository))
  136. if err != nil {
  137. log.Info("query Repository error. return.")
  138. return resultMap
  139. }
  140. var indexTotal int64
  141. indexTotal = 0
  142. for {
  143. repositoryList := make([]*Repository, 0)
  144. sess.Select("*").Table("repository").OrderBy("id desc").Limit(PAGE_SIZE, int(indexTotal))
  145. sess.Find(&repositoryList)
  146. log.Info("query repo size=" + fmt.Sprint(len(repositoryList)))
  147. for _, repositoryRecord := range repositoryList {
  148. if repositoryRecord.IsPrivate {
  149. continue
  150. }
  151. if _, ok := resultMap[repositoryRecord.ID]; !ok {
  152. resultMap[repositoryRecord.ID] = 1
  153. }
  154. }
  155. indexTotal += PAGE_SIZE
  156. if indexTotal >= count {
  157. break
  158. }
  159. }
  160. return resultMap
  161. }
  162. func isPublicRepo(repoId int64, publicAllRepo map[int64]int) bool {
  163. if _, ok := publicAllRepo[repoId]; !ok {
  164. return false
  165. }
  166. return true
  167. }
  168. func queryPullRequestPublic(start_unix int64, end_unix int64, publicAllRepo map[int64]int) map[int64]int {
  169. sess := x.NewSession()
  170. defer sess.Close()
  171. resultMap := make(map[int64]int)
  172. cond := "pull_request.merged_unix>=" + fmt.Sprint(start_unix) + " and pull_request.merged_unix<=" + fmt.Sprint(end_unix)
  173. count, err := sess.Table("issue").Join("inner", "pull_request", "issue.id=pull_request.issue_id").Where(cond).Count(new(Issue))
  174. if err != nil {
  175. log.Info("query issue error. return.")
  176. return resultMap
  177. }
  178. var indexTotal int64
  179. indexTotal = 0
  180. for {
  181. issueList := make([]*Issue, 0)
  182. sess.Select("issue.*").Table("issue").Join("inner", "pull_request", "issue.id=pull_request.issue_id").Where(cond).OrderBy("issue.id asc").Limit(PAGE_SIZE, int(indexTotal))
  183. sess.Find(&issueList)
  184. log.Info("query issue(PR) size=" + fmt.Sprint(len(issueList)))
  185. for _, issueRecord := range issueList {
  186. if isPublicRepo(issueRecord.RepoID, publicAllRepo) {
  187. if _, ok := resultMap[issueRecord.PosterID]; !ok {
  188. resultMap[issueRecord.PosterID] = 1
  189. } else {
  190. resultMap[issueRecord.PosterID] += 1
  191. }
  192. }
  193. }
  194. indexTotal += PAGE_SIZE
  195. if indexTotal >= count {
  196. break
  197. }
  198. }
  199. return resultMap
  200. }
  201. func queryCommitActionPublic(start_unix int64, end_unix int64, actionType int64, publicAllRepo map[int64]int) map[int64]int {
  202. sess := x.NewSession()
  203. defer sess.Close()
  204. resultMap := make(map[int64]int)
  205. cond := "user_id=act_user_id and op_type=" + fmt.Sprint(actionType) + " and created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  206. count, err := sess.Where(cond).Count(new(Action))
  207. if err != nil {
  208. log.Info("query action error. return.")
  209. return resultMap
  210. }
  211. var indexTotal int64
  212. indexTotal = 0
  213. for {
  214. sess.Select("id,user_id,op_type,act_user_id,repo_id").Table("action").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  215. actionList := make([]*Action, 0)
  216. sess.Find(&actionList)
  217. log.Info("query action size=" + fmt.Sprint(len(actionList)))
  218. for _, actionRecord := range actionList {
  219. if isPublicRepo(actionRecord.RepoID, publicAllRepo) {
  220. if _, ok := resultMap[actionRecord.UserID]; !ok {
  221. resultMap[actionRecord.UserID] = 1
  222. } else {
  223. resultMap[actionRecord.UserID] += 1
  224. }
  225. }
  226. }
  227. indexTotal += PAGE_SIZE
  228. if indexTotal >= count {
  229. break
  230. }
  231. }
  232. return resultMap
  233. }
  234. func queryCreateIssuePublic(start_unix int64, end_unix int64, publicAllRepo map[int64]int) (map[int64]int, map[int64]int) {
  235. sess := x.NewSession()
  236. defer sess.Close()
  237. resultMap := make(map[int64]int)
  238. publicRepoIssueIdMap := make(map[int64]int)
  239. cond := "is_pull=false and created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  240. count, err := sess.Where(cond).Count(new(Issue))
  241. if err != nil {
  242. log.Info("query Issue error. return.")
  243. return resultMap, publicRepoIssueIdMap
  244. }
  245. var indexTotal int64
  246. indexTotal = 0
  247. for {
  248. sess.Select("id,poster_id,repo_id").Table("issue").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  249. issueList := make([]*Issue, 0)
  250. sess.Find(&issueList)
  251. log.Info("query issue size=" + fmt.Sprint(len(issueList)))
  252. for _, issueRecord := range issueList {
  253. if isPublicRepo(issueRecord.RepoID, publicAllRepo) {
  254. if _, ok := resultMap[issueRecord.PosterID]; !ok {
  255. resultMap[issueRecord.PosterID] = 1
  256. } else {
  257. resultMap[issueRecord.PosterID] += 1
  258. }
  259. publicRepoIssueIdMap[issueRecord.ID] = 1
  260. }
  261. }
  262. indexTotal += PAGE_SIZE
  263. if indexTotal >= count {
  264. break
  265. }
  266. }
  267. resultMapJson, _ := json.Marshal(resultMap)
  268. log.Info("issue resultMapJson=" + string(resultMapJson))
  269. publicRepoIssueIdMapJson, _ := json.Marshal(publicRepoIssueIdMap)
  270. log.Info("issue publicRepoIssueIdMapJson=" + string(publicRepoIssueIdMapJson))
  271. return resultMap, publicRepoIssueIdMap
  272. }
  273. func queryCommentPublic(start_unix int64, end_unix int64, publicRepoIssueIdMap map[int64]int) map[int64]int {
  274. sess := x.NewSession()
  275. defer sess.Close()
  276. cond := "created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  277. resultMap := make(map[int64]int)
  278. count, err := sess.Where(cond).Count(new(Comment))
  279. if err != nil {
  280. log.Info("query Comment error. return.")
  281. return resultMap
  282. }
  283. var indexTotal int64
  284. indexTotal = 0
  285. for {
  286. sess.Select("id,type,poster_id").Table("comment").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  287. commentList := make([]*Comment, 0)
  288. sess.Find(&commentList)
  289. log.Info("query Comment size=" + fmt.Sprint(len(commentList)))
  290. for _, commentRecord := range commentList {
  291. if isPublicRepo(commentRecord.IssueID, publicRepoIssueIdMap) {
  292. if _, ok := resultMap[commentRecord.PosterID]; !ok {
  293. resultMap[commentRecord.PosterID] = 1
  294. } else {
  295. resultMap[commentRecord.PosterID] += 1
  296. }
  297. }
  298. }
  299. indexTotal += PAGE_SIZE
  300. if indexTotal >= count {
  301. break
  302. }
  303. }
  304. resultMapJson, _ := json.Marshal(resultMap)
  305. log.Info("Comment resultMapJson=" + string(resultMapJson))
  306. return resultMap
  307. }
  308. func queryAllPublicDataSet(publicAllRepo map[int64]int) map[int64]int {
  309. sess := x.NewSession()
  310. defer sess.Close()
  311. publicDataSetIdMap := make(map[int64]int)
  312. count, err := sess.Count(new(Dataset))
  313. if err != nil {
  314. log.Info("query dataset error. return.")
  315. return publicDataSetIdMap
  316. }
  317. var indexTotal int64
  318. indexTotal = 0
  319. for {
  320. sess.Select("id,user_id,repo_id").Table(new(Dataset)).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  321. datasetList := make([]*Dataset, 0)
  322. sess.Find(&datasetList)
  323. log.Info("query datasetList size=" + fmt.Sprint(len(datasetList)))
  324. for _, datasetRecord := range datasetList {
  325. if isPublicRepo(datasetRecord.RepoID, publicAllRepo) {
  326. publicDataSetIdMap[datasetRecord.ID] = 1
  327. }
  328. }
  329. indexTotal += PAGE_SIZE
  330. if indexTotal >= count {
  331. break
  332. }
  333. }
  334. return publicDataSetIdMap
  335. }
  336. func queryPublicDatasetFileNums(start_unix int64, end_unix int64, publicDataSetIdMap map[int64]int) map[int64]int {
  337. sess := x.NewSession()
  338. defer sess.Close()
  339. resultNumMap := make(map[int64]int)
  340. cond := " created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  341. count, err := sess.Where(cond).Count(new(Attachment))
  342. if err != nil {
  343. log.Info("query attachment error. return.")
  344. return resultNumMap
  345. }
  346. var indexTotal int64
  347. indexTotal = 0
  348. for {
  349. sess.Select("id,uploader_id,size,dataset_id").Table("attachment").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  350. attachmentList := make([]*Attachment, 0)
  351. sess.Find(&attachmentList)
  352. log.Info("query Attachment size=" + fmt.Sprint(len(attachmentList)))
  353. for _, attachRecord := range attachmentList {
  354. if isPublicRepo(attachRecord.DatasetID, publicDataSetIdMap) {
  355. if _, ok := resultNumMap[attachRecord.UploaderID]; !ok {
  356. resultNumMap[attachRecord.UploaderID] = 1
  357. } else {
  358. resultNumMap[attachRecord.UploaderID] += 1
  359. }
  360. }
  361. }
  362. indexTotal += PAGE_SIZE
  363. if indexTotal >= count {
  364. break
  365. }
  366. }
  367. return resultNumMap
  368. }
  369. func queryUserModelPublic(start_unix int64, end_unix int64, publicAllRepo map[int64]int) map[int64]int {
  370. sess := x.NewSession()
  371. defer sess.Close()
  372. resultMap := make(map[int64]int)
  373. cond := " created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  374. count, err := sess.Where(cond).Count(new(AiModelManage))
  375. if err != nil {
  376. log.Info("query AiModelManage error. return.")
  377. return resultMap
  378. }
  379. var indexTotal int64
  380. indexTotal = 0
  381. for {
  382. sess.Select("id,user_id,repo_id").Table("ai_model_manage").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  383. aiModelList := make([]*AiModelManage, 0)
  384. sess.Find(&aiModelList)
  385. log.Info("query AiModelManage size=" + fmt.Sprint(len(aiModelList)))
  386. for _, aiModelRecord := range aiModelList {
  387. if isPublicRepo(aiModelRecord.RepoId, publicAllRepo) {
  388. if _, ok := resultMap[aiModelRecord.UserId]; !ok {
  389. resultMap[aiModelRecord.UserId] = 1
  390. } else {
  391. resultMap[aiModelRecord.UserId] += 1
  392. }
  393. }
  394. }
  395. indexTotal += PAGE_SIZE
  396. if indexTotal >= count {
  397. break
  398. }
  399. }
  400. return resultMap
  401. }