Skip to content

Commit ab231dd

Browse files
committed
Refactor creating low-level calendars, and tentatively fill competition rules classes
1 parent 80db699 commit ab231dd

24 files changed

+529
-218
lines changed

lib/models/db/event_series/competition/calendar_records/calendar_main_competition_records_to_calendar.dart

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@ import 'package:sj_manager/models/db/event_series/competition/calendar_records/c
22
import 'package:sj_manager/models/db/event_series/competition/calendar_records/converter.dart';
33
import 'package:sj_manager/models/db/event_series/competition/competition.dart';
44
import 'package:sj_manager/models/db/event_series/competition/competition_type.dart';
5+
import 'package:sj_manager/models/db/event_series/competition/high_level_calendar.dart';
56
import 'package:sj_manager/models/db/event_series/competition/rules/competition_rules/competition_rules.dart';
7+
import 'package:sj_manager/models/db/event_series/event_series_calendar.dart';
68
import 'package:sj_manager/models/db/hill/hill.dart';
79
import 'package:sj_manager/models/db/jumper/jumper.dart';
810
import 'package:sj_manager/models/db/team/team.dart';
911
import 'package:sj_manager/utils/iterable.dart';
1012

1113
class CalendarMainCompetitionRecordsToCalendarConverter
1214
implements LowLevelCalendarCreator<CalendarMainCompetitionRecord> {
13-
late List<CalendarMainCompetitionRecord> _highLevelCalendar;
14-
late List<Competition> _lowLevelCalendar;
15+
late List<CalendarMainCompetitionRecord> _highLevelComps;
16+
late List<Competition> _lowLevelComps;
17+
var _qualifications = <Competition, Competition>{};
1518
late Set<Competition> _competitionsWhichShouldMoveBackIfHaveTeamCompBehind;
1619
late List<Competition> _compsBelongingToTeamComp;
1720
late Competition _firstBelongingToTeamComp;
@@ -20,18 +23,28 @@ class CalendarMainCompetitionRecordsToCalendarConverter
2023
static const _day = Duration(days: 1);
2124

2225
@override
23-
List<Competition> convert(List<CalendarMainCompetitionRecord> highLevelCalendar) {
24-
_highLevelCalendar = highLevelCalendar;
26+
EventSeriesCalendar convert(
27+
HighLevelCalendar<CalendarMainCompetitionRecord> highLevelCalendar) {
28+
_qualifications = {};
29+
_highLevelComps = highLevelCalendar.highLevelCompetitions;
2530
_competitionsWhichShouldMoveBackIfHaveTeamCompBehind = {};
2631
_createLowCalendarAndAppropriatelyMarkCompetitions();
2732
_moveAppropriateCompetitionsBehindTeamComps();
2833
_addDayForTrainingsAndTrialRoundsAfterCompetitionOrQualificationsIfSameDay();
29-
return _lowLevelCalendar;
34+
35+
return EventSeriesCalendar(
36+
competitions: _lowLevelComps,
37+
classifications: highLevelCalendar.classifications,
38+
qualifications: _qualifications,
39+
);
3040
}
3141

3242
void _createLowCalendarAndAppropriatelyMarkCompetitions() {
33-
_lowLevelCalendar = _highLevelCalendar.expand((highLevelComp) {
43+
_lowLevelComps = _highLevelComps.expand((highLevelComp) {
3444
final rawComps = highLevelComp.createRawCompetitions();
45+
if (highLevelComp.setup.qualificationsRules != null) {
46+
_qualifications[rawComps.last] = rawComps.penultimate;
47+
}
3548
_maybeMarkCompetitionItShouldMoveBehindTeamComp(
3649
highLevelComp: highLevelComp, rawComps: rawComps);
3750
return rawComps;
@@ -63,7 +76,7 @@ class CalendarMainCompetitionRecordsToCalendarConverter
6376
}
6477

6578
void _moveAppropriateCompetitionsBehindTeamComps() {
66-
for (var current in _lowLevelCalendar) {
79+
for (var current in _lowLevelComps) {
6780
if (_compShouldMoveBackIfHaveTeamCompBehind(current)) {
6881
final prev = _previous(current: current);
6982
if (prev == null) break;
@@ -83,14 +96,14 @@ class CalendarMainCompetitionRecordsToCalendarConverter
8396
}
8497

8598
Competition? _previous({required Competition current}) {
86-
final currentIndex = _lowLevelCalendar.indexOf(current);
99+
final currentIndex = _lowLevelComps.indexOf(current);
87100
if (currentIndex == 0) return null;
88101
if (currentIndex == -1) {
89102
throw StateError(
90103
'Cannot find the previous competition before $current, because competitions list does not even contain it',
91104
);
92105
}
93-
return _lowLevelCalendar[currentIndex - 1];
106+
return _lowLevelComps[currentIndex - 1];
94107
}
95108

96109
bool _isTeamCompWithSameHill(Competition? comp, {required Hill requiredHill}) {
@@ -108,9 +121,9 @@ class CalendarMainCompetitionRecordsToCalendarConverter
108121
if (teamComp == firstOfTeamComp) {
109122
_firstBelongingToTeamComp = teamComp;
110123
} else {
111-
_compsBelongingToTeamComp = _lowLevelCalendar.sublist(
112-
_lowLevelCalendar.indexOf(firstOfTeamComp),
113-
_lowLevelCalendar.indexOf(teamComp),
124+
_compsBelongingToTeamComp = _lowLevelComps.sublist(
125+
_lowLevelComps.indexOf(firstOfTeamComp),
126+
_lowLevelComps.indexOf(teamComp),
114127
);
115128
_firstBelongingToTeamComp = _compsBelongingToTeamComp.first;
116129
}
@@ -137,29 +150,29 @@ class CalendarMainCompetitionRecordsToCalendarConverter
137150

138151
Competition _moveCompetitionBehindOther(
139152
{required Competition toMove, required Competition other}) {
140-
_lowLevelCalendar.remove(toMove);
141-
_lowLevelCalendar.insert(_lowLevelCalendar.indexOf(other), toMove);
142-
final toMoveIndex = _lowLevelCalendar.indexOf(toMove);
143-
return _lowLevelCalendar[toMoveIndex];
153+
_lowLevelComps.remove(toMove);
154+
_lowLevelComps.insert(_lowLevelComps.indexOf(other), toMove);
155+
final toMoveIndex = _lowLevelComps.indexOf(toMove);
156+
return _lowLevelComps[toMoveIndex];
144157
}
145158

146159
void _addCompDate({required Competition comp, required Duration delta}) {
147-
final index = _lowLevelCalendar.indexOf(comp);
148-
_lowLevelCalendar[index] =
149-
_lowLevelCalendar[index].copyWith(date: _lowLevelCalendar[index].date.add(delta));
160+
final index = _lowLevelComps.indexOf(comp);
161+
_lowLevelComps[index] =
162+
_lowLevelComps[index].copyWith(date: _lowLevelComps[index].date.add(delta));
150163
}
151164

152165
void _subtractCompDate({required Competition comp, required Duration delta}) {
153-
final index = _lowLevelCalendar.indexOf(comp);
154-
_lowLevelCalendar[index] = _lowLevelCalendar[index]
155-
.copyWith(date: _lowLevelCalendar[index].date.subtract(delta));
166+
final index = _lowLevelComps.indexOf(comp);
167+
_lowLevelComps[index] =
168+
_lowLevelComps[index].copyWith(date: _lowLevelComps[index].date.subtract(delta));
156169
}
157170

158171
void _addDayForTrainingsAndTrialRoundsAfterCompetitionOrQualificationsIfSameDay() {
159172
final compsToChange = <Competition>[];
160173
CompetitionType? prevCompType;
161174
DateTime? prevCompDate;
162-
for (var comp in _lowLevelCalendar) {
175+
for (var comp in _lowLevelComps) {
163176
final byCurrentCompType = comp.type == CompetitionType.training ||
164177
comp.type == CompetitionType.trialRound;
165178
final byPrevCompType = prevCompType != null &&
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import 'package:sj_manager/models/db/event_series/competition/calendar_records/high_level_competition_record.dart';
2-
import 'package:sj_manager/models/db/event_series/competition/competition.dart';
2+
import 'package:sj_manager/models/db/event_series/competition/high_level_calendar.dart';
3+
import 'package:sj_manager/models/db/event_series/event_series_calendar.dart';
34

4-
abstract interface class LowLevelCalendarCreator<T extends HighLevelCompetitionRecord> {
5+
abstract interface class LowLevelCalendarCreator<C extends HighLevelCompetitionRecord> {
56
const LowLevelCalendarCreator();
67

7-
List<Competition> convert(List<T> highLevelCalendar);
8+
EventSeriesCalendar convert(HighLevelCalendar<C> highLevelCalendar);
89
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import 'package:sj_manager/models/db/event_series/classification/classification.dart';
2+
import 'package:sj_manager/models/db/event_series/competition/calendar_records/high_level_competition_record.dart';
3+
4+
class HighLevelCalendar<C extends HighLevelCompetitionRecord> {
5+
const HighLevelCalendar({
6+
required this.highLevelCompetitions,
7+
required this.classifications,
8+
});
9+
10+
final List<C> highLevelCompetitions;
11+
final List<Classification> classifications;
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
abstract interface class GateCompensationCalculator {
2+
double calculate(int gate); // TODO: Add neccessary contexts
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import 'package:osje_sim/osje_sim.dart';
2+
3+
abstract interface class WindCompensationCalculator {
4+
double calculate(WindDuringJump wind); // TODO: Add neccessary context
5+
}
Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,59 @@
11
import 'package:equatable/equatable.dart';
2+
import 'package:osje_sim/osje_sim.dart';
3+
import 'package:sj_manager/models/db/event_series/competition/rules/compensation_calculators/gate/gate_compensation_calculator.dart';
4+
import 'package:sj_manager/models/db/event_series/competition/rules/compensation_calculators/wind/wind_compensation_calculator.dart';
25
import 'package:sj_manager/models/db/event_series/competition/rules/entities_limit.dart';
6+
import 'package:sj_manager/models/db/event_series/standings/score/competition_scores.dart';
7+
import 'package:sj_manager/models/db/event_series/standings/score/jump_score.dart';
8+
import 'package:sj_manager/models/db/event_series/standings/standings_positions_map_creator/standings_positions_creator.dart';
39

410
abstract class CompetitionRoundRules<T> with EquatableMixin {
511
const CompetitionRoundRules({
612
required this.limit,
13+
required this.bibsAreReassigned,
14+
required this.gateCanChange,
15+
required this.gateCompensationCalculator,
16+
required this.windCompensationCalculator,
17+
required this.inrunLightsEnabled,
18+
required this.dsqEnabled,
19+
required this.positionsCreator,
20+
required this.canBeCancelledByWind,
21+
required this.ruleOf95HsFallEnabled,
22+
required this.judgesCount,
23+
required this.chooseSignificantJudges,
24+
required this.createJumpScore,
25+
required this.createCompetitionScore,
726
});
827

928
final EntitiesLimit? limit;
29+
final bool bibsAreReassigned;
30+
final bool gateCanChange;
31+
final GateCompensationCalculator? gateCompensationCalculator;
32+
final WindCompensationCalculator? windCompensationCalculator;
33+
final bool inrunLightsEnabled;
34+
final bool dsqEnabled;
35+
final StandingsPositionsCreator positionsCreator;
36+
final bool canBeCancelledByWind;
37+
final bool ruleOf95HsFallEnabled;
38+
final int judgesCount;
39+
final Set<double> Function(Set<double> judges) chooseSignificantJudges;
40+
final JumpScore Function(JumpSimulationRecord jumpRecord) createJumpScore;
41+
final CompetitionScore Function(JumpSimulationRecord jumpScore) createCompetitionScore;
1042

1143
@override
12-
List<Object?> get props => [limit];
44+
List<Object?> get props => [
45+
limit,
46+
bibsAreReassigned,
47+
gateCanChange,
48+
gateCompensationCalculator,
49+
windCompensationCalculator,
50+
inrunLightsEnabled,
51+
dsqEnabled,
52+
positionsCreator,
53+
canBeCancelledByWind,
54+
ruleOf95HsFallEnabled,
55+
judgesCount.bitLength,
56+
chooseSignificantJudges,
57+
createJumpScore,
58+
];
1359
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1-
class TeamCompetitionGroupRules {
1+
import 'package:equatable/equatable.dart';
2+
3+
class TeamCompetitionGroupRules with EquatableMixin {
24
const TeamCompetitionGroupRules({
3-
required this.sortBeforeGroup,
5+
required this.sortStartList,
46
});
57

6-
final bool sortBeforeGroup;
8+
final bool sortStartList;
9+
10+
@override
11+
List<Object?> get props => [
12+
sortStartList,
13+
];
714
}

lib/models/db/event_series/competition/rules/competition_round_rules/individual_competition_round_rules.dart

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,23 @@ import 'package:sj_manager/models/db/jumper/jumper.dart';
44
class IndividualCompetitionRoundRules extends CompetitionRoundRules<Jumper> {
55
const IndividualCompetitionRoundRules({
66
required super.limit,
7-
required this.sortBeforeRound,
7+
required super.bibsAreReassigned,
8+
required super.gateCanChange,
9+
required super.gateCompensationCalculator,
10+
required super.windCompensationCalculator,
11+
required super.inrunLightsEnabled,
12+
required super.dsqEnabled,
13+
required super.positionsCreator,
14+
required super.canBeCancelledByWind,
15+
required super.ruleOf95HsFallEnabled,
16+
required super.judgesCount,
17+
required super.chooseSignificantJudges,
18+
required super.createJumpScore,
19+
required super.createCompetitionScore,
820
});
921

10-
final bool sortBeforeRound;
22+
@override
23+
List<Object?> get props => [
24+
...super.props,
25+
];
1126
}

lib/models/db/event_series/competition/rules/competition_round_rules/team_competition_round_rules.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,32 @@ import 'package:sj_manager/models/db/team/team.dart';
55
class TeamCompetitionRoundRules extends CompetitionRoundRules<Team> {
66
const TeamCompetitionRoundRules({
77
required super.limit,
8+
required super.bibsAreReassigned,
9+
required super.gateCanChange,
10+
required super.gateCompensationCalculator,
11+
required super.windCompensationCalculator,
12+
required super.inrunLightsEnabled,
13+
required super.dsqEnabled,
14+
required super.positionsCreator,
15+
required super.canBeCancelledByWind,
16+
required super.ruleOf95HsFallEnabled,
17+
required super.judgesCount,
18+
required super.chooseSignificantJudges,
19+
required super.createJumpScore,
20+
required super.createCompetitionScore,
821
required this.groups,
22+
required this.teamSize,
923
});
1024

1125
final List<TeamCompetitionGroupRules> groups;
26+
final int teamSize;
1227

1328
int get groupsCount => groups.length;
29+
30+
@override
31+
List<Object?> get props => [
32+
...super.props,
33+
groups,
34+
teamSize,
35+
];
1436
}

lib/models/db/event_series/competition/rules/competition_rules/competition_rules.dart

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,12 @@ import 'package:sj_manager/models/db/event_series/competition/rules/competition_
44
abstract class CompetitionRules<T> with EquatableMixin {
55
const CompetitionRules({
66
required this.rounds,
7-
required this.allowChangingGates,
87
});
98

109
final List<CompetitionRoundRules<T>> rounds;
11-
final bool allowChangingGates;
12-
13-
// TODO: WindCompensationsDelegate
14-
// TODO: GateCompensationsDelegate
15-
// TODO: Add other rules
1610

1711
int get roundsCount => rounds.length;
1812

1913
@override
20-
// TODO: implement props
21-
List<Object?> get props => [rounds, allowChangingGates];
14+
List<Object?> get props => [rounds];
2215
}

lib/models/db/event_series/competition/rules/competition_rules/individual_competition_rules.dart

Lines changed: 0 additions & 17 deletions
This file was deleted.

lib/models/db/event_series/competition/rules/competition_rules/team_competition_rules.dart

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class KoGroup<T> {
2+
const KoGroup({required this.entities});
3+
4+
final List<T> entities;
5+
6+
int get size => entities.length;
7+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import 'package:equatable/equatable.dart';
2+
import 'package:sj_manager/models/db/event_series/competition/rules/ko/ko_group.dart';
3+
4+
class KoRoundRules<T> with EquatableMixin {
5+
const KoRoundRules({
6+
required this.determineAdvancement,
7+
required this.createKoGroups,
8+
});
9+
10+
final List<T> Function(List<T> entities) determineAdvancement;
11+
final List<KoGroup<T>> Function(List<T> entities) createKoGroups;
12+
13+
@override
14+
List<Object?> get props => [];
15+
}

0 commit comments

Comments
 (0)