Skip to content

Commit

Permalink
Merge pull request #1 from zhelgadis/select_modeling
Browse files Browse the repository at this point in the history
Added Selection and Projection classes
  • Loading branch information
Shamar committed May 18, 2012
2 parents 0c9998f + 852f0ef commit a8e94c2
Show file tree
Hide file tree
Showing 14 changed files with 724 additions and 0 deletions.
Empty file modified 3rdParties/NUnit/nunit-agent-x86.exe
100644 → 100755
Empty file.
Empty file modified 3rdParties/NUnit/nunit-agent.exe
100644 → 100755
Empty file.
Empty file modified 3rdParties/NUnit/nunit-console-x86.exe
100644 → 100755
Empty file.
Empty file modified 3rdParties/NUnit/nunit-x86.exe
100644 → 100755
Empty file.
Empty file modified 3rdParties/NUnit/nunit.exe
100644 → 100755
Empty file.
Empty file modified 3rdParties/NUnit/pnunit-agent.exe
100644 → 100755
Empty file.
Empty file modified 3rdParties/NUnit/pnunit-launcher.exe
100644 → 100755
Empty file.
Empty file modified 3rdParties/NUnit/runFile.exe
100644 → 100755
Empty file.
5 changes: 5 additions & 0 deletions Code/Epic.Query/Epic.Query.csproj
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@
<Compile Include="..\EpicInfo.cs"> <Compile Include="..\EpicInfo.cs">
<Link>EpicInfo.cs</Link> <Link>EpicInfo.cs</Link>
</Compile> </Compile>
<Compile Include="Relational\Operations\Projection.cs" />
<Compile Include="Relational\Operations\Selection.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup> <ItemGroup>
Expand All @@ -70,4 +72,7 @@
<Name>Epic.Prelude</Name> <Name>Epic.Prelude</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Relational\Operations\" />
</ItemGroup>
</Project> </Project>
189 changes: 189 additions & 0 deletions Code/Epic.Query/Relational/Operations/Projection.cs
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,189 @@
//
// Projection.cs
//
// Author:
// Marco Veglio <m.veglio@gmail.com>
//
// Copyright (c) 2010-2012 Giacomo Tesio
//
// This file is part of Epic.NET.
//
// Epic.NET is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Epic.NET is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace Epic.Query.Relational.Operations
{
/// <summary>
/// This class models the Projection operation, which extracts a given set of fields from a given
/// <see cref="Relation"/>.
/// </summary>
[Serializable]
public sealed class Projection: Relation, IEquatable<Projection>
{
private readonly Relation relation;
private readonly IEnumerable<RelationAttribute> attributes;

/// <summary>
/// Initializes a new instance of the <see cref="Epic.Query.Relational.Operations.Projection"/> class.
/// </summary>
/// <param name='relation'>
/// The <see cref="Relation"/> used as source for the projection.
/// </param>
/// <param name='attributes'>
/// The collection of <see cref="RelationAttributes"/> extracted
/// </param>
/// <param name='name'>
/// A user-defined name used to identify the Projection relation.
/// </param>
public Projection (Relation relation, IEnumerable<RelationAttribute> attributes, string name):
base(RelationType.Projection, name)
{
if (null == relation) throw new ArgumentNullException("relation");
if (null == attributes) throw new ArgumentNullException("attributes");
if (null == name) throw new ArgumentNullException("name");
this.relation = relation;
this.attributes = attributes;
}

/// <summary>
/// Initializes a new instance of the <see cref="Epic.Query.Relational.Operations.Projection"/> class.
/// </summary>
/// <param name='relation'>
/// The <see cref="Relation"/> used as source for the projection.
/// </param>
/// <param name='attributes'>
/// The collection of <see cref="RelationAttributes"/> extracted
/// </param>
public Projection(Relation relation, IEnumerable<RelationAttribute> attributes):
base(RelationType.Projection, getDefaultName(relation, attributes))
{
if (null == relation) throw new ArgumentNullException("relation");
if (null == attributes) throw new ArgumentNullException("attributes");
this.relation = relation;
this.attributes = attributes;
}

/// <summary>
/// Gets the <see cref="Relation"/> used as source for the projection.
/// </summary>
/// <value>
/// The table.
/// </value>
public Relation Relation { get { return this.relation; } }

/// <summary>
/// Gets the attributes extracted from the given table.
/// </summary>
/// <value>
/// The attributes.
/// </value>
public IEnumerable<RelationAttribute> Attributes { get { return this.attributes; } }

/// <summary>
/// Determines whether the specified <see cref="Epic.Query.Relational.Relation"/> is equal to the current <see cref="Epic.Query.Relational.Operations.Projection"/>.
/// </summary>
/// <param name='other'>
/// The <see cref="Epic.Query.Relational.Relation"/> to compare with the current <see cref="Epic.Query.Relational.Operations.Projection"/>.
/// </param>
/// <returns>
/// <c>true</c> if the specified <see cref="Epic.Query.Relational.Relation"/> is equal to the current
/// <see cref="Epic.Query.Relational.Operations.Projection"/>; otherwise, <c>false</c>.
/// </returns>
public override bool Equals (Relation other)
{
return this.Equals (other as Projection);
}

/// <summary>
/// Determines whether the specified <see cref="Epic.Query.Relational.Operations.Projection"/> is equal to the
/// current <see cref="Epic.Query.Relational.Operations.Projection"/>.
/// </summary>
/// <param name='other'>
/// The <see cref="Epic.Query.Relational.Operations.Projection"/> to compare with the current <see cref="Epic.Query.Relational.Operations.Projection"/>.
/// </param>
/// <returns>
/// <c>true</c> if the specified <see cref="Epic.Query.Relational.Operations.Projection"/> is equal to the
/// current <see cref="Epic.Query.Relational.Operations.Projection"/>; otherwise, <c>false</c>.
/// </returns>
public bool Equals(Projection other)
{
if (null == other) return false;
return this.Relation.Equals (other.Relation) && this.Attributes.SequenceEqual(other.Attributes);
}

/// <summary>
/// Accept the specified visitor and context.
/// </summary>
/// <param name='visitor'>
/// Visitor.
/// </param>
/// <param name='context'>
/// Context.
/// </param>
/// <typeparam name='TResult'>
/// The 1st type parameter.
/// </typeparam>
public override TResult Accept<TResult> (IVisitor<TResult> visitor, IVisitContext context)
{
return AcceptMe (this, visitor, context);
}

/// <summary>
/// Serves as a hash function for a <see cref="Epic.Query.Relational.Operations.Projection"/> object.
/// </summary>
/// <returns>
/// A hash code for this instance that is suitable for use in hashing algorithms and data structures such as a
/// hash table.
/// </returns>
public override int GetHashCode ()
{
int hash = this.Relation.GetHashCode ();
foreach (RelationAttribute attribute in this.Attributes)
hash ^= attribute.GetHashCode ();
return hash;
}

/// <summary>
/// Gets the default name for the projection.
/// </summary>
/// <returns>
/// The default name.
/// </returns>
/// <param name='relation'>
/// the <see cref="Relation"/> used as source for the projection.
/// </param>
/// <param name='attributes'>
/// The attributes to be extracted from the relation.
/// </param>
private static string getDefaultName (Relation relation, IEnumerable<RelationAttribute> attributes)
{
if (null == relation) throw new ArgumentNullException("relation");
if (null == attributes) throw new ArgumentNullException("attributes");
StringBuilder sb = new StringBuilder();
sb.Append("Take ");
foreach (RelationAttribute attribute in attributes)
sb.Append (attribute.Name).Append(",");
sb.Append (" from ");
sb.Append (relation.Name);
return sb.ToString ();
}

}
}

