summaryrefslogtreecommitdiff
path: root/slips/src/app/Marina/DataAccess/DataMappers/SlipDataMapper.cs
blob: 67f7d69266c638032e84860e2ba38f1e95c3c3b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System.Collections.Generic;
using Marina.DataAccess.Builders;
using Marina.DataAccess.Schemas;
using Marina.Domain;
using Marina.Domain.Interfaces;
using Marina.Infrastructure;
using Marina.Infrastructure.Container;

namespace Marina.DataAccess.DataMappers {
	public class SlipDataMapper : ISlipDataMapper {
		public SlipDataMapper( IDatabaseGateway gateway ) {
			_gateway = gateway;
		}

		public ISlip FindBy( long slipId ) {
			return Map.From( _gateway.LoadRowUsing( Queries.SelectSlipBy( slipId ) ) );
		}

		public IRichEnumerable< ISlip > AllSlips() {
			return new RichEnumerable< ISlip >( FetchAllSlips( ) );
		}

		private IEnumerable< ISlip > FetchAllSlips() {
			return Map.From( _gateway.FindAllRowsMatching( Queries.SelectAllSlips( ) ) );
		}

		private readonly IDatabaseGateway _gateway;

		private static class Queries {
			public static IQuery SelectAllSlips() {
				return SelectAllColumns( ).Build( );
			}

			public static IQuery SelectSlipBy( long slipId ) {
				return SelectAllColumns( ).Where( SlipTable.ID, slipId ).Build( );
			}

			private static ISelectQueryBuilder SelectAllColumns() {
				return DatabaseSelect
					.From( SlipTable.TableName )
					.AddColumn( SlipTable.ID )
					.AddColumn( SlipTable.Width )
					.AddColumn( SlipTable.Length )
					.AddColumn( SlipTable.DockID )
					.AddColumn( DockTable.DockName )
					.AddColumn( DockTable.WaterService )
					.AddColumn( DockTable.ElectricalService )
					.AddColumn( LocationTable.Name )
					.InnerJoinOn( DockTable.DockID, SlipTable.DockID )
					.InnerJoinOn( LocationTable.ID, DockTable.LocationId );
			}
		}

		private static class Map {
			public static IEnumerable< ISlip > From( IEnumerable< IDatabaseRow > rows ) {
				return new EnumerableMapper< IDatabaseRow, ISlip >( new DatabaseRowToSlipMapper( ) ).MapFrom( rows );
			}

			public static ISlip From( IDatabaseRow row ) {
				return new DatabaseRowToSlipMapper( ).MapFrom( row );
			}

			private class DatabaseRowToSlipMapper : IMapper< IDatabaseRow, ISlip > {
				public DatabaseRowToSlipMapper()
					: this( Resolve.DependencyFor< ILeaseDataMapper >( ) ) {}

				public DatabaseRowToSlipMapper( ILeaseDataMapper leaseDataMapper ) {
					this.leaseDataMapper = leaseDataMapper;
				}

				public ISlip MapFrom( IDatabaseRow row ) {
					return new Slip(
						row.From< long >( SlipTable.ID ),
						CreateDockFrom( row ),
						row.From< int >( SlipTable.Width ),
						row.From< int >( SlipTable.Length ),
						leaseDataMapper.IsLeased( row.From< long >( SlipTable.ID ) )
						);
				}

				private static Dock CreateDockFrom( IDatabaseRow row ) {
					return new Dock(
						row.From< long >( DockTable.DockID ),
						row.From< string >( DockTable.DockName ),
						new Location( row.From< string >( LocationTable.Name ) ),
						Utilities.For(
							row.From< bool >( DockTable.WaterService ) ? Utilities.Water : null,
							row.From< bool >( DockTable.ElectricalService ) ? Utilities.Electrical : null
							)
						);
				}

				private readonly ILeaseDataMapper leaseDataMapper;
			}
		}
	}
}