Skip to content

Commit

Permalink
Visitor pattern partial implementation
Browse files Browse the repository at this point in the history
Attempted to implement visitor pattern but I'm coming up on more
barriers than it solves.  Restoring from DTOs is fine and requires the
pattern to be implemented on the DTOs.  To create from IParameter, these
would also need another implementation of the visitor pattern which
tightly couples the concrete implementation of what criteria exist into
the core library which is unacceptable.  A more suitable pattern is
required.
  • Loading branch information
stuarta0 committed May 14, 2015
1 parent 17e5a01 commit 1090f72
Show file tree
Hide file tree
Showing 15 changed files with 199 additions and 51 deletions.
48 changes: 48 additions & 0 deletions lib/Standalone/Serialization/Assemblers/Criterion/CreateVisitor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using dbqf.Criterion;
using Standalone.Serialization.DTO.Criterion;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Standalone.Serialization.Assemblers.Criterion
{
public class CreateVisitor : IParameterDTOVisitor
{
/// <summary>
/// Gets the ParameterDTO constructed after visiting the equivalent IParameter.
/// </summary>
public ParameterDTO Parameter { get; private set; }

public void Visit(DTO.Criterion.SimpleParameterDTO dto)
{
throw new NotImplementedException();
}

public void Visit(DTO.Criterion.LikeParameterDTO dto)
{
throw new NotImplementedException();
}

public void Visit(DTO.Criterion.ConjunctionDTO dto)
{
throw new NotImplementedException();
}

public void Visit(DTO.Criterion.NotParameterDTO dto)
{
throw new NotImplementedException();
}

public void Visit(DTO.Criterion.NullParameterDTO dto)
{
throw new NotImplementedException();
}

public void Visit(DTO.Criterion.BetweenParameterDTO dto)
{
throw new NotImplementedException();
}
}
}
13 changes: 13 additions & 0 deletions lib/Standalone/Serialization/Assemblers/Criterion/IParameterDTO.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Standalone.Serialization.Assemblers.Criterion
{
public interface IParameterDTO
{
void Accept(IParameterDTOVisitor visitor);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Standalone.Serialization.DTO.Criterion;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Standalone.Serialization.Assemblers.Criterion
{
public interface IParameterDTOVisitor
{
void Visit(SimpleParameterDTO dto);
void Visit(LikeParameterDTO dto);
void Visit(ConjunctionDTO dto);
void Visit(NotParameterDTO dto);
void Visit(NullParameterDTO dto);
void Visit(BetweenParameterDTO dto);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,49 +10,17 @@ namespace Standalone.Serialization.Assemblers.Criterion
{
public class ParameterAssembler : IAssembler<IParameter, ParameterDTO>
{
/*
* Maybe we can use the visitor pattern on ParameterDTO to give type-safe Create/Restore here?
* e.g.
* interface IParameterDTOVisitor
* {
* Visit(SimpleParameterDTO);
* Visit(LikeParameterDTO);
* Visit(ConjunctionDTO);
* etc...
* }
* interface IParameterDTO
* {
* Accept(IParameterDTOVisitor);
* }
* ParameterDTO.Accept(IParameterDTOVisitor pv)
* {
* pv.Visit(this);
* }
*
* ParameterDTO : IParameterDTO
* ParameterAssembler : IParameterDTOVisitor
*
* ParameterAssembler._restored;
* ParameterAssembler.Restore(ParameterDTO dto)
* {
* dto.Accept(this);
* return _restored;
* }
* ParameterAssembler.Visit(ConjunctionDTO dto)
* {
* var c = new Conjunction();
* foreach (var inner in dto.Parameters)
* {
* inner.Accept(this);
* c.Add(_restored);
* }
* _restored = c;
* }
*/
private FieldPathAssembler _pathAssembler;
public ParameterAssembler(FieldPathAssembler pathAssembler)
{
_pathAssembler = pathAssembler;
}

public IParameter Restore(ParameterDTO dto)
{
throw new NotImplementedException();
var restorer = new RestoreVisitor(_pathAssembler);
dto.Accept(restorer);
return restorer.Parameter;
}

public ParameterDTO Create(IParameter source)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using dbqf.Criterion;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Standalone.Serialization.Assemblers.Criterion
{
public class RestoreVisitor : IParameterDTOVisitor
{
private FieldPathAssembler _pathAssembler;
public RestoreVisitor(FieldPathAssembler pathAssembler)
{
_pathAssembler = pathAssembler;
}

/// <summary>
/// Gets the Parameter constructed after visiting the equivalent ParameterDTO.
/// </summary>
public IParameter Parameter { get; private set; }

public void Visit(DTO.Criterion.SimpleParameterDTO dto)
{
Parameter = new SimpleParameter(_pathAssembler.Restore(dto.Path), dto.Operator, dto.Value);
}

public void Visit(DTO.Criterion.LikeParameterDTO dto)
{
// TODO
Parameter = new LikeParameter(_pathAssembler.Restore(dto.Path), null);
}

public void Visit(DTO.Criterion.ConjunctionDTO dto)
{
var restorer = new RestoreVisitor(_pathAssembler);
var con = new Conjunction();
foreach (var dto2 in dto.Parameters)
{
dto2.Accept(restorer);
con.Add(restorer.Parameter);
}
Parameter = con;
}

public void Visit(DTO.Criterion.NotParameterDTO dto)
{
var restorer = new RestoreVisitor(_pathAssembler);
dto.Parameter.Accept(restorer);
Parameter = new NotParameter(restorer.Parameter);
}

public void Visit(DTO.Criterion.NullParameterDTO dto)
{
Parameter = new NullParameter(_pathAssembler.Restore(dto.Path));
}

public void Visit(DTO.Criterion.BetweenParameterDTO dto)
{
Parameter = new BetweenParameter(_pathAssembler.Restore(dto.Path), dto.Low, dto.High);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,10 @@ public class BetweenParameterDTO : ParameterDTO
[XmlElement]
public object Low { get; set; }
public bool ShouldSerializeLow() { return Low != null; }

public override void Accept(Assemblers.Criterion.IParameterDTOVisitor visitor)
{
visitor.Visit(this);
}
}
}
5 changes: 5 additions & 0 deletions lib/Standalone/Serialization/DTO/Criterion/ConjunctionDTO.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,10 @@ public class ConjunctionDTO : ParameterDTO
{
[XmlText]
public IList<ParameterDTO> Parameters { get; set; }

public override void Accept(Assemblers.Criterion.IParameterDTOVisitor visitor)
{
visitor.Visit(this);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ public class LikeParameterDTO : ParameterDTO
[XmlElement]
public FieldPathDTO Path { get; set; }


public override void Accept(Assemblers.Criterion.IParameterDTOVisitor visitor)
{
visitor.Visit(this);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using dbqf.Criterion;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
Expand All @@ -16,5 +17,10 @@ public class NotParameterDTO : ParameterDTO
/// </summary>
[XmlText]
public ParameterDTO Parameter { get; set; }

public override void Accept(Assemblers.Criterion.IParameterDTOVisitor visitor)
{
visitor.Visit(this);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using dbqf.Criterion;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
Expand All @@ -12,5 +13,10 @@ public class NullParameterDTO : ParameterDTO
{
[XmlElement]
public FieldPathDTO Path { get; set; }

public override void Accept(Assemblers.Criterion.IParameterDTOVisitor visitor)
{
visitor.Visit(this);
}
}
}
4 changes: 3 additions & 1 deletion lib/Standalone/Serialization/DTO/Criterion/ParameterDTO.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
using ProtoBuf;
using System.Xml.Serialization;
using System.ComponentModel;
using Standalone.Serialization.Assemblers.Criterion;

namespace Standalone.Serialization.DTO.Criterion
{
[XmlRoot("Parameter")]
public class ParameterDTO
public abstract class ParameterDTO : IParameterDTO
{
public abstract void Accept(IParameterDTOVisitor visitor);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,10 @@ public class SimpleParameterDTO : ParameterDTO
[XmlElement]
public object Value { get; set; }
public bool ShouldSerializeValue() { return Value != null; }

public override void Accept(Assemblers.Criterion.IParameterDTOVisitor visitor)
{
visitor.Visit(this);
}
}
}
4 changes: 4 additions & 0 deletions lib/Standalone/Standalone.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,11 @@
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Serialization\Assemblers\ConfigurationAssembler.cs" />
<Compile Include="Serialization\Assemblers\Criterion\IParameterDTO.cs" />
<Compile Include="Serialization\Assemblers\Criterion\IParameterDTOVisitor.cs" />
<Compile Include="Serialization\Assemblers\Criterion\ParameterAssembler.cs" />
<Compile Include="Serialization\Assemblers\Criterion\CreateVisitor.cs" />
<Compile Include="Serialization\Assemblers\Criterion\RestoreVisitor.cs" />
<Compile Include="Serialization\Assemblers\ParserAssembler.cs" />
<Compile Include="Serialization\Assemblers\ProjectAssembler.cs" />
<Compile Include="Serialization\Assemblers\FieldAssembler.cs" />
Expand Down
9 changes: 5 additions & 4 deletions lib/dbqf.core/Criterion/NotParameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,18 @@ namespace dbqf.Criterion
[DebuggerDisplay("NOT ({_other})")]
public class NotParameter : IParameter
{
IParameter _other;
public NotParameter(IParameter other)
public IParameter Parameter { get; private set; }

public NotParameter(IParameter p)
{
_other = other;
Parameter = p;
}

public SqlString ToSqlString()
{
return new SqlString()
.Add("NOT (")
.Add(_other.ToSqlString())
.Add(Parameter.ToSqlString())
.Add(")");
}
}
Expand Down
6 changes: 3 additions & 3 deletions lib/dbqf.core/Criterion/NullParameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ namespace dbqf.Criterion
{
public class NullParameter : IParameter
{
private FieldPath _path;
public FieldPath Path { get; private set; }

public NullParameter(IField field)
: this(FieldPath.FromDefault(field))
Expand All @@ -17,13 +17,13 @@ public NullParameter(IField field)

public NullParameter(FieldPath path)
{
_path = path;
Path = path;
}

public SqlString ToSqlString()
{
return new SqlString()
.AddField(_path)
.AddField(Path)
.Add(" IS NULL");
}
}
Expand Down

0 comments on commit 1090f72

Please sign in to comment.