| skipped 79 lines |
80 | 80 | | import io.onedev.server.search.entity.EntityQuery; |
81 | 81 | | import io.onedev.server.search.entity.EntitySort; |
82 | 82 | | import io.onedev.server.search.entity.EntitySort.Direction; |
83 | | - | import io.onedev.server.search.entity.issue.IssueCriteria; |
84 | 83 | | import io.onedev.server.search.entity.issue.IssueQuery; |
| 84 | + | import io.onedev.server.search.entity.issue.IssueQueryParseOption; |
| 85 | + | import io.onedev.server.search.entity.issue.IssueQueryUpdater; |
85 | 86 | | import io.onedev.server.security.SecurityUtils; |
86 | 87 | | import io.onedev.server.security.permission.AccessProject; |
87 | 88 | | import io.onedev.server.storage.AttachmentStorageManager; |
88 | 89 | | import io.onedev.server.util.MilestoneAndState; |
89 | 90 | | import io.onedev.server.util.Pair; |
90 | 91 | | import io.onedev.server.util.ProjectScopedNumber; |
| 92 | + | import io.onedev.server.util.criteria.Criteria; |
91 | 93 | | import io.onedev.server.util.facade.IssueFacade; |
92 | 94 | | import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldResolution; |
93 | 95 | | import io.onedev.server.web.component.issue.workflowreconcile.UndefinedFieldValue; |
| skipped 27 lines |
121 | 123 | | |
122 | 124 | | private final RoleManager roleManager; |
123 | 125 | | |
| 126 | + | private final LinkSpecManager linkSpecManager; |
| 127 | + | |
124 | 128 | | private final Map<Long, IssueFacade> cache = new HashMap<>(); |
125 | 129 | | |
126 | 130 | | private final ReadWriteLock cacheLock = new ReentrantReadWriteLock(); |
| skipped 5 lines |
132 | 136 | | ProjectManager projectManager, UserManager userManager, |
133 | 137 | | RoleManager roleManager, AttachmentStorageManager attachmentStorageManager, |
134 | 138 | | IssueCommentManager issueCommentManager, EntityReferenceManager entityReferenceManager, |
135 | | - | IssueScheduleManager issueScheduleManager) { |
| 139 | + | IssueScheduleManager issueScheduleManager, LinkSpecManager linkSpecManager) { |
136 | 140 | | super(dao); |
137 | 141 | | this.issueFieldManager = issueFieldManager; |
138 | 142 | | this.issueQueryPersonalizationManager = issueQueryPersonalizationManager; |
| skipped 3 lines |
142 | 146 | | this.transactionManager = transactionManager; |
143 | 147 | | this.userManager = userManager; |
144 | 148 | | this.roleManager = roleManager; |
| 149 | + | this.linkSpecManager = linkSpecManager; |
145 | 150 | | this.attachmentStorageManager = attachmentStorageManager; |
146 | 151 | | this.issueCommentManager = issueCommentManager; |
147 | 152 | | this.entityReferenceManager = entityReferenceManager; |
| skipped 176 lines |
324 | 329 | | |
325 | 330 | | @Sessional |
326 | 331 | | @Override |
327 | | - | public int count(IssueCriteria issueCriteria) { |
| 332 | + | public int count(Criteria<Issue> issueCriteria) { |
328 | 333 | | CriteriaBuilder builder = getSession().getCriteriaBuilder(); |
329 | 334 | | CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class); |
330 | 335 | | Root<Issue> root = criteriaQuery.from(Issue.class); |
| skipped 5 lines |
336 | 341 | | |
337 | 342 | | @Sessional |
338 | 343 | | @Override |
339 | | - | public int count(Project project, boolean inTree, IssueCriteria issueCriteria) { |
| 344 | + | public int count(Project project, boolean inTree, Criteria<Issue> issueCriteria) { |
340 | 345 | | CriteriaBuilder builder = getSession().getCriteriaBuilder(); |
341 | 346 | | CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class); |
342 | 347 | | Root<Issue> root = criteriaQuery.from(Issue.class); |
| skipped 4 lines |
347 | 352 | | return getSession().createQuery(criteriaQuery).uniqueResult().intValue(); |
348 | 353 | | } |
349 | 354 | | |
350 | | - | private Predicate[] getPredicates(Project project, boolean inTree, @Nullable io.onedev.server.search.entity.EntityCriteria<Issue> issueCriteria, |
| 355 | + | private Predicate[] getPredicates(Project project, boolean inTree, @Nullable Criteria<Issue> issueCriteria, |
351 | 356 | | CriteriaQuery<?> query, CriteriaBuilder builder, Root<Issue> root) { |
352 | 357 | | List<Predicate> predicates = new ArrayList<>(); |
353 | 358 | | Path<Project> projectPath = root.get(Issue.PROP_PROJECT); |
| skipped 7 lines |
361 | 366 | | return predicates.toArray(new Predicate[predicates.size()]); |
362 | 367 | | } |
363 | 368 | | |
364 | | - | private Predicate[] getPredicates(@Nullable io.onedev.server.search.entity.EntityCriteria<Issue> issueCriteria, |
| 369 | + | private Predicate[] getPredicates(@Nullable Criteria<Issue> issueCriteria, |
365 | 370 | | CriteriaQuery<?> query, CriteriaBuilder builder, Root<Issue> root) { |
366 | 371 | | List<Predicate> predicates = new ArrayList<>(); |
367 | 372 | | if (!SecurityUtils.isAdministrator()) { |
| skipped 23 lines |
391 | 396 | | } |
392 | 397 | | |
393 | 398 | | for (Project project: projectManager.query()) { |
394 | | - | undefinedStates.addAll(project.getIssueSetting().getUndefinedStates(project)); |
395 | | - | undefinedStates.addAll(project.getBuildSetting().getUndefinedStates(project)); |
| 399 | + | undefinedStates.addAll(project.getIssueSetting().getUndefinedStates()); |
| 400 | + | undefinedStates.addAll(project.getBuildSetting().getUndefinedStates()); |
| 401 | + | } |
| 402 | + | |
| 403 | + | for (LinkSpec link: linkSpecManager.query()) { |
| 404 | + | for (IssueQueryUpdater updater: link.getQueryUpdaters()) |
| 405 | + | undefinedStates.addAll(updater.getUndefinedStates()); |
396 | 406 | | } |
397 | 407 | | |
398 | 408 | | for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query()) |
399 | | - | populateUndefinedStates(undefinedStates, setting.getProject(), setting.getQueries()); |
| 409 | + | populateUndefinedStates(undefinedStates, setting.getQueries()); |
400 | 410 | | |
401 | 411 | | for (User user: userManager.query()) |
402 | | - | populateUndefinedStates(undefinedStates, null, user.getIssueQueryPersonalization().getQueries()); |
| 412 | + | populateUndefinedStates(undefinedStates, user.getIssueQueryPersonalization().getQueries()); |
403 | 413 | | |
404 | 414 | | return undefinedStates; |
405 | 415 | | } |
406 | 416 | | |
407 | | - | private void populateUndefinedStates(Collection<String> undefinedStates, @Nullable Project project, |
408 | | - | List<NamedIssueQuery> namedQueries) { |
| 417 | + | private void populateUndefinedStates(Collection<String> undefinedStates, List<NamedIssueQuery> namedQueries) { |
| 418 | + | IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true); |
409 | 419 | | for (NamedIssueQuery namedQuery: namedQueries) { |
410 | 420 | | try { |
411 | | - | undefinedStates.addAll(IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true).getUndefinedStates()); |
| 421 | + | undefinedStates.addAll(IssueQuery.parse(null, namedQuery.getQuery(), option, false).getUndefinedStates()); |
412 | 422 | | } catch (Exception e) { |
413 | 423 | | } |
414 | 424 | | } |
| skipped 15 lines |
430 | 440 | | } |
431 | 441 | | |
432 | 442 | | for (Project project: projectManager.query()) { |
433 | | - | undefinedFields.addAll(project.getIssueSetting().getUndefinedFields(project)); |
434 | | - | undefinedFields.addAll(project.getBuildSetting().getUndefinedFields(project)); |
| 443 | + | undefinedFields.addAll(project.getIssueSetting().getUndefinedFields()); |
| 444 | + | undefinedFields.addAll(project.getBuildSetting().getUndefinedFields()); |
| 445 | + | } |
| 446 | + | |
| 447 | + | for (LinkSpec link: linkSpecManager.query()) { |
| 448 | + | for (IssueQueryUpdater updater: link.getQueryUpdaters()) |
| 449 | + | undefinedFields.addAll(updater.getUndefinedFields()); |
435 | 450 | | } |
436 | 451 | | |
437 | 452 | | for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query()) |
438 | | - | populateUndefinedFields(undefinedFields, setting.getProject(), setting.getQueries()); |
| 453 | + | populateUndefinedFields(undefinedFields, setting.getQueries()); |
439 | 454 | | |
440 | 455 | | for (User user: userManager.query()) |
441 | | - | populateUndefinedFields(undefinedFields, null, user.getIssueQueryPersonalization().getQueries()); |
| 456 | + | populateUndefinedFields(undefinedFields, user.getIssueQueryPersonalization().getQueries()); |
442 | 457 | | |
443 | 458 | | return undefinedFields; |
444 | 459 | | } |
445 | 460 | | |
446 | | - | private void populateUndefinedFields(Collection<String> undefinedFields, |
447 | | - | @Nullable Project project, List<NamedIssueQuery> namedQueries) { |
| 461 | + | private void populateUndefinedFields(Collection<String> undefinedFields, List<NamedIssueQuery> namedQueries) { |
| 462 | + | IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true); |
448 | 463 | | for (NamedIssueQuery namedQuery: namedQueries) { |
449 | 464 | | try { |
450 | | - | undefinedFields.addAll(IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true).getUndefinedFields()); |
| 465 | + | undefinedFields.addAll(IssueQuery.parse(null, namedQuery.getQuery(), option, false).getUndefinedFields()); |
451 | 466 | | } catch (Exception e) { |
452 | 467 | | } |
453 | 468 | | } |
| skipped 20 lines |
474 | 489 | | } |
475 | 490 | | |
476 | 491 | | for (Project project: projectManager.query()) { |
477 | | - | undefinedFieldValues.addAll(project.getIssueSetting().getUndefinedFieldValues(project)); |
478 | | - | undefinedFieldValues.addAll(project.getBuildSetting().getUndefinedFieldValues(project)); |
| 492 | + | undefinedFieldValues.addAll(project.getIssueSetting().getUndefinedFieldValues()); |
| 493 | + | undefinedFieldValues.addAll(project.getBuildSetting().getUndefinedFieldValues()); |
| 494 | + | } |
| 495 | + | |
| 496 | + | for (LinkSpec link: linkSpecManager.query()) { |
| 497 | + | for (IssueQueryUpdater updater: link.getQueryUpdaters()) |
| 498 | + | undefinedFieldValues.addAll(updater.getUndefinedFieldValues()); |
479 | 499 | | } |
480 | 500 | | |
481 | 501 | | for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query()) |
482 | | - | populateUndefinedFieldValues(undefinedFieldValues, setting.getProject(), setting.getQueries()); |
| 502 | + | populateUndefinedFieldValues(undefinedFieldValues, setting.getQueries()); |
483 | 503 | | |
484 | 504 | | for (User user: userManager.query()) |
485 | | - | populateUndefinedFieldValues(undefinedFieldValues, null, user.getIssueQueryPersonalization().getQueries()); |
| 505 | + | populateUndefinedFieldValues(undefinedFieldValues, user.getIssueQueryPersonalization().getQueries()); |
486 | 506 | | |
487 | 507 | | return undefinedFieldValues; |
488 | 508 | | } |
489 | 509 | | |
490 | 510 | | private void populateUndefinedFieldValues(Collection<UndefinedFieldValue> undefinedFieldValues, |
491 | | - | @Nullable Project project, List<NamedIssueQuery> namedQueries) { |
| 511 | + | List<NamedIssueQuery> namedQueries) { |
| 512 | + | IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true); |
492 | 513 | | for (NamedIssueQuery namedQuery: namedQueries) { |
493 | 514 | | try { |
494 | | - | undefinedFieldValues.addAll(IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true).getUndefinedFieldValues()); |
| 515 | + | undefinedFieldValues.addAll(IssueQuery.parse(null, namedQuery.getQuery(), option, false).getUndefinedFieldValues()); |
495 | 516 | | } catch (Exception e) { |
496 | 517 | | } |
497 | 518 | | } |
| skipped 38 lines |
536 | 557 | | } |
537 | 558 | | |
538 | 559 | | for (Project project: projectManager.query()) { |
539 | | - | project.getIssueSetting().fixUndefinedStates(project, resolutions); |
540 | | - | project.getBuildSetting().fixUndefinedStates(project, resolutions); |
| 560 | + | project.getIssueSetting().fixUndefinedStates(resolutions); |
| 561 | + | project.getBuildSetting().fixUndefinedStates(resolutions); |
| 562 | + | } |
| 563 | + | |
| 564 | + | for (LinkSpec link: linkSpecManager.query()) { |
| 565 | + | for (IssueQueryUpdater updater: link.getQueryUpdaters()) |
| 566 | + | updater.fixUndefinedStates(resolutions); |
541 | 567 | | } |
542 | 568 | | |
543 | 569 | | for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query()) |
544 | | - | fixUndefinedStates(setting.getProject(), resolutions, setting.getQueries()); |
| 570 | + | fixUndefinedStates(resolutions, setting.getQueries()); |
545 | 571 | | |
546 | 572 | | for (User user: userManager.query()) |
547 | | - | fixUndefinedStates(null, resolutions, user.getIssueQueryPersonalization().getQueries()); |
| 573 | + | fixUndefinedStates(resolutions, user.getIssueQueryPersonalization().getQueries()); |
548 | 574 | | } |
549 | 575 | | |
550 | | - | private void fixUndefinedStates(@Nullable Project project, Map<String, UndefinedStateResolution> resolutions, |
| 576 | + | private void fixUndefinedStates(Map<String, UndefinedStateResolution> resolutions, |
551 | 577 | | List<NamedIssueQuery> namedQueries) { |
| 578 | + | IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true); |
552 | 579 | | for (Iterator<NamedIssueQuery> it = namedQueries.iterator(); it.hasNext();) { |
553 | 580 | | NamedIssueQuery namedQuery = it.next(); |
554 | 581 | | try { |
555 | | - | IssueQuery parsedQuery = IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true); |
| 582 | + | IssueQuery parsedQuery = IssueQuery.parse(null, namedQuery.getQuery(), option, false); |
556 | 583 | | if (parsedQuery.fixUndefinedStates(resolutions)) |
557 | 584 | | namedQuery.setQuery(parsedQuery.toString()); |
558 | 585 | | else |
| skipped 22 lines |
581 | 608 | | } |
582 | 609 | | |
583 | 610 | | for (Project project: projectManager.query()) { |
584 | | - | project.getIssueSetting().fixUndefinedFields(project, resolutions); |
585 | | - | project.getBuildSetting().fixUndefinedFields(project, resolutions); |
| 611 | + | project.getIssueSetting().fixUndefinedFields(resolutions); |
| 612 | + | project.getBuildSetting().fixUndefinedFields(resolutions); |
| 613 | + | } |
| 614 | + | |
| 615 | + | for (LinkSpec link: linkSpecManager.query()) { |
| 616 | + | for (IssueQueryUpdater updater: link.getQueryUpdaters()) |
| 617 | + | updater.fixUndefinedFields(resolutions); |
586 | 618 | | } |
587 | 619 | | |
588 | 620 | | for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query()) |
| skipped 10 lines |
599 | 631 | | |
600 | 632 | | private void fixUndefinedFields(Map<String, UndefinedFieldResolution> resolutions, |
601 | 633 | | @Nullable Project project, List<NamedIssueQuery> namedQueries) { |
| 634 | + | IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true); |
602 | 635 | | for (Iterator<NamedIssueQuery> it = namedQueries.iterator(); it.hasNext();) { |
603 | 636 | | NamedIssueQuery namedQuery = it.next(); |
604 | 637 | | try { |
605 | | - | IssueQuery parsedQuery = IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true); |
| 638 | + | IssueQuery parsedQuery = IssueQuery.parse(project, namedQuery.getQuery(), option, false); |
606 | 639 | | if (parsedQuery.fixUndefinedFields(resolutions)) |
607 | 640 | | namedQuery.setQuery(parsedQuery.toString()); |
608 | 641 | | else |
| skipped 24 lines |
633 | 666 | | } |
634 | 667 | | |
635 | 668 | | for (Project project: projectManager.query()) { |
636 | | - | project.getIssueSetting().fixUndefinedFieldValues(project, resolutions); |
637 | | - | project.getBuildSetting().fixUndefinedFieldValues(project, resolutions); |
| 669 | + | project.getIssueSetting().fixUndefinedFieldValues(resolutions); |
| 670 | + | project.getBuildSetting().fixUndefinedFieldValues(resolutions); |
| 671 | + | } |
| 672 | + | |
| 673 | + | for (LinkSpec link: linkSpecManager.query()) { |
| 674 | + | for (IssueQueryUpdater updater: link.getQueryUpdaters()) |
| 675 | + | updater.fixUndefinedFieldValues(resolutions); |
638 | 676 | | } |
639 | 677 | | |
640 | 678 | | for (IssueQueryPersonalization setting: issueQueryPersonalizationManager.query()) |
| skipped 10 lines |
651 | 689 | | |
652 | 690 | | private void fixUndefinedFieldValues(Map<String, UndefinedFieldValuesResolution> resolutions, |
653 | 691 | | @Nullable Project project, List<NamedIssueQuery> namedQueries) { |
| 692 | + | IssueQueryParseOption option = new IssueQueryParseOption().enableAll(true); |
654 | 693 | | for (Iterator<NamedIssueQuery> it = namedQueries.iterator(); it.hasNext();) { |
655 | 694 | | NamedIssueQuery namedQuery = it.next(); |
656 | 695 | | try { |
657 | | - | IssueQuery query = IssueQuery.parse(project, namedQuery.getQuery(), false, true, true, true, true, true); |
| 696 | + | IssueQuery query = IssueQuery.parse(project, namedQuery.getQuery(), option, false); |
658 | 697 | | if (query.fixUndefinedFieldValues(resolutions)) |
659 | 698 | | namedQuery.setQuery(query.toString()); |
660 | 699 | | else |
| skipped 339 lines |