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

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