176 changes: 176 additions & 0 deletions Code/Epic.Query/Relational/Operations/Selection.cs
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,176 @@
//
// Select.cs
//
// Author:
// Marco Veglio <m.veglio@gmail.com>
//
// Copyright (c) 2010-2012 Giacomo Tesio
//
// This file is part of Epic.NET.
//
// Epic.NET is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Epic.NET is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
using System;
using Epic.Query.Relational.Predicates;

namespace Epic.Query.Relational.Operations
{

/// <summary>
/// This class models the Select operation which extracts those record from a given table matching
/// a given <see cref="Predicate"/>
/// </summary>
[Serializable]
public sealed class Selection: Relation, IEquatable<Selection>
{
private readonly Predicate condition;
private readonly Relation relation;

/// <summary>
/// Initializes a new instance of the <see cref="Epic.Query.Relational.Operations.Selection"/> class.
/// </summary>
/// <param name='relation'>
/// The <see cref="Relation"/> used as source for the selection.
/// </param>
/// <param name='condition'>
/// The <see cref="Predicate"/> against which the records are matched.
/// </param>
public Selection (Relation relation, Predicate condition):
base(RelationType.Selection, getDefaultName (relation, condition))
{
if (null == relation) throw new ArgumentNullException("relation");
if (null == condition) throw new ArgumentNullException("condition");
this.condition = condition;
this.relation = relation;
}

/// <summary>
/// Initializes a new instance of the <see cref="Epic.Query.Relational.Operations.Selection"/> class.
/// </summary>
/// <param name='relation'>
/// The table used as source for the selection.
/// </param>
/// <param name='condition'>
/// The <see cref="Predicate"/> against which the records are matched.
/// </param>
/// <param name='name'>
/// A user-defined name to identify the Selection relation.
/// </param>
public Selection (Relation relation, Predicate condition, string name): base(RelationType.Selection, name)
{
if (null == relation) throw new ArgumentNullException("relation");
if (null == condition) throw new ArgumentNullException("condition");
if (null == name) throw new ArgumentNullException("name");
this.condition = condition;
this.relation = relation;
}

/// <summary>
/// Gets the condition against which the table's records are matched.
/// </summary>
/// <value>
/// The condition.
/// </value>
public Predicate Condition { get { return this.condition; } }

/// <summary>
/// Gets the <see cref="Relation"/> used as source for the selection.
/// </summary>
/// <value>
/// The table.
/// </value>
public Relation Relation { get { return this.relation; } }

/// <summary>
/// Determines whether the specified <see cref="Epic.Query.Relational.Relation"/> is equal to the current <see cref="Epic.Query.Relational.Operations.Selection"/>.
/// </summary>
/// <param name='other'>
/// The <see cref="Epic.Query.Relational.Relation"/> to compare with the current <see cref="Epic.Query.Relational.Operations.Selection"/>.
/// </param>
/// <returns>
/// <c>true</c> if the specified <see cref="Epic.Query.Relational.Relation"/> is equal to the current
/// <see cref="Epic.Query.Relational.Operations.Selection"/>; otherwise, <c>false</c>.
/// </returns>
public override bool Equals (Relation other)
{
return this.Equals (other as Selection);
}

/// <summary>
/// Determines whether the specified <see cref="Epic.Query.Relational.Operations.Selection"/> is equal to the
/// current <see cref="Epic.Query.Relational.Operations.Selection"/>.
/// </summary>
/// <param name='other'>
/// The <see cref="Epic.Query.Relational.Operations.Selection"/> to compare with the current <see cref="Epic.Query.Relational.Operations.Selection"/>.
/// </param>
/// <returns>
/// <c>true</c> if the specified <see cref="Epic.Query.Relational.Operations.Selection"/> is equal to the current
/// <see cref="Epic.Query.Relational.Operations.Selection"/>; otherwise, <c>false</c>.
/// </returns>
public bool Equals(Selection other)
{
if (null == other) return false;
return this.Relation.Equals (other.Relation) && this.Condition.Equals (other.Condition);
}

/// <summary>
/// Serves as a hash function for a <see cref="Epic.Query.Relational.Operations.Selection"/> object.
/// </summary>
/// <returns>
/// A hash code for this instance that is suitable for use in hashing algorithms and data structures such as a
/// hash table.
/// </returns>
public override int GetHashCode ()
{
return this.Relation.GetHashCode () ^ this.Condition.GetHashCode ();
}

/// <summary>
/// Accept the specified visitor and context.
/// </summary>
/// <param name='visitor'>
/// Visitor.
/// </param>
/// <param name='context'>
/// Context.
/// </param>
/// <typeparam name='TResult'>
/// The 1st type parameter.
/// </typeparam>
public override TResult Accept<TResult> (IVisitor<TResult> visitor, IVisitContext context)
{
return AcceptMe (this, visitor, context);
}

/// <summary>
/// Gets the default name for the selection.
/// </summary>
/// <returns>
/// The default name.
/// </returns>
/// <param name='relation'>
/// The <see cref="Relation"/> used as source for the selection.
/// </param>
/// <param name='predicate'>
/// The condition against which the records are matched.
/// </param>
private static string getDefaultName(Relation relation, Predicate predicate)
{
if (null == relation) throw new ArgumentNullException("relation");
if (null == predicate) throw new ArgumentNullException("predicate");
return string.Format ("SELECT * from {0} where {1}", relation.Name, predicate.ToString ());
}
}
}

Original file line number Original file line Diff line number Diff line change
Expand Up @@ -76,8 +76,11 @@
<Compile Include="Fakes\FakeRelationFunction.cs" /> <Compile Include="Fakes\FakeRelationFunction.cs" />
<Compile Include="Fakes\FakeScalar.cs" /> <Compile Include="Fakes\FakeScalar.cs" />
<Compile Include="Fakes\FakeScalarFunction.cs" /> <Compile Include="Fakes\FakeScalarFunction.cs" />
<Compile Include="Relational\Operations\SelectionQA.cs" />
<Compile Include="Relational\Operations\ProjectionQA.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Fakes\" /> <Folder Include="Fakes\" />
<Folder Include="Relational\Operations\" />
</ItemGroup> </ItemGroup>
</Project> </Project>
Loading

0 comments on commit a8e94c2

Please sign in to comment.