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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. package models
  2. import (
  3. "fmt"
  4. "time"
  5. "code.gitea.io/gitea/modules/log"
  6. "code.gitea.io/gitea/modules/timeutil"
  7. "xorm.io/builder"
  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 := "issue.created_unix>=" + fmt.Sprint(start_unix) + " and issue.created_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. return resultMap, publicRepoIssueIdMap
  268. }
  269. func queryCommentPublic(start_unix int64, end_unix int64, publicRepoIssueIdMap map[int64]int) map[int64]int {
  270. sess := x.NewSession()
  271. defer sess.Close()
  272. cond := "created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  273. resultMap := make(map[int64]int)
  274. count, err := sess.Where(cond).Count(new(Comment))
  275. if err != nil {
  276. log.Info("query Comment error. return.")
  277. return resultMap
  278. }
  279. var indexTotal int64
  280. indexTotal = 0
  281. for {
  282. sess.Select("id,type,poster_id,issue_id").Table("comment").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  283. commentList := make([]*Comment, 0)
  284. sess.Find(&commentList)
  285. log.Info("query Comment size=" + fmt.Sprint(len(commentList)))
  286. for _, commentRecord := range commentList {
  287. if isPublicRepo(commentRecord.IssueID, publicRepoIssueIdMap) {
  288. if _, ok := resultMap[commentRecord.PosterID]; !ok {
  289. resultMap[commentRecord.PosterID] = 1
  290. } else {
  291. resultMap[commentRecord.PosterID] += 1
  292. }
  293. }
  294. }
  295. indexTotal += PAGE_SIZE
  296. if indexTotal >= count {
  297. break
  298. }
  299. }
  300. return resultMap
  301. }
  302. func queryAllPublicDataSet(publicAllRepo map[int64]int) map[int64]int {
  303. sess := x.NewSession()
  304. defer sess.Close()
  305. publicDataSetIdMap := make(map[int64]int)
  306. count, err := sess.Count(new(Dataset))
  307. if err != nil {
  308. log.Info("query dataset error. return.")
  309. return publicDataSetIdMap
  310. }
  311. var indexTotal int64
  312. indexTotal = 0
  313. for {
  314. sess.Select("id,user_id,repo_id").Table(new(Dataset)).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  315. datasetList := make([]*Dataset, 0)
  316. sess.Find(&datasetList)
  317. log.Info("query datasetList size=" + fmt.Sprint(len(datasetList)))
  318. for _, datasetRecord := range datasetList {
  319. if isPublicRepo(datasetRecord.RepoID, publicAllRepo) {
  320. publicDataSetIdMap[datasetRecord.ID] = 1
  321. }
  322. }
  323. indexTotal += PAGE_SIZE
  324. if indexTotal >= count {
  325. break
  326. }
  327. }
  328. return publicDataSetIdMap
  329. }
  330. func queryPublicDatasetFileNums(start_unix int64, end_unix int64, publicDataSetIdMap map[int64]int) map[int64]int {
  331. sess := x.NewSession()
  332. defer sess.Close()
  333. resultNumMap := make(map[int64]int)
  334. cond := " created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  335. count, err := sess.Where(cond).Count(new(Attachment))
  336. if err != nil {
  337. log.Info("query attachment error. return.")
  338. return resultNumMap
  339. }
  340. var indexTotal int64
  341. indexTotal = 0
  342. for {
  343. sess.Select("id,uploader_id,size,dataset_id").Table("attachment").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  344. attachmentList := make([]*Attachment, 0)
  345. sess.Find(&attachmentList)
  346. log.Info("query Attachment size=" + fmt.Sprint(len(attachmentList)))
  347. for _, attachRecord := range attachmentList {
  348. if isPublicRepo(attachRecord.DatasetID, publicDataSetIdMap) {
  349. if _, ok := resultNumMap[attachRecord.UploaderID]; !ok {
  350. resultNumMap[attachRecord.UploaderID] = 1
  351. } else {
  352. resultNumMap[attachRecord.UploaderID] += 1
  353. }
  354. }
  355. }
  356. indexTotal += PAGE_SIZE
  357. if indexTotal >= count {
  358. break
  359. }
  360. }
  361. return resultNumMap
  362. }
  363. func queryUserModelPublic(start_unix int64, end_unix int64, publicAllRepo map[int64]int) map[int64]int {
  364. sess := x.NewSession()
  365. defer sess.Close()
  366. resultMap := make(map[int64]int)
  367. cond := " created_unix>=" + fmt.Sprint(start_unix) + " and created_unix<=" + fmt.Sprint(end_unix)
  368. count, err := sess.Where(cond).Count(new(AiModelManage))
  369. if err != nil {
  370. log.Info("query AiModelManage error. return.")
  371. return resultMap
  372. }
  373. var indexTotal int64
  374. indexTotal = 0
  375. for {
  376. sess.Select("id,user_id,repo_id").Table("ai_model_manage").Where(cond).OrderBy("id asc").Limit(PAGE_SIZE, int(indexTotal))
  377. aiModelList := make([]*AiModelManage, 0)
  378. sess.Find(&aiModelList)
  379. log.Info("query AiModelManage size=" + fmt.Sprint(len(aiModelList)))
  380. for _, aiModelRecord := range aiModelList {
  381. if isPublicRepo(aiModelRecord.RepoId, publicAllRepo) {
  382. if _, ok := resultMap[aiModelRecord.UserId]; !ok {
  383. resultMap[aiModelRecord.UserId] = 1
  384. } else {
  385. resultMap[aiModelRecord.UserId] += 1
  386. }
  387. }
  388. }
  389. indexTotal += PAGE_SIZE
  390. if indexTotal >= count {
  391. break
  392. }
  393. }
  394. return resultMap
  395. }
  396. func QueryUserLoginInfo(userIds []int64) []*UserLoginLog {
  397. statictisSess := xStatistic.NewSession()
  398. defer statictisSess.Close()
  399. var cond = builder.NewCond()
  400. cond = cond.And(builder.In("u_id", userIds))
  401. statictisSess.Select("*").Table(new(UserLoginLog)).Where(cond)
  402. loginList := make([]*UserLoginLog, 0)
  403. statictisSess.Find(&loginList)
  404. return loginList
  405. }