Index: trunk/sources/HeuristicLab 3.3 Services.sln
===================================================================
--- trunk/sources/HeuristicLab 3.3 Services.sln	(revision 8047)
+++ trunk/sources/HeuristicLab 3.3 Services.sln	(revision 8049)
@@ -53,4 +53,8 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.Access-3.3", "HeuristicLab.Services.Access\3.3\HeuristicLab.Services.Access-3.3.csproj", "{9FAC0B23-2730-452A-9BA0-D7CA1746C541}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.OKB.DataAccess-3.3", "HeuristicLab.Services.OKB.DataAccess\3.3\HeuristicLab.Services.OKB.DataAccess-3.3.csproj", "{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.OKB-3.3", "HeuristicLab.Services.OKB\3.3\HeuristicLab.Services.OKB-3.3.csproj", "{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}"
 EndProject
 Global
@@ -194,4 +198,28 @@
 		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Release|x86.ActiveCfg = Release|x86
 		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Release|x86.Build.0 = Release|x86
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x64.ActiveCfg = Debug|x64
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x64.Build.0 = Debug|x64
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x86.ActiveCfg = Debug|x86
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x86.Build.0 = Debug|x86
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x64.ActiveCfg = Release|x64
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x64.Build.0 = Release|x64
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x86.ActiveCfg = Release|x86
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x86.Build.0 = Release|x86
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x64.ActiveCfg = Debug|x64
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x64.Build.0 = Debug|x64
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x86.ActiveCfg = Debug|x86
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x86.Build.0 = Debug|x86
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x64.ActiveCfg = Release|x64
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x64.Build.0 = Release|x64
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x86.ActiveCfg = Release|x86
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/HeuristicLab.Services.OKB.DataAccess-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/HeuristicLab.Services.OKB.DataAccess-3.3.csproj	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/HeuristicLab.Services.OKB.DataAccess-3.3.csproj	(revision 8049)
@@ -0,0 +1,206 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Services.OKB.DataAccess</RootNamespace>
+    <AssemblyName>HeuristicLab.Services.OKB.DataAccess-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Runtime.Serialization">
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ValueNameType.cs" />
+    <Compile Include="ValueNameCategory.cs" />
+    <Compile Include="OKB.designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>OKB.dbml</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Properties\Settings.Designer.cs">
+      <DependentUpon>Settings.settings</DependentUpon>
+      <AutoGen>True</AutoGen>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="HeuristicLab.snk" />
+    <None Include="OKB.dbml">
+      <Generator>MSLinqToSQLGenerator</Generator>
+      <LastGenOutput>OKB.designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="OKB.dbml.layout">
+      <DependentUpon>OKB.dbml</DependentUpon>
+    </None>
+    <None Include="Properties\Settings.settings">
+      <Generator>PublicSettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{3259AA49-8AA1-44D3-9025-A0B520596A8C}" />
+    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+    <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="SQL Scripts\Initialize OKB.sql" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="SQL Scripts\Create OKB.sql" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="SQL Scripts\Clear OKB.sql" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml	(revision 8049)
@@ -0,0 +1,164 @@
+﻿<?xml version="1.0" encoding="utf-8"?><Database Name="HeuristicLab.OKB" EntityNamespace="HeuristicLab.Services.OKB.DataAccess" ContextNamespace="HeuristicLab.Services.OKB.DataAccess" Class="OKBDataContext" xmlns="http://schemas.microsoft.com/linqtosql/dbml/2007">
+  <Connection Mode="AppSettings" ConnectionString="Data Source=.\SQLEXPRESS;Initial Catalog=HeuristicLab.OKB;Integrated Security=True" SettingsObjectName="HeuristicLab.Services.OKB.DataAccess.Properties.Settings" SettingsPropertyName="OKBConnectionString" Provider="System.Data.SqlClient" />
+  <Table Name="dbo.AlgorithmClass" Member="AlgorithmClasses">
+    <Type Name="AlgorithmClass">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="AlgorithmClass_Algorithm" Member="Algorithms" ThisKey="Id" OtherKey="AlgorithmClassId" Type="Algorithm" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemClass" Member="ProblemClasses">
+    <Type Name="ProblemClass">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="ProblemClass_Problem" Member="Problems" ThisKey="Id" OtherKey="ProblemClassId" Type="Problem" />
+    </Type>
+  </Table>
+  <Table Name="dbo.AlgorithmUser" Member="AlgorithmUsers">
+    <Type Name="AlgorithmUser">
+      <Column Name="AlgorithmId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="UserGroupId" Storage="_UserId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Association Name="Algorithm_AlgorithmUser" Member="Algorithm" ThisKey="AlgorithmId" OtherKey="Id" Type="Algorithm" IsForeignKey="true" DeleteRule="CASCADE" DeleteOnNull="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ProblemUser" Member="ProblemUsers">
+    <Type Name="ProblemUser">
+      <Column Name="ProblemId" Type="System.Int64" DbType="BigInt NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Column Name="UserGroupId" Storage="_UserId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
+      <Association Name="Problem_ProblemUser" Member="Problem" ThisKey="ProblemId" OtherKey="Id" Type="Problem" IsForeignKey="true" DeleteRule="CASCADE" DeleteOnNull="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Platform" Member="Platforms">
+    <Type Name="Platform">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="Platform_Algorithm" Member="Algorithms" ThisKey="Id" OtherKey="PlatformId" Type="Algorithm" />
+      <Association Name="Platform_Problem" Member="Problems" ThisKey="Id" OtherKey="PlatformId" Type="Problem" />
+    </Type>
+  </Table>
+  <Table Name="dbo.DataType" Member="DataTypes">
+    <Type Name="DataType">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="TypeName" Type="System.String" DbType="NVarChar(MAX) NOT NULL" CanBeNull="false" />
+      <Association Name="DataType_Algorithm" Member="Algorithms" ThisKey="Id" OtherKey="DataTypeId" Type="Algorithm" />
+      <Association Name="DataType_Problem" Member="Problems" ThisKey="Id" OtherKey="DataTypeId" Type="Problem" />
+      <Association Name="DataType_Value" Member="Values" ThisKey="Id" OtherKey="DataTypeId" Type="Value" />
+      <Association Name="DataType_CharacteristicValue" Member="CharacteristicValues" ThisKey="Id" OtherKey="DataTypeId" Type="CharacteristicValue" />
+    </Type>
+  </Table>
+  <Table Name="dbo.ValueName" Member="ValueNames">
+    <Type Name="ValueName">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Category" Type="ValueNameCategory" DbType="TinyInt NOT NULL" CanBeNull="false" />
+      <Column Name="Type" Type="ValueNameType" DbType="TinyInt NOT NULL" CanBeNull="false" />
+      <Association Name="ValueName_Value" Member="Values" ThisKey="Id" OtherKey="ValueNameId" Type="Value" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Algorithm" Member="Algorithms">
+    <Type Name="Algorithm">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="AlgorithmClassId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="PlatformId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="BinaryDataId" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="Algorithm_AlgorithmUser" Member="AlgorithmUsers" ThisKey="Id" OtherKey="AlgorithmId" Type="AlgorithmUser" />
+      <Association Name="Algorithm_Run" Member="Runs" ThisKey="Id" OtherKey="AlgorithmId" Type="Run" />
+      <Association Name="AlgorithmClass_Algorithm" Member="AlgorithmClass" ThisKey="AlgorithmClassId" OtherKey="Id" Type="AlgorithmClass" IsForeignKey="true" />
+      <Association Name="DataType_Algorithm" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Platform_Algorithm" Member="Platform" ThisKey="PlatformId" OtherKey="Id" Type="Platform" IsForeignKey="true" />
+      <Association Name="BinaryData_Algorithm" Member="BinaryData" ThisKey="BinaryDataId" OtherKey="Id" Type="BinaryData" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Problem" Member="Problems">
+    <Type Name="Problem">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="ProblemClassId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="PlatformId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="BinaryDataId" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Description" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="Problem_ProblemUser" Member="ProblemUsers" ThisKey="Id" OtherKey="ProblemId" Type="ProblemUser" />
+      <Association Name="Problem_Run" Member="Runs" ThisKey="Id" OtherKey="ProblemId" Type="Run" />
+      <Association Name="Problem_CharacteristicValue" Member="CharacteristicValues" ThisKey="Id" OtherKey="ProblemId" Type="CharacteristicValue" />
+      <Association Name="DataType_Problem" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Platform_Problem" Member="Platform" ThisKey="PlatformId" OtherKey="Id" Type="Platform" IsForeignKey="true" />
+      <Association Name="ProblemClass_Problem" Member="ProblemClass" ThisKey="ProblemClassId" OtherKey="Id" Type="ProblemClass" IsForeignKey="true" />
+      <Association Name="BinaryData_Problem" Member="BinaryData" ThisKey="BinaryDataId" OtherKey="Id" Type="BinaryData" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.BinaryData" Member="BinaryDatas">
+    <Type Name="BinaryData">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="Data" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX) NOT NULL" CanBeNull="false" UpdateCheck="Never" />
+      <Column Name="Hash" Type="System.Byte[]" DbType="VarBinary(20) NOT NULL" CanBeNull="false" UpdateCheck="Never" />
+      <Association Name="BinaryData_Algorithm" Member="Algorithms" ThisKey="Id" OtherKey="BinaryDataId" Type="Algorithm" />
+      <Association Name="BinaryData_Problem" Member="Problems" ThisKey="Id" OtherKey="BinaryDataId" Type="Problem" />
+      <Association Name="BinaryData_Value" Member="Values" ThisKey="Id" OtherKey="BinaryDataId" Type="Value" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Run" Member="Runs">
+    <Type Name="Run">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="AlgorithmId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="ProblemId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="CreatedDate" Type="System.DateTime" DbType="DateTime2 NOT NULL" CanBeNull="false" />
+      <Column Name="UserId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" CanBeNull="false" />
+      <Column Name="ClientId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" CanBeNull="false" />
+      <Association Name="Run_Value" Member="Values" ThisKey="Id" OtherKey="RunId" Type="Value" />
+      <Association Name="Algorithm_Run" Member="Algorithm" ThisKey="AlgorithmId" OtherKey="Id" Type="Algorithm" IsForeignKey="true" />
+      <Association Name="Problem_Run" Member="Problem" ThisKey="ProblemId" OtherKey="Id" Type="Problem" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Value" Member="Values">
+    <Type Name="Value">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="RunId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="ValueNameId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="BoolValue" Type="System.Boolean" DbType="Bit" CanBeNull="true" />
+      <Column Name="IntValue" Type="System.Int32" DbType="Int" CanBeNull="true" />
+      <Column Name="LongValue" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
+      <Column Name="FloatValue" Type="System.Single" DbType="Real" CanBeNull="true" />
+      <Column Name="DoubleValue" Type="System.Double" DbType="Float" CanBeNull="true" />
+      <Column Name="StringValue" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Column Name="BinaryDataId" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
+      <Association Name="BinaryData_Value" Member="BinaryData" ThisKey="BinaryDataId" OtherKey="Id" Type="BinaryData" IsForeignKey="true" />
+      <Association Name="DataType_Value" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Run_Value" Member="Run" ThisKey="RunId" OtherKey="Id" Type="Run" IsForeignKey="true" />
+      <Association Name="ValueName_Value" Member="ValueName" ThisKey="ValueNameId" OtherKey="Id" Type="ValueName" IsForeignKey="true" />
+    </Type>
+  </Table>
+  <Table Name="dbo.Characteristic" Member="Characteristics">
+    <Type Name="Characteristic">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="Name" Type="System.String" DbType="NVarChar(200) NOT NULL" CanBeNull="false" />
+      <Column Name="Type" Type="System.Byte" DbType="TinyInt NOT NULL" CanBeNull="false" />
+      <Association Name="Characteristic_CharacteristicValue" Member="CharacteristicValues" ThisKey="Id" OtherKey="CharacteristicId" Type="CharacteristicValue" />
+    </Type>
+  </Table>
+  <Table Name="dbo.CharacteristicValue" Member="CharacteristicValues">
+    <Type Name="CharacteristicValue">
+      <Column Name="Id" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
+      <Column Name="ProblemId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="CharacteristicId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="DataTypeId" Type="System.Int64" DbType="BigInt NOT NULL" CanBeNull="false" />
+      <Column Name="BoolValue" Type="System.Boolean" DbType="Bit" CanBeNull="true" />
+      <Column Name="IntValue" Type="System.Int32" DbType="Int" CanBeNull="true" />
+      <Column Name="LongValue" Type="System.Int64" DbType="BigInt" CanBeNull="true" />
+      <Column Name="FloatValue" Type="System.Single" DbType="Real" CanBeNull="true" />
+      <Column Name="DoubleValue" Type="System.Double" DbType="Float" CanBeNull="true" />
+      <Column Name="StringValue" Type="System.String" DbType="NVarChar(MAX)" CanBeNull="true" />
+      <Association Name="Characteristic_CharacteristicValue" Member="Characteristic" ThisKey="CharacteristicId" OtherKey="Id" Type="Characteristic" IsForeignKey="true" />
+      <Association Name="DataType_CharacteristicValue" Member="DataType" ThisKey="DataTypeId" OtherKey="Id" Type="DataType" IsForeignKey="true" />
+      <Association Name="Problem_CharacteristicValue" Member="Problem" ThisKey="ProblemId" OtherKey="Id" Type="Problem" IsForeignKey="true" />
+    </Type>
+  </Table>
+</Database>
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.dbml.layout	(revision 8049)
@@ -0,0 +1,223 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ordesignerObjectsDiagram dslVersion="1.0.0.0" absoluteBounds="0, 0, 15.75, 11.25" name="OKB">
+  <DataContextMoniker Name="/OKBDataContext" />
+  <nestedChildShapes>
+    <classShape Id="ec288562-8ef9-46b8-a2dc-a471fec7afb8" absoluteBounds="0.5, 0.5, 2, 1.3862939453125">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmClass" />
+      <nestedChildShapes>
+        <elementListCompartment Id="fbed452c-662c-42d5-b89f-2b122b63aecc" absoluteBounds="0.51500000000000012, 0.96, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="018aceac-7bd0-4fdd-8cca-d219aa08a5b5" absoluteBounds="13.5, 0.5, 2, 1.3862939453125">
+      <DataClassMoniker Name="/OKBDataContext/ProblemClass" />
+      <nestedChildShapes>
+        <elementListCompartment Id="2958536f-012b-4eb7-8bc7-453edcda1493" absoluteBounds="13.515, 0.96, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="aa997e47-0162-4fc2-aa8d-e237c50c46fe" absoluteBounds="0.5, 2.125, 2, 1.1939925130208331">
+      <DataClassMoniker Name="/OKBDataContext/AlgorithmUser" />
+      <nestedChildShapes>
+        <elementListCompartment Id="f81c31a9-84c5-40b1-b817-6dccbe77227d" absoluteBounds="0.51500000000000057, 2.5850000000000009, 1.9700000000000002, 0.63399251302083326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="8d911be4-13c4-4abd-85de-4f93f280dd50" absoluteBounds="13.5, 2.125, 2, 1.1939925130208331">
+      <DataClassMoniker Name="/OKBDataContext/ProblemUser" />
+      <nestedChildShapes>
+        <elementListCompartment Id="bdf4bd9d-405f-4582-99ff-036459c86748" absoluteBounds="13.515, 2.5850000000000009, 1.9700000000000002, 0.63399251302083326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="42a9e8c0-3168-43f0-a31f-54d1558bd4c2" absoluteBounds="7, 0.5, 2, 1.3862939453125">
+      <DataClassMoniker Name="/OKBDataContext/Platform" />
+      <nestedChildShapes>
+        <elementListCompartment Id="83ab4fa2-80aa-4c36-9596-bc4d9a0c6daf" absoluteBounds="7.0150000000000006, 0.96, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="34f5a12b-f109-4606-baf8-6ddfde7c1b34" absoluteBounds="7, 2.125, 2, 1.3862939453125">
+      <DataClassMoniker Name="/OKBDataContext/DataType" />
+      <nestedChildShapes>
+        <elementListCompartment Id="1dacac40-e283-48e9-a98d-dddbc6b4fd48" absoluteBounds="7.0150000000000006, 2.585, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="c75911bf-ae6d-421c-9219-e027c3059390" absoluteBounds="3.5, 4, 2, 1.5785953776041666">
+      <DataClassMoniker Name="/OKBDataContext/ValueName" />
+      <nestedChildShapes>
+        <elementListCompartment Id="5aadda7d-ee09-475a-a2d1-e153615911b4" absoluteBounds="3.5149999999999997, 4.46, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="be37de9e-465a-4d06-9dd6-3c3f7f1f07fa" absoluteBounds="2.75, 0.5, 2, 2.1554996744791666">
+      <DataClassMoniker Name="/OKBDataContext/Algorithm" />
+      <nestedChildShapes>
+        <elementListCompartment Id="5d0e5084-c74f-469d-bb56-da81ce2ce8d4" absoluteBounds="2.7650000000000006, 0.96, 1.9700000000000002, 1.5954996744791665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(2.75 : 2.39024983723958); (2.5 : 2.39024983723958)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Algorithm/Algorithm_AlgorithmUser" />
+      <nodes>
+        <classShapeMoniker Id="be37de9e-465a-4d06-9dd6-3c3f7f1f07fa" />
+        <classShapeMoniker Id="aa997e47-0162-4fc2-aa8d-e237c50c46fe" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(2.5 : 1.19314697265625); (2.75 : 1.19314697265625)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/AlgorithmClass/AlgorithmClass_Algorithm" />
+      <nodes>
+        <classShapeMoniker Id="ec288562-8ef9-46b8-a2dc-a471fec7afb8" />
+        <classShapeMoniker Id="be37de9e-465a-4d06-9dd6-3c3f7f1f07fa" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(7 : 2.39024983723958); (4.75 : 2.39024983723958)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_Algorithm" />
+      <nodes>
+        <classShapeMoniker Id="34f5a12b-f109-4606-baf8-6ddfde7c1b34" />
+        <classShapeMoniker Id="be37de9e-465a-4d06-9dd6-3c3f7f1f07fa" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(7 : 1.19314697265625); (4.75 : 1.19314697265625)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Platform/Platform_Algorithm" />
+      <nodes>
+        <classShapeMoniker Id="42a9e8c0-3168-43f0-a31f-54d1558bd4c2" />
+        <classShapeMoniker Id="be37de9e-465a-4d06-9dd6-3c3f7f1f07fa" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="f197afc9-8f2b-4dae-b87e-43c2c87796bb" absoluteBounds="11.25, 0.5, 2, 2.1554996744791666">
+      <DataClassMoniker Name="/OKBDataContext/Problem" />
+      <nestedChildShapes>
+        <elementListCompartment Id="9feb3034-0748-47df-aa82-41b7c3e8cdbd" absoluteBounds="11.265, 0.96, 1.9700000000000002, 1.5954996744791665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(13.25 : 2.39024983723958); (13.5 : 2.39024983723958)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Problem/Problem_ProblemUser" />
+      <nodes>
+        <classShapeMoniker Id="f197afc9-8f2b-4dae-b87e-43c2c87796bb" />
+        <classShapeMoniker Id="8d911be4-13c4-4abd-85de-4f93f280dd50" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(9 : 2.39024983723958); (11.25 : 2.39024983723958)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_Problem" />
+      <nodes>
+        <classShapeMoniker Id="34f5a12b-f109-4606-baf8-6ddfde7c1b34" />
+        <classShapeMoniker Id="f197afc9-8f2b-4dae-b87e-43c2c87796bb" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(9 : 1.19314697265625); (11.25 : 1.19314697265625)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Platform/Platform_Problem" />
+      <nodes>
+        <classShapeMoniker Id="42a9e8c0-3168-43f0-a31f-54d1558bd4c2" />
+        <classShapeMoniker Id="f197afc9-8f2b-4dae-b87e-43c2c87796bb" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(13.5 : 1.19314697265625); (13.25 : 1.19314697265625)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/ProblemClass/ProblemClass_Problem" />
+      <nodes>
+        <classShapeMoniker Id="018aceac-7bd0-4fdd-8cca-d219aa08a5b5" />
+        <classShapeMoniker Id="f197afc9-8f2b-4dae-b87e-43c2c87796bb" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="c2a69525-596c-4c58-a8cb-cb8c616f52d1" absoluteBounds="7, 9.625, 2, 1.3862939453125">
+      <DataClassMoniker Name="/OKBDataContext/BinaryData" />
+      <nestedChildShapes>
+        <elementListCompartment Id="d8ba4b42-b034-4f4d-88c6-ccc998db2567" absoluteBounds="7.0150000000000006, 10.085, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(7 : 10.3181469726562); (2.98333686713063 : 10.3181469726562); (2.98333686713063 : 2.65549967447917)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/BinaryData/BinaryData_Algorithm" />
+      <nodes>
+        <classShapeMoniker Id="c2a69525-596c-4c58-a8cb-cb8c616f52d1" />
+        <classShapeMoniker Id="be37de9e-465a-4d06-9dd6-3c3f7f1f07fa" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(9 : 10.3181469726562); (13.0131477507419 : 10.3181469726562); (13.0131477507419 : 2.65549967447917)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/BinaryData/BinaryData_Problem" />
+      <nodes>
+        <classShapeMoniker Id="c2a69525-596c-4c58-a8cb-cb8c616f52d1" />
+        <classShapeMoniker Id="f197afc9-8f2b-4dae-b87e-43c2c87796bb" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="65934fe9-4206-4d20-971b-1afacf645311" absoluteBounds="5.75, 7.25, 2, 1.9631982421875005">
+      <DataClassMoniker Name="/OKBDataContext/Run" />
+      <nestedChildShapes>
+        <elementListCompartment Id="14f0104d-03c2-4aec-9a4d-faeaaa1d8947" absoluteBounds="5.7650000000000006, 7.7100000000000009, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(3.24167093356531 : 2.65549967447917); (3.24167093356531 : 8.23159912109375); (5.75 : 8.23159912109375)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+      <AssociationMoniker Name="/OKBDataContext/Algorithm/Algorithm_Run" />
+      <nodes>
+        <classShapeMoniker Id="be37de9e-465a-4d06-9dd6-3c3f7f1f07fa" />
+        <classShapeMoniker Id="65934fe9-4206-4d20-971b-1afacf645311" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(12.7565713753709 : 2.65549967447917); (12.7565713753709 : 8.23159912109375); (8.13243692318721 : 8.23159912109375 : JumpStart); (7.96577025652055 : 8.23159912109375 : JumpEnd); (7.75 : 8.23159912109375)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+      <AssociationMoniker Name="/OKBDataContext/Problem/Problem_Run" />
+      <nodes>
+        <classShapeMoniker Id="f197afc9-8f2b-4dae-b87e-43c2c87796bb" />
+        <classShapeMoniker Id="65934fe9-4206-4d20-971b-1afacf645311" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="7d592fcd-d7a9-4ad0-a69f-9d29b97d9995" absoluteBounds="5.75, 4, 2, 2.9247054036458331">
+      <DataClassMoniker Name="/OKBDataContext/Value" />
+      <nestedChildShapes>
+        <elementListCompartment Id="89ad14d6-7946-43fe-af7c-59ce9fbe1d96" absoluteBounds="5.7650000000000006, 4.46, 1.9700000000000002, 2.364705403645833" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(8.04910358985388 : 9.625); (8.04910358985388 : 5.45496831242535); (7.75 : 5.45496831242535)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/BinaryData/BinaryData_Value" />
+      <nodes>
+        <classShapeMoniker Id="c2a69525-596c-4c58-a8cb-cb8c616f52d1" />
+        <classShapeMoniker Id="7d592fcd-d7a9-4ad0-a69f-9d29b97d9995" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(7.273878302532 : 3.5112939453125); (7.273878302532 : 4)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_Value" />
+      <nodes>
+        <classShapeMoniker Id="34f5a12b-f109-4606-baf8-6ddfde7c1b34" />
+        <classShapeMoniker Id="7d592fcd-d7a9-4ad0-a69f-9d29b97d9995" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(6.72310950465391 : 7.25); (6.72027766059957 : 6.92470540364583)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Run/Run_Value" />
+      <nodes>
+        <classShapeMoniker Id="65934fe9-4206-4d20-971b-1afacf645311" />
+        <classShapeMoniker Id="7d592fcd-d7a9-4ad0-a69f-9d29b97d9995" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(5.5 : 4.78929768880208); (5.75 : 4.78929768880208)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/ValueName/ValueName_Value" />
+      <nodes>
+        <classShapeMoniker Id="c75911bf-ae6d-421c-9219-e027c3059390" />
+        <classShapeMoniker Id="7d592fcd-d7a9-4ad0-a69f-9d29b97d9995" />
+      </nodes>
+    </associationConnector>
+    <classShape Id="7fb3c838-3d13-4b45-9912-1b5733a61110" absoluteBounds="10.5, 4, 2, 1.3862939453125">
+      <DataClassMoniker Name="/OKBDataContext/Characteristic" />
+      <nestedChildShapes>
+        <elementListCompartment Id="861faa11-366e-46d5-8fcb-1cef297d1920" absoluteBounds="10.515, 4.46, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="78f1d8c1-299d-46f8-90b5-e79d3904a0e6" absoluteBounds="8.25, 4, 2, 2.7324039713541666">
+      <DataClassMoniker Name="/OKBDataContext/CharacteristicValue" />
+      <nestedChildShapes>
+        <elementListCompartment Id="c197bfb3-c90d-42e4-91a8-17775b4cc933" absoluteBounds="8.265, 4.46, 1.9700000000000002, 2.1724039713541665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <associationConnector edgePoints="[(10.5 : 4.69314697265625); (10.25 : 4.69314697265625)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Characteristic/Characteristic_CharacteristicValue" />
+      <nodes>
+        <classShapeMoniker Id="7fb3c838-3d13-4b45-9912-1b5733a61110" />
+        <classShapeMoniker Id="78f1d8c1-299d-46f8-90b5-e79d3904a0e6" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(8.68784173221247 : 3.5112939453125); (8.68784173221247 : 4)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/DataType/DataType_CharacteristicValue" />
+      <nodes>
+        <classShapeMoniker Id="34f5a12b-f109-4606-baf8-6ddfde7c1b34" />
+        <classShapeMoniker Id="78f1d8c1-299d-46f8-90b5-e79d3904a0e6" />
+      </nodes>
+    </associationConnector>
+    <associationConnector edgePoints="[(11.8118610455891 : 2.65549967447917); (11.8118610455891 : 3.0432292702094); (9.62689159819655 : 3.0432292702094); (9.62689159819655 : 4)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+      <AssociationMoniker Name="/OKBDataContext/Problem/Problem_CharacteristicValue" />
+      <nodes>
+        <classShapeMoniker Id="f197afc9-8f2b-4dae-b87e-43c2c87796bb" />
+        <classShapeMoniker Id="78f1d8c1-299d-46f8-90b5-e79d3904a0e6" />
+      </nodes>
+    </associationConnector>
+  </nestedChildShapes>
+</ordesignerObjectsDiagram>
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.designer.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/OKB.designer.cs	(revision 8049)
@@ -0,0 +1,3671 @@
+﻿#pragma warning disable 1591
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.239
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Services.OKB.DataAccess
+{
+	using System.Data.Linq;
+	using System.Data.Linq.Mapping;
+	using System.Data;
+	using System.Collections.Generic;
+	using System.Reflection;
+	using System.Linq;
+	using System.Linq.Expressions;
+	using System.ComponentModel;
+	using System;
+	
+	
+	[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="HeuristicLab.OKB")]
+	public partial class OKBDataContext : System.Data.Linq.DataContext
+	{
+		
+		private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
+		
+    #region Extensibility Method Definitions
+    partial void OnCreated();
+    partial void InsertAlgorithmClass(AlgorithmClass instance);
+    partial void UpdateAlgorithmClass(AlgorithmClass instance);
+    partial void DeleteAlgorithmClass(AlgorithmClass instance);
+    partial void InsertProblemClass(ProblemClass instance);
+    partial void UpdateProblemClass(ProblemClass instance);
+    partial void DeleteProblemClass(ProblemClass instance);
+    partial void InsertAlgorithmUser(AlgorithmUser instance);
+    partial void UpdateAlgorithmUser(AlgorithmUser instance);
+    partial void DeleteAlgorithmUser(AlgorithmUser instance);
+    partial void InsertProblemUser(ProblemUser instance);
+    partial void UpdateProblemUser(ProblemUser instance);
+    partial void DeleteProblemUser(ProblemUser instance);
+    partial void InsertPlatform(Platform instance);
+    partial void UpdatePlatform(Platform instance);
+    partial void DeletePlatform(Platform instance);
+    partial void InsertDataType(DataType instance);
+    partial void UpdateDataType(DataType instance);
+    partial void DeleteDataType(DataType instance);
+    partial void InsertValueName(ValueName instance);
+    partial void UpdateValueName(ValueName instance);
+    partial void DeleteValueName(ValueName instance);
+    partial void InsertAlgorithm(Algorithm instance);
+    partial void UpdateAlgorithm(Algorithm instance);
+    partial void DeleteAlgorithm(Algorithm instance);
+    partial void InsertProblem(Problem instance);
+    partial void UpdateProblem(Problem instance);
+    partial void DeleteProblem(Problem instance);
+    partial void InsertBinaryData(BinaryData instance);
+    partial void UpdateBinaryData(BinaryData instance);
+    partial void DeleteBinaryData(BinaryData instance);
+    partial void InsertRun(Run instance);
+    partial void UpdateRun(Run instance);
+    partial void DeleteRun(Run instance);
+    partial void InsertValue(Value instance);
+    partial void UpdateValue(Value instance);
+    partial void DeleteValue(Value instance);
+    partial void InsertCharacteristic(Characteristic instance);
+    partial void UpdateCharacteristic(Characteristic instance);
+    partial void DeleteCharacteristic(Characteristic instance);
+    partial void InsertCharacteristicValue(CharacteristicValue instance);
+    partial void UpdateCharacteristicValue(CharacteristicValue instance);
+    partial void DeleteCharacteristicValue(CharacteristicValue instance);
+    #endregion
+		
+		public OKBDataContext() : 
+				base(global::HeuristicLab.Services.OKB.DataAccess.Properties.Settings.Default.OKBConnectionString, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public OKBDataContext(string connection) : 
+				base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public OKBDataContext(System.Data.IDbConnection connection) : 
+				base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public OKBDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
+				base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public OKBDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
+				base(connection, mappingSource)
+		{
+			OnCreated();
+		}
+		
+		public System.Data.Linq.Table<AlgorithmClass> AlgorithmClasses
+		{
+			get
+			{
+				return this.GetTable<AlgorithmClass>();
+			}
+		}
+		
+		public System.Data.Linq.Table<ProblemClass> ProblemClasses
+		{
+			get
+			{
+				return this.GetTable<ProblemClass>();
+			}
+		}
+		
+		public System.Data.Linq.Table<AlgorithmUser> AlgorithmUsers
+		{
+			get
+			{
+				return this.GetTable<AlgorithmUser>();
+			}
+		}
+		
+		public System.Data.Linq.Table<ProblemUser> ProblemUsers
+		{
+			get
+			{
+				return this.GetTable<ProblemUser>();
+			}
+		}
+		
+		public System.Data.Linq.Table<Platform> Platforms
+		{
+			get
+			{
+				return this.GetTable<Platform>();
+			}
+		}
+		
+		public System.Data.Linq.Table<DataType> DataTypes
+		{
+			get
+			{
+				return this.GetTable<DataType>();
+			}
+		}
+		
+		public System.Data.Linq.Table<ValueName> ValueNames
+		{
+			get
+			{
+				return this.GetTable<ValueName>();
+			}
+		}
+		
+		public System.Data.Linq.Table<Algorithm> Algorithms
+		{
+			get
+			{
+				return this.GetTable<Algorithm>();
+			}
+		}
+		
+		public System.Data.Linq.Table<Problem> Problems
+		{
+			get
+			{
+				return this.GetTable<Problem>();
+			}
+		}
+		
+		public System.Data.Linq.Table<BinaryData> BinaryDatas
+		{
+			get
+			{
+				return this.GetTable<BinaryData>();
+			}
+		}
+		
+		public System.Data.Linq.Table<Run> Runs
+		{
+			get
+			{
+				return this.GetTable<Run>();
+			}
+		}
+		
+		public System.Data.Linq.Table<Value> Values
+		{
+			get
+			{
+				return this.GetTable<Value>();
+			}
+		}
+		
+		public System.Data.Linq.Table<Characteristic> Characteristics
+		{
+			get
+			{
+				return this.GetTable<Characteristic>();
+			}
+		}
+		
+		public System.Data.Linq.Table<CharacteristicValue> CharacteristicValues
+		{
+			get
+			{
+				return this.GetTable<CharacteristicValue>();
+			}
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.AlgorithmClass")]
+	public partial class AlgorithmClass : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private string _Name;
+		
+		private string _Description;
+		
+		private EntitySet<Algorithm> _Algorithms;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnNameChanging(string value);
+    partial void OnNameChanged();
+    partial void OnDescriptionChanging(string value);
+    partial void OnDescriptionChanged();
+    #endregion
+		
+		public AlgorithmClass()
+		{
+			this._Algorithms = new EntitySet<Algorithm>(new Action<Algorithm>(this.attach_Algorithms), new Action<Algorithm>(this.detach_Algorithms));
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="NVarChar(200) NOT NULL", CanBeNull=false)]
+		public string Name
+		{
+			get
+			{
+				return this._Name;
+			}
+			set
+			{
+				if ((this._Name != value))
+				{
+					this.OnNameChanging(value);
+					this.SendPropertyChanging();
+					this._Name = value;
+					this.SendPropertyChanged("Name");
+					this.OnNameChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Description", DbType="NVarChar(MAX)")]
+		public string Description
+		{
+			get
+			{
+				return this._Description;
+			}
+			set
+			{
+				if ((this._Description != value))
+				{
+					this.OnDescriptionChanging(value);
+					this.SendPropertyChanging();
+					this._Description = value;
+					this.SendPropertyChanged("Description");
+					this.OnDescriptionChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="AlgorithmClass_Algorithm", Storage="_Algorithms", ThisKey="Id", OtherKey="AlgorithmClassId")]
+		public EntitySet<Algorithm> Algorithms
+		{
+			get
+			{
+				return this._Algorithms;
+			}
+			set
+			{
+				this._Algorithms.Assign(value);
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		
+		private void attach_Algorithms(Algorithm entity)
+		{
+			this.SendPropertyChanging();
+			entity.AlgorithmClass = this;
+		}
+		
+		private void detach_Algorithms(Algorithm entity)
+		{
+			this.SendPropertyChanging();
+			entity.AlgorithmClass = null;
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.ProblemClass")]
+	public partial class ProblemClass : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private string _Name;
+		
+		private string _Description;
+		
+		private EntitySet<Problem> _Problems;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnNameChanging(string value);
+    partial void OnNameChanged();
+    partial void OnDescriptionChanging(string value);
+    partial void OnDescriptionChanged();
+    #endregion
+		
+		public ProblemClass()
+		{
+			this._Problems = new EntitySet<Problem>(new Action<Problem>(this.attach_Problems), new Action<Problem>(this.detach_Problems));
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="NVarChar(200) NOT NULL", CanBeNull=false)]
+		public string Name
+		{
+			get
+			{
+				return this._Name;
+			}
+			set
+			{
+				if ((this._Name != value))
+				{
+					this.OnNameChanging(value);
+					this.SendPropertyChanging();
+					this._Name = value;
+					this.SendPropertyChanged("Name");
+					this.OnNameChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Description", DbType="NVarChar(MAX)")]
+		public string Description
+		{
+			get
+			{
+				return this._Description;
+			}
+			set
+			{
+				if ((this._Description != value))
+				{
+					this.OnDescriptionChanging(value);
+					this.SendPropertyChanging();
+					this._Description = value;
+					this.SendPropertyChanged("Description");
+					this.OnDescriptionChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="ProblemClass_Problem", Storage="_Problems", ThisKey="Id", OtherKey="ProblemClassId")]
+		public EntitySet<Problem> Problems
+		{
+			get
+			{
+				return this._Problems;
+			}
+			set
+			{
+				this._Problems.Assign(value);
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		
+		private void attach_Problems(Problem entity)
+		{
+			this.SendPropertyChanging();
+			entity.ProblemClass = this;
+		}
+		
+		private void detach_Problems(Problem entity)
+		{
+			this.SendPropertyChanging();
+			entity.ProblemClass = null;
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.AlgorithmUser")]
+	public partial class AlgorithmUser : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _AlgorithmId;
+		
+		private System.Guid _UserId;
+		
+		private EntityRef<Algorithm> _Algorithm;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnAlgorithmIdChanging(long value);
+    partial void OnAlgorithmIdChanged();
+    partial void OnUserGroupIdChanging(System.Guid value);
+    partial void OnUserGroupIdChanged();
+    #endregion
+		
+		public AlgorithmUser()
+		{
+			this._Algorithm = default(EntityRef<Algorithm>);
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_AlgorithmId", DbType="BigInt NOT NULL", IsPrimaryKey=true)]
+		public long AlgorithmId
+		{
+			get
+			{
+				return this._AlgorithmId;
+			}
+			set
+			{
+				if ((this._AlgorithmId != value))
+				{
+					if (this._Algorithm.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnAlgorithmIdChanging(value);
+					this.SendPropertyChanging();
+					this._AlgorithmId = value;
+					this.SendPropertyChanged("AlgorithmId");
+					this.OnAlgorithmIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_UserId", DbType="UniqueIdentifier NOT NULL", IsPrimaryKey=true)]
+		public System.Guid UserGroupId
+		{
+			get
+			{
+				return this._UserId;
+			}
+			set
+			{
+				if ((this._UserId != value))
+				{
+					this.OnUserGroupIdChanging(value);
+					this.SendPropertyChanging();
+					this._UserId = value;
+					this.SendPropertyChanged("UserGroupId");
+					this.OnUserGroupIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Algorithm_AlgorithmUser", Storage="_Algorithm", ThisKey="AlgorithmId", OtherKey="Id", IsForeignKey=true, DeleteOnNull=true, DeleteRule="CASCADE")]
+		public Algorithm Algorithm
+		{
+			get
+			{
+				return this._Algorithm.Entity;
+			}
+			set
+			{
+				Algorithm previousValue = this._Algorithm.Entity;
+				if (((previousValue != value) 
+							|| (this._Algorithm.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._Algorithm.Entity = null;
+						previousValue.AlgorithmUsers.Remove(this);
+					}
+					this._Algorithm.Entity = value;
+					if ((value != null))
+					{
+						value.AlgorithmUsers.Add(this);
+						this._AlgorithmId = value.Id;
+					}
+					else
+					{
+						this._AlgorithmId = default(long);
+					}
+					this.SendPropertyChanged("Algorithm");
+				}
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.ProblemUser")]
+	public partial class ProblemUser : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _ProblemId;
+		
+		private System.Guid _UserId;
+		
+		private EntityRef<Problem> _Problem;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnProblemIdChanging(long value);
+    partial void OnProblemIdChanged();
+    partial void OnUserGroupIdChanging(System.Guid value);
+    partial void OnUserGroupIdChanged();
+    #endregion
+		
+		public ProblemUser()
+		{
+			this._Problem = default(EntityRef<Problem>);
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ProblemId", DbType="BigInt NOT NULL", IsPrimaryKey=true)]
+		public long ProblemId
+		{
+			get
+			{
+				return this._ProblemId;
+			}
+			set
+			{
+				if ((this._ProblemId != value))
+				{
+					if (this._Problem.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnProblemIdChanging(value);
+					this.SendPropertyChanging();
+					this._ProblemId = value;
+					this.SendPropertyChanged("ProblemId");
+					this.OnProblemIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_UserId", DbType="UniqueIdentifier NOT NULL", IsPrimaryKey=true)]
+		public System.Guid UserGroupId
+		{
+			get
+			{
+				return this._UserId;
+			}
+			set
+			{
+				if ((this._UserId != value))
+				{
+					this.OnUserGroupIdChanging(value);
+					this.SendPropertyChanging();
+					this._UserId = value;
+					this.SendPropertyChanged("UserGroupId");
+					this.OnUserGroupIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Problem_ProblemUser", Storage="_Problem", ThisKey="ProblemId", OtherKey="Id", IsForeignKey=true, DeleteOnNull=true, DeleteRule="CASCADE")]
+		public Problem Problem
+		{
+			get
+			{
+				return this._Problem.Entity;
+			}
+			set
+			{
+				Problem previousValue = this._Problem.Entity;
+				if (((previousValue != value) 
+							|| (this._Problem.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._Problem.Entity = null;
+						previousValue.ProblemUsers.Remove(this);
+					}
+					this._Problem.Entity = value;
+					if ((value != null))
+					{
+						value.ProblemUsers.Add(this);
+						this._ProblemId = value.Id;
+					}
+					else
+					{
+						this._ProblemId = default(long);
+					}
+					this.SendPropertyChanged("Problem");
+				}
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Platform")]
+	public partial class Platform : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private string _Name;
+		
+		private string _Description;
+		
+		private EntitySet<Algorithm> _Algorithms;
+		
+		private EntitySet<Problem> _Problems;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnNameChanging(string value);
+    partial void OnNameChanged();
+    partial void OnDescriptionChanging(string value);
+    partial void OnDescriptionChanged();
+    #endregion
+		
+		public Platform()
+		{
+			this._Algorithms = new EntitySet<Algorithm>(new Action<Algorithm>(this.attach_Algorithms), new Action<Algorithm>(this.detach_Algorithms));
+			this._Problems = new EntitySet<Problem>(new Action<Problem>(this.attach_Problems), new Action<Problem>(this.detach_Problems));
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="NVarChar(200) NOT NULL", CanBeNull=false)]
+		public string Name
+		{
+			get
+			{
+				return this._Name;
+			}
+			set
+			{
+				if ((this._Name != value))
+				{
+					this.OnNameChanging(value);
+					this.SendPropertyChanging();
+					this._Name = value;
+					this.SendPropertyChanged("Name");
+					this.OnNameChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Description", DbType="NVarChar(MAX)")]
+		public string Description
+		{
+			get
+			{
+				return this._Description;
+			}
+			set
+			{
+				if ((this._Description != value))
+				{
+					this.OnDescriptionChanging(value);
+					this.SendPropertyChanging();
+					this._Description = value;
+					this.SendPropertyChanged("Description");
+					this.OnDescriptionChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Platform_Algorithm", Storage="_Algorithms", ThisKey="Id", OtherKey="PlatformId")]
+		public EntitySet<Algorithm> Algorithms
+		{
+			get
+			{
+				return this._Algorithms;
+			}
+			set
+			{
+				this._Algorithms.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Platform_Problem", Storage="_Problems", ThisKey="Id", OtherKey="PlatformId")]
+		public EntitySet<Problem> Problems
+		{
+			get
+			{
+				return this._Problems;
+			}
+			set
+			{
+				this._Problems.Assign(value);
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		
+		private void attach_Algorithms(Algorithm entity)
+		{
+			this.SendPropertyChanging();
+			entity.Platform = this;
+		}
+		
+		private void detach_Algorithms(Algorithm entity)
+		{
+			this.SendPropertyChanging();
+			entity.Platform = null;
+		}
+		
+		private void attach_Problems(Problem entity)
+		{
+			this.SendPropertyChanging();
+			entity.Platform = this;
+		}
+		
+		private void detach_Problems(Problem entity)
+		{
+			this.SendPropertyChanging();
+			entity.Platform = null;
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.DataType")]
+	public partial class DataType : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private string _Name;
+		
+		private string _TypeName;
+		
+		private EntitySet<Algorithm> _Algorithms;
+		
+		private EntitySet<Problem> _Problems;
+		
+		private EntitySet<Value> _Values;
+		
+		private EntitySet<CharacteristicValue> _CharacteristicValues;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnNameChanging(string value);
+    partial void OnNameChanged();
+    partial void OnTypeNameChanging(string value);
+    partial void OnTypeNameChanged();
+    #endregion
+		
+		public DataType()
+		{
+			this._Algorithms = new EntitySet<Algorithm>(new Action<Algorithm>(this.attach_Algorithms), new Action<Algorithm>(this.detach_Algorithms));
+			this._Problems = new EntitySet<Problem>(new Action<Problem>(this.attach_Problems), new Action<Problem>(this.detach_Problems));
+			this._Values = new EntitySet<Value>(new Action<Value>(this.attach_Values), new Action<Value>(this.detach_Values));
+			this._CharacteristicValues = new EntitySet<CharacteristicValue>(new Action<CharacteristicValue>(this.attach_CharacteristicValues), new Action<CharacteristicValue>(this.detach_CharacteristicValues));
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="NVarChar(200) NOT NULL", CanBeNull=false)]
+		public string Name
+		{
+			get
+			{
+				return this._Name;
+			}
+			set
+			{
+				if ((this._Name != value))
+				{
+					this.OnNameChanging(value);
+					this.SendPropertyChanging();
+					this._Name = value;
+					this.SendPropertyChanged("Name");
+					this.OnNameChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TypeName", DbType="NVarChar(MAX) NOT NULL", CanBeNull=false)]
+		public string TypeName
+		{
+			get
+			{
+				return this._TypeName;
+			}
+			set
+			{
+				if ((this._TypeName != value))
+				{
+					this.OnTypeNameChanging(value);
+					this.SendPropertyChanging();
+					this._TypeName = value;
+					this.SendPropertyChanged("TypeName");
+					this.OnTypeNameChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DataType_Algorithm", Storage="_Algorithms", ThisKey="Id", OtherKey="DataTypeId")]
+		public EntitySet<Algorithm> Algorithms
+		{
+			get
+			{
+				return this._Algorithms;
+			}
+			set
+			{
+				this._Algorithms.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DataType_Problem", Storage="_Problems", ThisKey="Id", OtherKey="DataTypeId")]
+		public EntitySet<Problem> Problems
+		{
+			get
+			{
+				return this._Problems;
+			}
+			set
+			{
+				this._Problems.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DataType_Value", Storage="_Values", ThisKey="Id", OtherKey="DataTypeId")]
+		public EntitySet<Value> Values
+		{
+			get
+			{
+				return this._Values;
+			}
+			set
+			{
+				this._Values.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DataType_CharacteristicValue", Storage="_CharacteristicValues", ThisKey="Id", OtherKey="DataTypeId")]
+		public EntitySet<CharacteristicValue> CharacteristicValues
+		{
+			get
+			{
+				return this._CharacteristicValues;
+			}
+			set
+			{
+				this._CharacteristicValues.Assign(value);
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		
+		private void attach_Algorithms(Algorithm entity)
+		{
+			this.SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_Algorithms(Algorithm entity)
+		{
+			this.SendPropertyChanging();
+			entity.DataType = null;
+		}
+		
+		private void attach_Problems(Problem entity)
+		{
+			this.SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_Problems(Problem entity)
+		{
+			this.SendPropertyChanging();
+			entity.DataType = null;
+		}
+		
+		private void attach_Values(Value entity)
+		{
+			this.SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_Values(Value entity)
+		{
+			this.SendPropertyChanging();
+			entity.DataType = null;
+		}
+		
+		private void attach_CharacteristicValues(CharacteristicValue entity)
+		{
+			this.SendPropertyChanging();
+			entity.DataType = this;
+		}
+		
+		private void detach_CharacteristicValues(CharacteristicValue entity)
+		{
+			this.SendPropertyChanging();
+			entity.DataType = null;
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.ValueName")]
+	public partial class ValueName : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private string _Name;
+		
+		private ValueNameCategory _Category;
+		
+		private ValueNameType _Type;
+		
+		private EntitySet<Value> _Values;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnNameChanging(string value);
+    partial void OnNameChanged();
+    partial void OnCategoryChanging(ValueNameCategory value);
+    partial void OnCategoryChanged();
+    partial void OnTypeChanging(ValueNameType value);
+    partial void OnTypeChanged();
+    #endregion
+		
+		public ValueName()
+		{
+			this._Values = new EntitySet<Value>(new Action<Value>(this.attach_Values), new Action<Value>(this.detach_Values));
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="NVarChar(200) NOT NULL", CanBeNull=false)]
+		public string Name
+		{
+			get
+			{
+				return this._Name;
+			}
+			set
+			{
+				if ((this._Name != value))
+				{
+					this.OnNameChanging(value);
+					this.SendPropertyChanging();
+					this._Name = value;
+					this.SendPropertyChanged("Name");
+					this.OnNameChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Category", DbType="TinyInt NOT NULL", CanBeNull=false)]
+		public ValueNameCategory Category
+		{
+			get
+			{
+				return this._Category;
+			}
+			set
+			{
+				if ((this._Category != value))
+				{
+					this.OnCategoryChanging(value);
+					this.SendPropertyChanging();
+					this._Category = value;
+					this.SendPropertyChanged("Category");
+					this.OnCategoryChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Type", DbType="TinyInt NOT NULL", CanBeNull=false)]
+		public ValueNameType Type
+		{
+			get
+			{
+				return this._Type;
+			}
+			set
+			{
+				if ((this._Type != value))
+				{
+					this.OnTypeChanging(value);
+					this.SendPropertyChanging();
+					this._Type = value;
+					this.SendPropertyChanged("Type");
+					this.OnTypeChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="ValueName_Value", Storage="_Values", ThisKey="Id", OtherKey="ValueNameId")]
+		public EntitySet<Value> Values
+		{
+			get
+			{
+				return this._Values;
+			}
+			set
+			{
+				this._Values.Assign(value);
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		
+		private void attach_Values(Value entity)
+		{
+			this.SendPropertyChanging();
+			entity.ValueName = this;
+		}
+		
+		private void detach_Values(Value entity)
+		{
+			this.SendPropertyChanging();
+			entity.ValueName = null;
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Algorithm")]
+	public partial class Algorithm : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private long _AlgorithmClassId;
+		
+		private long _PlatformId;
+		
+		private long _DataTypeId;
+		
+		private System.Nullable<long> _BinaryDataId;
+		
+		private string _Name;
+		
+		private string _Description;
+		
+		private EntitySet<AlgorithmUser> _AlgorithmUsers;
+		
+		private EntitySet<Run> _Runs;
+		
+		private EntityRef<AlgorithmClass> _AlgorithmClass;
+		
+		private EntityRef<DataType> _DataType;
+		
+		private EntityRef<Platform> _Platform;
+		
+		private EntityRef<BinaryData> _BinaryData;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnAlgorithmClassIdChanging(long value);
+    partial void OnAlgorithmClassIdChanged();
+    partial void OnPlatformIdChanging(long value);
+    partial void OnPlatformIdChanged();
+    partial void OnDataTypeIdChanging(long value);
+    partial void OnDataTypeIdChanged();
+    partial void OnBinaryDataIdChanging(System.Nullable<long> value);
+    partial void OnBinaryDataIdChanged();
+    partial void OnNameChanging(string value);
+    partial void OnNameChanged();
+    partial void OnDescriptionChanging(string value);
+    partial void OnDescriptionChanged();
+    #endregion
+		
+		public Algorithm()
+		{
+			this._AlgorithmUsers = new EntitySet<AlgorithmUser>(new Action<AlgorithmUser>(this.attach_AlgorithmUsers), new Action<AlgorithmUser>(this.detach_AlgorithmUsers));
+			this._Runs = new EntitySet<Run>(new Action<Run>(this.attach_Runs), new Action<Run>(this.detach_Runs));
+			this._AlgorithmClass = default(EntityRef<AlgorithmClass>);
+			this._DataType = default(EntityRef<DataType>);
+			this._Platform = default(EntityRef<Platform>);
+			this._BinaryData = default(EntityRef<BinaryData>);
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_AlgorithmClassId", DbType="BigInt NOT NULL")]
+		public long AlgorithmClassId
+		{
+			get
+			{
+				return this._AlgorithmClassId;
+			}
+			set
+			{
+				if ((this._AlgorithmClassId != value))
+				{
+					if (this._AlgorithmClass.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnAlgorithmClassIdChanging(value);
+					this.SendPropertyChanging();
+					this._AlgorithmClassId = value;
+					this.SendPropertyChanged("AlgorithmClassId");
+					this.OnAlgorithmClassIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_PlatformId", DbType="BigInt NOT NULL")]
+		public long PlatformId
+		{
+			get
+			{
+				return this._PlatformId;
+			}
+			set
+			{
+				if ((this._PlatformId != value))
+				{
+					if (this._Platform.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnPlatformIdChanging(value);
+					this.SendPropertyChanging();
+					this._PlatformId = value;
+					this.SendPropertyChanged("PlatformId");
+					this.OnPlatformIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_DataTypeId", DbType="BigInt NOT NULL")]
+		public long DataTypeId
+		{
+			get
+			{
+				return this._DataTypeId;
+			}
+			set
+			{
+				if ((this._DataTypeId != value))
+				{
+					if (this._DataType.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnDataTypeIdChanging(value);
+					this.SendPropertyChanging();
+					this._DataTypeId = value;
+					this.SendPropertyChanged("DataTypeId");
+					this.OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_BinaryDataId", DbType="BigInt")]
+		public System.Nullable<long> BinaryDataId
+		{
+			get
+			{
+				return this._BinaryDataId;
+			}
+			set
+			{
+				if ((this._BinaryDataId != value))
+				{
+					if (this._BinaryData.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnBinaryDataIdChanging(value);
+					this.SendPropertyChanging();
+					this._BinaryDataId = value;
+					this.SendPropertyChanged("BinaryDataId");
+					this.OnBinaryDataIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="NVarChar(200) NOT NULL", CanBeNull=false)]
+		public string Name
+		{
+			get
+			{
+				return this._Name;
+			}
+			set
+			{
+				if ((this._Name != value))
+				{
+					this.OnNameChanging(value);
+					this.SendPropertyChanging();
+					this._Name = value;
+					this.SendPropertyChanged("Name");
+					this.OnNameChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Description", DbType="NVarChar(MAX)")]
+		public string Description
+		{
+			get
+			{
+				return this._Description;
+			}
+			set
+			{
+				if ((this._Description != value))
+				{
+					this.OnDescriptionChanging(value);
+					this.SendPropertyChanging();
+					this._Description = value;
+					this.SendPropertyChanged("Description");
+					this.OnDescriptionChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Algorithm_AlgorithmUser", Storage="_AlgorithmUsers", ThisKey="Id", OtherKey="AlgorithmId")]
+		public EntitySet<AlgorithmUser> AlgorithmUsers
+		{
+			get
+			{
+				return this._AlgorithmUsers;
+			}
+			set
+			{
+				this._AlgorithmUsers.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Algorithm_Run", Storage="_Runs", ThisKey="Id", OtherKey="AlgorithmId")]
+		public EntitySet<Run> Runs
+		{
+			get
+			{
+				return this._Runs;
+			}
+			set
+			{
+				this._Runs.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="AlgorithmClass_Algorithm", Storage="_AlgorithmClass", ThisKey="AlgorithmClassId", OtherKey="Id", IsForeignKey=true)]
+		public AlgorithmClass AlgorithmClass
+		{
+			get
+			{
+				return this._AlgorithmClass.Entity;
+			}
+			set
+			{
+				AlgorithmClass previousValue = this._AlgorithmClass.Entity;
+				if (((previousValue != value) 
+							|| (this._AlgorithmClass.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._AlgorithmClass.Entity = null;
+						previousValue.Algorithms.Remove(this);
+					}
+					this._AlgorithmClass.Entity = value;
+					if ((value != null))
+					{
+						value.Algorithms.Add(this);
+						this._AlgorithmClassId = value.Id;
+					}
+					else
+					{
+						this._AlgorithmClassId = default(long);
+					}
+					this.SendPropertyChanged("AlgorithmClass");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DataType_Algorithm", Storage="_DataType", ThisKey="DataTypeId", OtherKey="Id", IsForeignKey=true)]
+		public DataType DataType
+		{
+			get
+			{
+				return this._DataType.Entity;
+			}
+			set
+			{
+				DataType previousValue = this._DataType.Entity;
+				if (((previousValue != value) 
+							|| (this._DataType.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._DataType.Entity = null;
+						previousValue.Algorithms.Remove(this);
+					}
+					this._DataType.Entity = value;
+					if ((value != null))
+					{
+						value.Algorithms.Add(this);
+						this._DataTypeId = value.Id;
+					}
+					else
+					{
+						this._DataTypeId = default(long);
+					}
+					this.SendPropertyChanged("DataType");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Platform_Algorithm", Storage="_Platform", ThisKey="PlatformId", OtherKey="Id", IsForeignKey=true)]
+		public Platform Platform
+		{
+			get
+			{
+				return this._Platform.Entity;
+			}
+			set
+			{
+				Platform previousValue = this._Platform.Entity;
+				if (((previousValue != value) 
+							|| (this._Platform.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._Platform.Entity = null;
+						previousValue.Algorithms.Remove(this);
+					}
+					this._Platform.Entity = value;
+					if ((value != null))
+					{
+						value.Algorithms.Add(this);
+						this._PlatformId = value.Id;
+					}
+					else
+					{
+						this._PlatformId = default(long);
+					}
+					this.SendPropertyChanged("Platform");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="BinaryData_Algorithm", Storage="_BinaryData", ThisKey="BinaryDataId", OtherKey="Id", IsForeignKey=true)]
+		public BinaryData BinaryData
+		{
+			get
+			{
+				return this._BinaryData.Entity;
+			}
+			set
+			{
+				BinaryData previousValue = this._BinaryData.Entity;
+				if (((previousValue != value) 
+							|| (this._BinaryData.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._BinaryData.Entity = null;
+						previousValue.Algorithms.Remove(this);
+					}
+					this._BinaryData.Entity = value;
+					if ((value != null))
+					{
+						value.Algorithms.Add(this);
+						this._BinaryDataId = value.Id;
+					}
+					else
+					{
+						this._BinaryDataId = default(Nullable<long>);
+					}
+					this.SendPropertyChanged("BinaryData");
+				}
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		
+		private void attach_AlgorithmUsers(AlgorithmUser entity)
+		{
+			this.SendPropertyChanging();
+			entity.Algorithm = this;
+		}
+		
+		private void detach_AlgorithmUsers(AlgorithmUser entity)
+		{
+			this.SendPropertyChanging();
+			entity.Algorithm = null;
+		}
+		
+		private void attach_Runs(Run entity)
+		{
+			this.SendPropertyChanging();
+			entity.Algorithm = this;
+		}
+		
+		private void detach_Runs(Run entity)
+		{
+			this.SendPropertyChanging();
+			entity.Algorithm = null;
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Problem")]
+	public partial class Problem : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private long _ProblemClassId;
+		
+		private long _PlatformId;
+		
+		private long _DataTypeId;
+		
+		private System.Nullable<long> _BinaryDataId;
+		
+		private string _Name;
+		
+		private string _Description;
+		
+		private EntitySet<ProblemUser> _ProblemUsers;
+		
+		private EntitySet<Run> _Runs;
+		
+		private EntitySet<CharacteristicValue> _CharacteristicValues;
+		
+		private EntityRef<DataType> _DataType;
+		
+		private EntityRef<Platform> _Platform;
+		
+		private EntityRef<ProblemClass> _ProblemClass;
+		
+		private EntityRef<BinaryData> _BinaryData;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnProblemClassIdChanging(long value);
+    partial void OnProblemClassIdChanged();
+    partial void OnPlatformIdChanging(long value);
+    partial void OnPlatformIdChanged();
+    partial void OnDataTypeIdChanging(long value);
+    partial void OnDataTypeIdChanged();
+    partial void OnBinaryDataIdChanging(System.Nullable<long> value);
+    partial void OnBinaryDataIdChanged();
+    partial void OnNameChanging(string value);
+    partial void OnNameChanged();
+    partial void OnDescriptionChanging(string value);
+    partial void OnDescriptionChanged();
+    #endregion
+		
+		public Problem()
+		{
+			this._ProblemUsers = new EntitySet<ProblemUser>(new Action<ProblemUser>(this.attach_ProblemUsers), new Action<ProblemUser>(this.detach_ProblemUsers));
+			this._Runs = new EntitySet<Run>(new Action<Run>(this.attach_Runs), new Action<Run>(this.detach_Runs));
+			this._CharacteristicValues = new EntitySet<CharacteristicValue>(new Action<CharacteristicValue>(this.attach_CharacteristicValues), new Action<CharacteristicValue>(this.detach_CharacteristicValues));
+			this._DataType = default(EntityRef<DataType>);
+			this._Platform = default(EntityRef<Platform>);
+			this._ProblemClass = default(EntityRef<ProblemClass>);
+			this._BinaryData = default(EntityRef<BinaryData>);
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ProblemClassId", DbType="BigInt NOT NULL")]
+		public long ProblemClassId
+		{
+			get
+			{
+				return this._ProblemClassId;
+			}
+			set
+			{
+				if ((this._ProblemClassId != value))
+				{
+					if (this._ProblemClass.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnProblemClassIdChanging(value);
+					this.SendPropertyChanging();
+					this._ProblemClassId = value;
+					this.SendPropertyChanged("ProblemClassId");
+					this.OnProblemClassIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_PlatformId", DbType="BigInt NOT NULL")]
+		public long PlatformId
+		{
+			get
+			{
+				return this._PlatformId;
+			}
+			set
+			{
+				if ((this._PlatformId != value))
+				{
+					if (this._Platform.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnPlatformIdChanging(value);
+					this.SendPropertyChanging();
+					this._PlatformId = value;
+					this.SendPropertyChanged("PlatformId");
+					this.OnPlatformIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_DataTypeId", DbType="BigInt NOT NULL")]
+		public long DataTypeId
+		{
+			get
+			{
+				return this._DataTypeId;
+			}
+			set
+			{
+				if ((this._DataTypeId != value))
+				{
+					if (this._DataType.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnDataTypeIdChanging(value);
+					this.SendPropertyChanging();
+					this._DataTypeId = value;
+					this.SendPropertyChanged("DataTypeId");
+					this.OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_BinaryDataId", DbType="BigInt")]
+		public System.Nullable<long> BinaryDataId
+		{
+			get
+			{
+				return this._BinaryDataId;
+			}
+			set
+			{
+				if ((this._BinaryDataId != value))
+				{
+					if (this._BinaryData.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnBinaryDataIdChanging(value);
+					this.SendPropertyChanging();
+					this._BinaryDataId = value;
+					this.SendPropertyChanged("BinaryDataId");
+					this.OnBinaryDataIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="NVarChar(200) NOT NULL", CanBeNull=false)]
+		public string Name
+		{
+			get
+			{
+				return this._Name;
+			}
+			set
+			{
+				if ((this._Name != value))
+				{
+					this.OnNameChanging(value);
+					this.SendPropertyChanging();
+					this._Name = value;
+					this.SendPropertyChanged("Name");
+					this.OnNameChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Description", DbType="NVarChar(MAX)")]
+		public string Description
+		{
+			get
+			{
+				return this._Description;
+			}
+			set
+			{
+				if ((this._Description != value))
+				{
+					this.OnDescriptionChanging(value);
+					this.SendPropertyChanging();
+					this._Description = value;
+					this.SendPropertyChanged("Description");
+					this.OnDescriptionChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Problem_ProblemUser", Storage="_ProblemUsers", ThisKey="Id", OtherKey="ProblemId")]
+		public EntitySet<ProblemUser> ProblemUsers
+		{
+			get
+			{
+				return this._ProblemUsers;
+			}
+			set
+			{
+				this._ProblemUsers.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Problem_Run", Storage="_Runs", ThisKey="Id", OtherKey="ProblemId")]
+		public EntitySet<Run> Runs
+		{
+			get
+			{
+				return this._Runs;
+			}
+			set
+			{
+				this._Runs.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Problem_CharacteristicValue", Storage="_CharacteristicValues", ThisKey="Id", OtherKey="ProblemId")]
+		public EntitySet<CharacteristicValue> CharacteristicValues
+		{
+			get
+			{
+				return this._CharacteristicValues;
+			}
+			set
+			{
+				this._CharacteristicValues.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DataType_Problem", Storage="_DataType", ThisKey="DataTypeId", OtherKey="Id", IsForeignKey=true)]
+		public DataType DataType
+		{
+			get
+			{
+				return this._DataType.Entity;
+			}
+			set
+			{
+				DataType previousValue = this._DataType.Entity;
+				if (((previousValue != value) 
+							|| (this._DataType.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._DataType.Entity = null;
+						previousValue.Problems.Remove(this);
+					}
+					this._DataType.Entity = value;
+					if ((value != null))
+					{
+						value.Problems.Add(this);
+						this._DataTypeId = value.Id;
+					}
+					else
+					{
+						this._DataTypeId = default(long);
+					}
+					this.SendPropertyChanged("DataType");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Platform_Problem", Storage="_Platform", ThisKey="PlatformId", OtherKey="Id", IsForeignKey=true)]
+		public Platform Platform
+		{
+			get
+			{
+				return this._Platform.Entity;
+			}
+			set
+			{
+				Platform previousValue = this._Platform.Entity;
+				if (((previousValue != value) 
+							|| (this._Platform.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._Platform.Entity = null;
+						previousValue.Problems.Remove(this);
+					}
+					this._Platform.Entity = value;
+					if ((value != null))
+					{
+						value.Problems.Add(this);
+						this._PlatformId = value.Id;
+					}
+					else
+					{
+						this._PlatformId = default(long);
+					}
+					this.SendPropertyChanged("Platform");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="ProblemClass_Problem", Storage="_ProblemClass", ThisKey="ProblemClassId", OtherKey="Id", IsForeignKey=true)]
+		public ProblemClass ProblemClass
+		{
+			get
+			{
+				return this._ProblemClass.Entity;
+			}
+			set
+			{
+				ProblemClass previousValue = this._ProblemClass.Entity;
+				if (((previousValue != value) 
+							|| (this._ProblemClass.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._ProblemClass.Entity = null;
+						previousValue.Problems.Remove(this);
+					}
+					this._ProblemClass.Entity = value;
+					if ((value != null))
+					{
+						value.Problems.Add(this);
+						this._ProblemClassId = value.Id;
+					}
+					else
+					{
+						this._ProblemClassId = default(long);
+					}
+					this.SendPropertyChanged("ProblemClass");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="BinaryData_Problem", Storage="_BinaryData", ThisKey="BinaryDataId", OtherKey="Id", IsForeignKey=true)]
+		public BinaryData BinaryData
+		{
+			get
+			{
+				return this._BinaryData.Entity;
+			}
+			set
+			{
+				BinaryData previousValue = this._BinaryData.Entity;
+				if (((previousValue != value) 
+							|| (this._BinaryData.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._BinaryData.Entity = null;
+						previousValue.Problems.Remove(this);
+					}
+					this._BinaryData.Entity = value;
+					if ((value != null))
+					{
+						value.Problems.Add(this);
+						this._BinaryDataId = value.Id;
+					}
+					else
+					{
+						this._BinaryDataId = default(Nullable<long>);
+					}
+					this.SendPropertyChanged("BinaryData");
+				}
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		
+		private void attach_ProblemUsers(ProblemUser entity)
+		{
+			this.SendPropertyChanging();
+			entity.Problem = this;
+		}
+		
+		private void detach_ProblemUsers(ProblemUser entity)
+		{
+			this.SendPropertyChanging();
+			entity.Problem = null;
+		}
+		
+		private void attach_Runs(Run entity)
+		{
+			this.SendPropertyChanging();
+			entity.Problem = this;
+		}
+		
+		private void detach_Runs(Run entity)
+		{
+			this.SendPropertyChanging();
+			entity.Problem = null;
+		}
+		
+		private void attach_CharacteristicValues(CharacteristicValue entity)
+		{
+			this.SendPropertyChanging();
+			entity.Problem = this;
+		}
+		
+		private void detach_CharacteristicValues(CharacteristicValue entity)
+		{
+			this.SendPropertyChanging();
+			entity.Problem = null;
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.BinaryData")]
+	public partial class BinaryData : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private System.Data.Linq.Binary _Data;
+		
+		private byte[] _Hash;
+		
+		private EntitySet<Algorithm> _Algorithms;
+		
+		private EntitySet<Problem> _Problems;
+		
+		private EntitySet<Value> _Values;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnDataChanging(System.Data.Linq.Binary value);
+    partial void OnDataChanged();
+    partial void OnHashChanging(byte[] value);
+    partial void OnHashChanged();
+    #endregion
+		
+		public BinaryData()
+		{
+			this._Algorithms = new EntitySet<Algorithm>(new Action<Algorithm>(this.attach_Algorithms), new Action<Algorithm>(this.detach_Algorithms));
+			this._Problems = new EntitySet<Problem>(new Action<Problem>(this.attach_Problems), new Action<Problem>(this.detach_Problems));
+			this._Values = new EntitySet<Value>(new Action<Value>(this.attach_Values), new Action<Value>(this.detach_Values));
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Data", DbType="VarBinary(MAX) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
+		public System.Data.Linq.Binary Data
+		{
+			get
+			{
+				return this._Data;
+			}
+			set
+			{
+				if ((this._Data != value))
+				{
+					this.OnDataChanging(value);
+					this.SendPropertyChanging();
+					this._Data = value;
+					this.SendPropertyChanged("Data");
+					this.OnDataChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Hash", DbType="VarBinary(20) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
+		public byte[] Hash
+		{
+			get
+			{
+				return this._Hash;
+			}
+			set
+			{
+				if ((this._Hash != value))
+				{
+					this.OnHashChanging(value);
+					this.SendPropertyChanging();
+					this._Hash = value;
+					this.SendPropertyChanged("Hash");
+					this.OnHashChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="BinaryData_Algorithm", Storage="_Algorithms", ThisKey="Id", OtherKey="BinaryDataId")]
+		public EntitySet<Algorithm> Algorithms
+		{
+			get
+			{
+				return this._Algorithms;
+			}
+			set
+			{
+				this._Algorithms.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="BinaryData_Problem", Storage="_Problems", ThisKey="Id", OtherKey="BinaryDataId")]
+		public EntitySet<Problem> Problems
+		{
+			get
+			{
+				return this._Problems;
+			}
+			set
+			{
+				this._Problems.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="BinaryData_Value", Storage="_Values", ThisKey="Id", OtherKey="BinaryDataId")]
+		public EntitySet<Value> Values
+		{
+			get
+			{
+				return this._Values;
+			}
+			set
+			{
+				this._Values.Assign(value);
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		
+		private void attach_Algorithms(Algorithm entity)
+		{
+			this.SendPropertyChanging();
+			entity.BinaryData = this;
+		}
+		
+		private void detach_Algorithms(Algorithm entity)
+		{
+			this.SendPropertyChanging();
+			entity.BinaryData = null;
+		}
+		
+		private void attach_Problems(Problem entity)
+		{
+			this.SendPropertyChanging();
+			entity.BinaryData = this;
+		}
+		
+		private void detach_Problems(Problem entity)
+		{
+			this.SendPropertyChanging();
+			entity.BinaryData = null;
+		}
+		
+		private void attach_Values(Value entity)
+		{
+			this.SendPropertyChanging();
+			entity.BinaryData = this;
+		}
+		
+		private void detach_Values(Value entity)
+		{
+			this.SendPropertyChanging();
+			entity.BinaryData = null;
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Run")]
+	public partial class Run : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private long _AlgorithmId;
+		
+		private long _ProblemId;
+		
+		private System.DateTime _CreatedDate;
+		
+		private System.Guid _UserId;
+		
+		private System.Guid _ClientId;
+		
+		private EntitySet<Value> _Values;
+		
+		private EntityRef<Algorithm> _Algorithm;
+		
+		private EntityRef<Problem> _Problem;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnAlgorithmIdChanging(long value);
+    partial void OnAlgorithmIdChanged();
+    partial void OnProblemIdChanging(long value);
+    partial void OnProblemIdChanged();
+    partial void OnCreatedDateChanging(System.DateTime value);
+    partial void OnCreatedDateChanged();
+    partial void OnUserIdChanging(System.Guid value);
+    partial void OnUserIdChanged();
+    partial void OnClientIdChanging(System.Guid value);
+    partial void OnClientIdChanged();
+    #endregion
+		
+		public Run()
+		{
+			this._Values = new EntitySet<Value>(new Action<Value>(this.attach_Values), new Action<Value>(this.detach_Values));
+			this._Algorithm = default(EntityRef<Algorithm>);
+			this._Problem = default(EntityRef<Problem>);
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_AlgorithmId", DbType="BigInt NOT NULL")]
+		public long AlgorithmId
+		{
+			get
+			{
+				return this._AlgorithmId;
+			}
+			set
+			{
+				if ((this._AlgorithmId != value))
+				{
+					if (this._Algorithm.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnAlgorithmIdChanging(value);
+					this.SendPropertyChanging();
+					this._AlgorithmId = value;
+					this.SendPropertyChanged("AlgorithmId");
+					this.OnAlgorithmIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ProblemId", DbType="BigInt NOT NULL")]
+		public long ProblemId
+		{
+			get
+			{
+				return this._ProblemId;
+			}
+			set
+			{
+				if ((this._ProblemId != value))
+				{
+					if (this._Problem.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnProblemIdChanging(value);
+					this.SendPropertyChanging();
+					this._ProblemId = value;
+					this.SendPropertyChanged("ProblemId");
+					this.OnProblemIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_CreatedDate", DbType="DateTime2 NOT NULL")]
+		public System.DateTime CreatedDate
+		{
+			get
+			{
+				return this._CreatedDate;
+			}
+			set
+			{
+				if ((this._CreatedDate != value))
+				{
+					this.OnCreatedDateChanging(value);
+					this.SendPropertyChanging();
+					this._CreatedDate = value;
+					this.SendPropertyChanged("CreatedDate");
+					this.OnCreatedDateChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_UserId", DbType="UniqueIdentifier NOT NULL")]
+		public System.Guid UserId
+		{
+			get
+			{
+				return this._UserId;
+			}
+			set
+			{
+				if ((this._UserId != value))
+				{
+					this.OnUserIdChanging(value);
+					this.SendPropertyChanging();
+					this._UserId = value;
+					this.SendPropertyChanged("UserId");
+					this.OnUserIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ClientId", DbType="UniqueIdentifier NOT NULL")]
+		public System.Guid ClientId
+		{
+			get
+			{
+				return this._ClientId;
+			}
+			set
+			{
+				if ((this._ClientId != value))
+				{
+					this.OnClientIdChanging(value);
+					this.SendPropertyChanging();
+					this._ClientId = value;
+					this.SendPropertyChanged("ClientId");
+					this.OnClientIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Run_Value", Storage="_Values", ThisKey="Id", OtherKey="RunId")]
+		public EntitySet<Value> Values
+		{
+			get
+			{
+				return this._Values;
+			}
+			set
+			{
+				this._Values.Assign(value);
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Algorithm_Run", Storage="_Algorithm", ThisKey="AlgorithmId", OtherKey="Id", IsForeignKey=true)]
+		public Algorithm Algorithm
+		{
+			get
+			{
+				return this._Algorithm.Entity;
+			}
+			set
+			{
+				Algorithm previousValue = this._Algorithm.Entity;
+				if (((previousValue != value) 
+							|| (this._Algorithm.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._Algorithm.Entity = null;
+						previousValue.Runs.Remove(this);
+					}
+					this._Algorithm.Entity = value;
+					if ((value != null))
+					{
+						value.Runs.Add(this);
+						this._AlgorithmId = value.Id;
+					}
+					else
+					{
+						this._AlgorithmId = default(long);
+					}
+					this.SendPropertyChanged("Algorithm");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Problem_Run", Storage="_Problem", ThisKey="ProblemId", OtherKey="Id", IsForeignKey=true)]
+		public Problem Problem
+		{
+			get
+			{
+				return this._Problem.Entity;
+			}
+			set
+			{
+				Problem previousValue = this._Problem.Entity;
+				if (((previousValue != value) 
+							|| (this._Problem.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._Problem.Entity = null;
+						previousValue.Runs.Remove(this);
+					}
+					this._Problem.Entity = value;
+					if ((value != null))
+					{
+						value.Runs.Add(this);
+						this._ProblemId = value.Id;
+					}
+					else
+					{
+						this._ProblemId = default(long);
+					}
+					this.SendPropertyChanged("Problem");
+				}
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		
+		private void attach_Values(Value entity)
+		{
+			this.SendPropertyChanging();
+			entity.Run = this;
+		}
+		
+		private void detach_Values(Value entity)
+		{
+			this.SendPropertyChanging();
+			entity.Run = null;
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Value")]
+	public partial class Value : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private long _RunId;
+		
+		private long _ValueNameId;
+		
+		private long _DataTypeId;
+		
+		private System.Nullable<bool> _BoolValue;
+		
+		private System.Nullable<int> _IntValue;
+		
+		private System.Nullable<long> _LongValue;
+		
+		private System.Nullable<float> _FloatValue;
+		
+		private System.Nullable<double> _DoubleValue;
+		
+		private string _StringValue;
+		
+		private System.Nullable<long> _BinaryDataId;
+		
+		private EntityRef<BinaryData> _BinaryData;
+		
+		private EntityRef<DataType> _DataType;
+		
+		private EntityRef<Run> _Run;
+		
+		private EntityRef<ValueName> _ValueName;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnRunIdChanging(long value);
+    partial void OnRunIdChanged();
+    partial void OnValueNameIdChanging(long value);
+    partial void OnValueNameIdChanged();
+    partial void OnDataTypeIdChanging(long value);
+    partial void OnDataTypeIdChanged();
+    partial void OnBoolValueChanging(System.Nullable<bool> value);
+    partial void OnBoolValueChanged();
+    partial void OnIntValueChanging(System.Nullable<int> value);
+    partial void OnIntValueChanged();
+    partial void OnLongValueChanging(System.Nullable<long> value);
+    partial void OnLongValueChanged();
+    partial void OnFloatValueChanging(System.Nullable<float> value);
+    partial void OnFloatValueChanged();
+    partial void OnDoubleValueChanging(System.Nullable<double> value);
+    partial void OnDoubleValueChanged();
+    partial void OnStringValueChanging(string value);
+    partial void OnStringValueChanged();
+    partial void OnBinaryDataIdChanging(System.Nullable<long> value);
+    partial void OnBinaryDataIdChanged();
+    #endregion
+		
+		public Value()
+		{
+			this._BinaryData = default(EntityRef<BinaryData>);
+			this._DataType = default(EntityRef<DataType>);
+			this._Run = default(EntityRef<Run>);
+			this._ValueName = default(EntityRef<ValueName>);
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_RunId", DbType="BigInt NOT NULL")]
+		public long RunId
+		{
+			get
+			{
+				return this._RunId;
+			}
+			set
+			{
+				if ((this._RunId != value))
+				{
+					if (this._Run.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnRunIdChanging(value);
+					this.SendPropertyChanging();
+					this._RunId = value;
+					this.SendPropertyChanged("RunId");
+					this.OnRunIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ValueNameId", DbType="BigInt NOT NULL")]
+		public long ValueNameId
+		{
+			get
+			{
+				return this._ValueNameId;
+			}
+			set
+			{
+				if ((this._ValueNameId != value))
+				{
+					if (this._ValueName.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnValueNameIdChanging(value);
+					this.SendPropertyChanging();
+					this._ValueNameId = value;
+					this.SendPropertyChanged("ValueNameId");
+					this.OnValueNameIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_DataTypeId", DbType="BigInt NOT NULL")]
+		public long DataTypeId
+		{
+			get
+			{
+				return this._DataTypeId;
+			}
+			set
+			{
+				if ((this._DataTypeId != value))
+				{
+					if (this._DataType.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnDataTypeIdChanging(value);
+					this.SendPropertyChanging();
+					this._DataTypeId = value;
+					this.SendPropertyChanged("DataTypeId");
+					this.OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_BoolValue", DbType="Bit")]
+		public System.Nullable<bool> BoolValue
+		{
+			get
+			{
+				return this._BoolValue;
+			}
+			set
+			{
+				if ((this._BoolValue != value))
+				{
+					this.OnBoolValueChanging(value);
+					this.SendPropertyChanging();
+					this._BoolValue = value;
+					this.SendPropertyChanged("BoolValue");
+					this.OnBoolValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_IntValue", DbType="Int")]
+		public System.Nullable<int> IntValue
+		{
+			get
+			{
+				return this._IntValue;
+			}
+			set
+			{
+				if ((this._IntValue != value))
+				{
+					this.OnIntValueChanging(value);
+					this.SendPropertyChanging();
+					this._IntValue = value;
+					this.SendPropertyChanged("IntValue");
+					this.OnIntValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_LongValue", DbType="BigInt")]
+		public System.Nullable<long> LongValue
+		{
+			get
+			{
+				return this._LongValue;
+			}
+			set
+			{
+				if ((this._LongValue != value))
+				{
+					this.OnLongValueChanging(value);
+					this.SendPropertyChanging();
+					this._LongValue = value;
+					this.SendPropertyChanged("LongValue");
+					this.OnLongValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_FloatValue", DbType="Real")]
+		public System.Nullable<float> FloatValue
+		{
+			get
+			{
+				return this._FloatValue;
+			}
+			set
+			{
+				if ((this._FloatValue != value))
+				{
+					this.OnFloatValueChanging(value);
+					this.SendPropertyChanging();
+					this._FloatValue = value;
+					this.SendPropertyChanged("FloatValue");
+					this.OnFloatValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_DoubleValue", DbType="Float")]
+		public System.Nullable<double> DoubleValue
+		{
+			get
+			{
+				return this._DoubleValue;
+			}
+			set
+			{
+				if ((this._DoubleValue != value))
+				{
+					this.OnDoubleValueChanging(value);
+					this.SendPropertyChanging();
+					this._DoubleValue = value;
+					this.SendPropertyChanged("DoubleValue");
+					this.OnDoubleValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_StringValue", DbType="NVarChar(MAX)")]
+		public string StringValue
+		{
+			get
+			{
+				return this._StringValue;
+			}
+			set
+			{
+				if ((this._StringValue != value))
+				{
+					this.OnStringValueChanging(value);
+					this.SendPropertyChanging();
+					this._StringValue = value;
+					this.SendPropertyChanged("StringValue");
+					this.OnStringValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_BinaryDataId", DbType="BigInt")]
+		public System.Nullable<long> BinaryDataId
+		{
+			get
+			{
+				return this._BinaryDataId;
+			}
+			set
+			{
+				if ((this._BinaryDataId != value))
+				{
+					if (this._BinaryData.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnBinaryDataIdChanging(value);
+					this.SendPropertyChanging();
+					this._BinaryDataId = value;
+					this.SendPropertyChanged("BinaryDataId");
+					this.OnBinaryDataIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="BinaryData_Value", Storage="_BinaryData", ThisKey="BinaryDataId", OtherKey="Id", IsForeignKey=true)]
+		public BinaryData BinaryData
+		{
+			get
+			{
+				return this._BinaryData.Entity;
+			}
+			set
+			{
+				BinaryData previousValue = this._BinaryData.Entity;
+				if (((previousValue != value) 
+							|| (this._BinaryData.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._BinaryData.Entity = null;
+						previousValue.Values.Remove(this);
+					}
+					this._BinaryData.Entity = value;
+					if ((value != null))
+					{
+						value.Values.Add(this);
+						this._BinaryDataId = value.Id;
+					}
+					else
+					{
+						this._BinaryDataId = default(Nullable<long>);
+					}
+					this.SendPropertyChanged("BinaryData");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DataType_Value", Storage="_DataType", ThisKey="DataTypeId", OtherKey="Id", IsForeignKey=true)]
+		public DataType DataType
+		{
+			get
+			{
+				return this._DataType.Entity;
+			}
+			set
+			{
+				DataType previousValue = this._DataType.Entity;
+				if (((previousValue != value) 
+							|| (this._DataType.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._DataType.Entity = null;
+						previousValue.Values.Remove(this);
+					}
+					this._DataType.Entity = value;
+					if ((value != null))
+					{
+						value.Values.Add(this);
+						this._DataTypeId = value.Id;
+					}
+					else
+					{
+						this._DataTypeId = default(long);
+					}
+					this.SendPropertyChanged("DataType");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Run_Value", Storage="_Run", ThisKey="RunId", OtherKey="Id", IsForeignKey=true)]
+		public Run Run
+		{
+			get
+			{
+				return this._Run.Entity;
+			}
+			set
+			{
+				Run previousValue = this._Run.Entity;
+				if (((previousValue != value) 
+							|| (this._Run.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._Run.Entity = null;
+						previousValue.Values.Remove(this);
+					}
+					this._Run.Entity = value;
+					if ((value != null))
+					{
+						value.Values.Add(this);
+						this._RunId = value.Id;
+					}
+					else
+					{
+						this._RunId = default(long);
+					}
+					this.SendPropertyChanged("Run");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="ValueName_Value", Storage="_ValueName", ThisKey="ValueNameId", OtherKey="Id", IsForeignKey=true)]
+		public ValueName ValueName
+		{
+			get
+			{
+				return this._ValueName.Entity;
+			}
+			set
+			{
+				ValueName previousValue = this._ValueName.Entity;
+				if (((previousValue != value) 
+							|| (this._ValueName.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._ValueName.Entity = null;
+						previousValue.Values.Remove(this);
+					}
+					this._ValueName.Entity = value;
+					if ((value != null))
+					{
+						value.Values.Add(this);
+						this._ValueNameId = value.Id;
+					}
+					else
+					{
+						this._ValueNameId = default(long);
+					}
+					this.SendPropertyChanged("ValueName");
+				}
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Characteristic")]
+	public partial class Characteristic : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private string _Name;
+		
+		private byte _Type;
+		
+		private EntitySet<CharacteristicValue> _CharacteristicValues;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnNameChanging(string value);
+    partial void OnNameChanged();
+    partial void OnTypeChanging(byte value);
+    partial void OnTypeChanged();
+    #endregion
+		
+		public Characteristic()
+		{
+			this._CharacteristicValues = new EntitySet<CharacteristicValue>(new Action<CharacteristicValue>(this.attach_CharacteristicValues), new Action<CharacteristicValue>(this.detach_CharacteristicValues));
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="NVarChar(200) NOT NULL", CanBeNull=false)]
+		public string Name
+		{
+			get
+			{
+				return this._Name;
+			}
+			set
+			{
+				if ((this._Name != value))
+				{
+					this.OnNameChanging(value);
+					this.SendPropertyChanging();
+					this._Name = value;
+					this.SendPropertyChanged("Name");
+					this.OnNameChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Type", DbType="TinyInt NOT NULL")]
+		public byte Type
+		{
+			get
+			{
+				return this._Type;
+			}
+			set
+			{
+				if ((this._Type != value))
+				{
+					this.OnTypeChanging(value);
+					this.SendPropertyChanging();
+					this._Type = value;
+					this.SendPropertyChanged("Type");
+					this.OnTypeChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Characteristic_CharacteristicValue", Storage="_CharacteristicValues", ThisKey="Id", OtherKey="CharacteristicId")]
+		public EntitySet<CharacteristicValue> CharacteristicValues
+		{
+			get
+			{
+				return this._CharacteristicValues;
+			}
+			set
+			{
+				this._CharacteristicValues.Assign(value);
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+		
+		private void attach_CharacteristicValues(CharacteristicValue entity)
+		{
+			this.SendPropertyChanging();
+			entity.Characteristic = this;
+		}
+		
+		private void detach_CharacteristicValues(CharacteristicValue entity)
+		{
+			this.SendPropertyChanging();
+			entity.Characteristic = null;
+		}
+	}
+	
+	[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.CharacteristicValue")]
+	public partial class CharacteristicValue : INotifyPropertyChanging, INotifyPropertyChanged
+	{
+		
+		private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
+		
+		private long _Id;
+		
+		private long _ProblemId;
+		
+		private long _CharacteristicId;
+		
+		private long _DataTypeId;
+		
+		private System.Nullable<bool> _BoolValue;
+		
+		private System.Nullable<int> _IntValue;
+		
+		private System.Nullable<long> _LongValue;
+		
+		private System.Nullable<float> _FloatValue;
+		
+		private System.Nullable<double> _DoubleValue;
+		
+		private string _StringValue;
+		
+		private EntityRef<Characteristic> _Characteristic;
+		
+		private EntityRef<DataType> _DataType;
+		
+		private EntityRef<Problem> _Problem;
+		
+    #region Extensibility Method Definitions
+    partial void OnLoaded();
+    partial void OnValidate(System.Data.Linq.ChangeAction action);
+    partial void OnCreated();
+    partial void OnIdChanging(long value);
+    partial void OnIdChanged();
+    partial void OnProblemIdChanging(long value);
+    partial void OnProblemIdChanged();
+    partial void OnCharacteristicIdChanging(long value);
+    partial void OnCharacteristicIdChanged();
+    partial void OnDataTypeIdChanging(long value);
+    partial void OnDataTypeIdChanged();
+    partial void OnBoolValueChanging(System.Nullable<bool> value);
+    partial void OnBoolValueChanged();
+    partial void OnIntValueChanging(System.Nullable<int> value);
+    partial void OnIntValueChanged();
+    partial void OnLongValueChanging(System.Nullable<long> value);
+    partial void OnLongValueChanged();
+    partial void OnFloatValueChanging(System.Nullable<float> value);
+    partial void OnFloatValueChanged();
+    partial void OnDoubleValueChanging(System.Nullable<double> value);
+    partial void OnDoubleValueChanged();
+    partial void OnStringValueChanging(string value);
+    partial void OnStringValueChanged();
+    #endregion
+		
+		public CharacteristicValue()
+		{
+			this._Characteristic = default(EntityRef<Characteristic>);
+			this._DataType = default(EntityRef<DataType>);
+			this._Problem = default(EntityRef<Problem>);
+			OnCreated();
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Id", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
+		public long Id
+		{
+			get
+			{
+				return this._Id;
+			}
+			set
+			{
+				if ((this._Id != value))
+				{
+					this.OnIdChanging(value);
+					this.SendPropertyChanging();
+					this._Id = value;
+					this.SendPropertyChanged("Id");
+					this.OnIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ProblemId", DbType="BigInt NOT NULL")]
+		public long ProblemId
+		{
+			get
+			{
+				return this._ProblemId;
+			}
+			set
+			{
+				if ((this._ProblemId != value))
+				{
+					if (this._Problem.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnProblemIdChanging(value);
+					this.SendPropertyChanging();
+					this._ProblemId = value;
+					this.SendPropertyChanged("ProblemId");
+					this.OnProblemIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_CharacteristicId", DbType="BigInt NOT NULL")]
+		public long CharacteristicId
+		{
+			get
+			{
+				return this._CharacteristicId;
+			}
+			set
+			{
+				if ((this._CharacteristicId != value))
+				{
+					if (this._Characteristic.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnCharacteristicIdChanging(value);
+					this.SendPropertyChanging();
+					this._CharacteristicId = value;
+					this.SendPropertyChanged("CharacteristicId");
+					this.OnCharacteristicIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_DataTypeId", DbType="BigInt NOT NULL")]
+		public long DataTypeId
+		{
+			get
+			{
+				return this._DataTypeId;
+			}
+			set
+			{
+				if ((this._DataTypeId != value))
+				{
+					if (this._DataType.HasLoadedOrAssignedValue)
+					{
+						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
+					}
+					this.OnDataTypeIdChanging(value);
+					this.SendPropertyChanging();
+					this._DataTypeId = value;
+					this.SendPropertyChanged("DataTypeId");
+					this.OnDataTypeIdChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_BoolValue", DbType="Bit")]
+		public System.Nullable<bool> BoolValue
+		{
+			get
+			{
+				return this._BoolValue;
+			}
+			set
+			{
+				if ((this._BoolValue != value))
+				{
+					this.OnBoolValueChanging(value);
+					this.SendPropertyChanging();
+					this._BoolValue = value;
+					this.SendPropertyChanged("BoolValue");
+					this.OnBoolValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_IntValue", DbType="Int")]
+		public System.Nullable<int> IntValue
+		{
+			get
+			{
+				return this._IntValue;
+			}
+			set
+			{
+				if ((this._IntValue != value))
+				{
+					this.OnIntValueChanging(value);
+					this.SendPropertyChanging();
+					this._IntValue = value;
+					this.SendPropertyChanged("IntValue");
+					this.OnIntValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_LongValue", DbType="BigInt")]
+		public System.Nullable<long> LongValue
+		{
+			get
+			{
+				return this._LongValue;
+			}
+			set
+			{
+				if ((this._LongValue != value))
+				{
+					this.OnLongValueChanging(value);
+					this.SendPropertyChanging();
+					this._LongValue = value;
+					this.SendPropertyChanged("LongValue");
+					this.OnLongValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_FloatValue", DbType="Real")]
+		public System.Nullable<float> FloatValue
+		{
+			get
+			{
+				return this._FloatValue;
+			}
+			set
+			{
+				if ((this._FloatValue != value))
+				{
+					this.OnFloatValueChanging(value);
+					this.SendPropertyChanging();
+					this._FloatValue = value;
+					this.SendPropertyChanged("FloatValue");
+					this.OnFloatValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_DoubleValue", DbType="Float")]
+		public System.Nullable<double> DoubleValue
+		{
+			get
+			{
+				return this._DoubleValue;
+			}
+			set
+			{
+				if ((this._DoubleValue != value))
+				{
+					this.OnDoubleValueChanging(value);
+					this.SendPropertyChanging();
+					this._DoubleValue = value;
+					this.SendPropertyChanged("DoubleValue");
+					this.OnDoubleValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_StringValue", DbType="NVarChar(MAX)")]
+		public string StringValue
+		{
+			get
+			{
+				return this._StringValue;
+			}
+			set
+			{
+				if ((this._StringValue != value))
+				{
+					this.OnStringValueChanging(value);
+					this.SendPropertyChanging();
+					this._StringValue = value;
+					this.SendPropertyChanged("StringValue");
+					this.OnStringValueChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Characteristic_CharacteristicValue", Storage="_Characteristic", ThisKey="CharacteristicId", OtherKey="Id", IsForeignKey=true)]
+		public Characteristic Characteristic
+		{
+			get
+			{
+				return this._Characteristic.Entity;
+			}
+			set
+			{
+				Characteristic previousValue = this._Characteristic.Entity;
+				if (((previousValue != value) 
+							|| (this._Characteristic.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._Characteristic.Entity = null;
+						previousValue.CharacteristicValues.Remove(this);
+					}
+					this._Characteristic.Entity = value;
+					if ((value != null))
+					{
+						value.CharacteristicValues.Add(this);
+						this._CharacteristicId = value.Id;
+					}
+					else
+					{
+						this._CharacteristicId = default(long);
+					}
+					this.SendPropertyChanged("Characteristic");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DataType_CharacteristicValue", Storage="_DataType", ThisKey="DataTypeId", OtherKey="Id", IsForeignKey=true)]
+		public DataType DataType
+		{
+			get
+			{
+				return this._DataType.Entity;
+			}
+			set
+			{
+				DataType previousValue = this._DataType.Entity;
+				if (((previousValue != value) 
+							|| (this._DataType.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._DataType.Entity = null;
+						previousValue.CharacteristicValues.Remove(this);
+					}
+					this._DataType.Entity = value;
+					if ((value != null))
+					{
+						value.CharacteristicValues.Add(this);
+						this._DataTypeId = value.Id;
+					}
+					else
+					{
+						this._DataTypeId = default(long);
+					}
+					this.SendPropertyChanged("DataType");
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Problem_CharacteristicValue", Storage="_Problem", ThisKey="ProblemId", OtherKey="Id", IsForeignKey=true)]
+		public Problem Problem
+		{
+			get
+			{
+				return this._Problem.Entity;
+			}
+			set
+			{
+				Problem previousValue = this._Problem.Entity;
+				if (((previousValue != value) 
+							|| (this._Problem.HasLoadedOrAssignedValue == false)))
+				{
+					this.SendPropertyChanging();
+					if ((previousValue != null))
+					{
+						this._Problem.Entity = null;
+						previousValue.CharacteristicValues.Remove(this);
+					}
+					this._Problem.Entity = value;
+					if ((value != null))
+					{
+						value.CharacteristicValues.Add(this);
+						this._ProblemId = value.Id;
+					}
+					else
+					{
+						this._ProblemId = default(long);
+					}
+					this.SendPropertyChanged("Problem");
+				}
+			}
+		}
+		
+		public event PropertyChangingEventHandler PropertyChanging;
+		
+		public event PropertyChangedEventHandler PropertyChanged;
+		
+		protected virtual void SendPropertyChanging()
+		{
+			if ((this.PropertyChanging != null))
+			{
+				this.PropertyChanging(this, emptyChangingEventArgs);
+			}
+		}
+		
+		protected virtual void SendPropertyChanged(String propertyName)
+		{
+			if ((this.PropertyChanged != null))
+			{
+				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+			}
+		}
+	}
+}
+#pragma warning restore 1591
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/AssemblyInfo.cs.frame	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/AssemblyInfo.cs.frame	(revision 8049)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.OKB.DataAccess")]
+[assembly: AssemblyDescription("Data access layer for HeuristicLab OKB services")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("8a145a17-ce73-47da-b520-b4194835fb49")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.6.$WCREV$")]
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.Designer.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.Designer.cs	(revision 8049)
@@ -0,0 +1,37 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Services.OKB.DataAccess.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
+        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=.\\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OK" +
+            "B")]
+        public string OKBConnectionString {
+            get {
+                return ((string)(this["OKBConnectionString"]));
+            }
+        }
+    }
+}
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.settings
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.settings	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/Properties/Settings.settings	(revision 8049)
@@ -0,0 +1,14 @@
+﻿<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="HeuristicLab.Services.OKB.DataAccess.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="OKBConnectionString" Type="(Connection string)" Scope="Application">
+      <DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
+&lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
+  &lt;ConnectionString&gt;Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OKB&lt;/ConnectionString&gt;
+  &lt;ProviderName&gt;System.Data.SqlClient&lt;/ProviderName&gt;
+&lt;/SerializableConnectionString&gt;</DesignTimeValue>
+      <Value Profile="(Default)">Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OKB</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/SQL Scripts/Clear OKB.sql
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/SQL Scripts/Clear OKB.sql	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/SQL Scripts/Clear OKB.sql	(revision 8049)
@@ -0,0 +1,14 @@
+delete from [HeuristicLab.OKB].[dbo].ProblemUser;
+delete from [HeuristicLab.OKB].[dbo].AlgorithmUser;
+delete from [HeuristicLab.OKB].[dbo].Problem;
+delete from [HeuristicLab.OKB].[dbo].ProblemClass;
+delete from [HeuristicLab.OKB].[dbo].Algorithm;
+delete from [HeuristicLab.OKB].[dbo].AlgorithmClass;
+delete from [HeuristicLab.OKB].[dbo].Platform;
+delete from [HeuristicLab.OKB].[dbo].ValueName;
+delete from [HeuristicLab.OKB].[dbo].Value;
+delete from [HeuristicLab.OKB].[dbo].DataType;
+delete from [HeuristicLab.OKB].[dbo].Run;
+delete from [HeuristicLab.OKB].[dbo].BinaryData;
+delete from [HeuristicLab.OKB].[dbo].Characteristic;
+delete from [HeuristicLab.OKB].[dbo].CharacteristicValue;
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/SQL Scripts/Create OKB.sql
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/SQL Scripts/Create OKB.sql	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/SQL Scripts/Create OKB.sql	(revision 8049)
@@ -0,0 +1,112 @@
+USE [master]
+GO
+
+/****** Object:  Database [HeuristicLab.OKB]    Script Date: 09/12/2010 00:57:17 ******/
+IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'HeuristicLab.OKB')
+DROP DATABASE [HeuristicLab.OKB]
+GO
+
+USE [master]
+GO
+
+/****** Object:  Database [HeuristicLab.OKB]    Script Date: 09/12/2010 00:57:17 ******/
+CREATE DATABASE [HeuristicLab.OKB] ON  PRIMARY 
+( NAME = N'HeuristicLab.OKB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\HeuristicLab.OKB.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
+ LOG ON 
+( NAME = N'HeuristicLab.OKB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\HeuristicLab.OKB_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET COMPATIBILITY_LEVEL = 100
+GO
+
+IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
+begin
+EXEC [HeuristicLab.OKB].[dbo].[sp_fulltext_database] @action = 'enable'
+end
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ANSI_NULL_DEFAULT OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ANSI_NULLS OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ANSI_PADDING OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ANSI_WARNINGS OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ARITHABORT OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET AUTO_CLOSE OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET AUTO_CREATE_STATISTICS ON 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET AUTO_SHRINK OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET AUTO_UPDATE_STATISTICS ON 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET CURSOR_CLOSE_ON_COMMIT OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET CURSOR_DEFAULT  GLOBAL 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET CONCAT_NULL_YIELDS_NULL OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET NUMERIC_ROUNDABORT OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET QUOTED_IDENTIFIER OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET RECURSIVE_TRIGGERS OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET  DISABLE_BROKER 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET DATE_CORRELATION_OPTIMIZATION OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET TRUSTWORTHY OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET ALLOW_SNAPSHOT_ISOLATION OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET PARAMETERIZATION SIMPLE 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET READ_COMMITTED_SNAPSHOT OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET HONOR_BROKER_PRIORITY OFF 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET  READ_WRITE 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET RECOVERY SIMPLE 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET  MULTI_USER 
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET PAGE_VERIFY CHECKSUM  
+GO
+
+ALTER DATABASE [HeuristicLab.OKB] SET DB_CHAINING OFF 
+GO
+
+
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/ValueNameCategory.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/ValueNameCategory.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/ValueNameCategory.cs	(revision 8049)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+namespace HeuristicLab.Services.OKB.DataAccess {
+  [DataContract]
+  public enum ValueNameCategory {
+    [EnumMember]
+    Parameter = 0,
+    [EnumMember]
+    Result = 1
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/ValueNameType.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/ValueNameType.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/ValueNameType.cs	(revision 8049)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Services.OKB.DataAccess {
+  public enum ValueNameType {
+    Bool = 0,
+    Int = 1,
+    Long = 2,
+    Float = 3,
+    Double = 4,
+    String = 5,
+    Binary = 6,
+    Percent = 7,
+    TimeSpan = 8
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/app.config
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/app.config	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB.DataAccess/3.3/app.config	(revision 8049)
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<configuration>
+  <configSections>
+  </configSections>
+  <connectionStrings>
+    <add name="HeuristicLab.Services.OKB.DataAccess.Properties.Settings.OKBConnectionString"
+         connectionString="Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OKB"
+         providerName="System.Data.SqlClient" />
+  </connectionStrings>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/AdministrationService.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/AdministrationService.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/AdministrationService.cs	(revision 8049)
@@ -0,0 +1,332 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.ServiceModel;
+using HeuristicLab.Services.Access;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Administration {
+  /// <summary>
+  /// Implementation of the OKB administration service (interface <see cref="IAdministrationService"/>).
+  /// </summary>
+  [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
+  public class AdministrationService : IAdministrationService {
+    IRoleVerifier roleVerifier = AccessServiceLocator.Instance.RoleVerifier;
+
+    #region Platform Methods
+    public DataTransfer.Platform GetPlatform(long id) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.Platforms.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.Platform> GetPlatforms() {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.Platforms.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddPlatform(DataTransfer.Platform dto) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Platform entity = Convert.ToEntity(dto); entity.Id = 0;
+        okb.Platforms.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdatePlatform(DataTransfer.Platform dto) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Platform entity = okb.Platforms.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeletePlatform(long id) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Platform entity = okb.Platforms.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.Platforms.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region AlgorithmClass Methods
+    public DataTransfer.AlgorithmClass GetAlgorithmClass(long id) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.AlgorithmClasses.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.AlgorithmClass> GetAlgorithmClasses() {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.AlgorithmClasses.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddAlgorithmClass(DataTransfer.AlgorithmClass dto) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.AlgorithmClass entity = Convert.ToEntity(dto); entity.Id = 0;
+        okb.AlgorithmClasses.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdateAlgorithmClass(DataTransfer.AlgorithmClass dto) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.AlgorithmClass entity = okb.AlgorithmClasses.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteAlgorithmClass(long id) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.AlgorithmClass entity = okb.AlgorithmClasses.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.AlgorithmClasses.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region Algorithm Methods
+    public DataTransfer.Algorithm GetAlgorithm(long id) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.Algorithms.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.Algorithm> GetAlgorithms() {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.Algorithms.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddAlgorithm(DataTransfer.Algorithm dto) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Algorithm entity = Convert.ToEntity(dto, okb); entity.Id = 0;
+        okb.Algorithms.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdateAlgorithm(DataTransfer.Algorithm dto) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Algorithm entity = okb.Algorithms.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity, okb);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteAlgorithm(long id) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Algorithm entity = okb.Algorithms.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.Algorithms.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    public IEnumerable<Guid> GetAlgorithmUsers(long algorithmId) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId).Select(x => x.UserGroupId).ToArray();
+      }
+    }
+    public void UpdateAlgorithmUsers(long algorithmId, IEnumerable<Guid> users) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        okb.AlgorithmUsers.DeleteAllOnSubmit(okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId));
+        okb.AlgorithmUsers.InsertAllOnSubmit(users.Select(x => new DataAccess.AlgorithmUser { AlgorithmId = algorithmId, UserGroupId = x }));
+        okb.SubmitChanges();
+      }
+    }
+    public byte[] GetAlgorithmData(long algorithmId) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var data = okb.Algorithms.Where(x => x.Id == algorithmId).Select(x => x.BinaryData).FirstOrDefault();
+        if (data != null) return data.Data.ToArray();
+        else return null;
+      }
+    }
+    public void UpdateAlgorithmData(long algorithmId, byte[] data) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var entity = okb.Algorithms.Where(x => x.Id == algorithmId).FirstOrDefault();
+        if (entity != null)
+          entity.BinaryData = Convert.ToEntity(data, okb);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region ProblemClass Methods
+    public DataTransfer.ProblemClass GetProblemClass(long id) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.ProblemClasses.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.ProblemClass> GetProblemClasses() {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.ProblemClasses.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddProblemClass(DataTransfer.ProblemClass dto) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.ProblemClass entity = Convert.ToEntity(dto); entity.Id = 0;
+        okb.ProblemClasses.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdateProblemClass(DataTransfer.ProblemClass dto) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.ProblemClass entity = okb.ProblemClasses.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteProblemClass(long id) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.ProblemClass entity = okb.ProblemClasses.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.ProblemClasses.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+
+    #region Problem Methods
+    public DataTransfer.Problem GetProblem(long id) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return Convert.ToDto(okb.Problems.FirstOrDefault(x => x.Id == id));
+      }
+    }
+    public IEnumerable<DataTransfer.Problem> GetProblems() {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.Problems.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+    public long AddProblem(DataTransfer.Problem dto) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Problem entity = Convert.ToEntity(dto, okb); entity.Id = 0;
+        okb.Problems.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+        return entity.Id;
+      }
+    }
+    public void UpdateProblem(DataTransfer.Problem dto) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Problem entity = okb.Problems.FirstOrDefault(x => x.Id == dto.Id);
+        Convert.ToEntity(dto, entity, okb);
+        okb.SubmitChanges();
+      }
+    }
+    public void DeleteProblem(long id) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Problem entity = okb.Problems.FirstOrDefault(x => x.Id == id);
+        if (entity != null) okb.Problems.DeleteOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+    public IEnumerable<Guid> GetProblemUsers(long problemId) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.ProblemUsers.Where(x => x.ProblemId == problemId).Select(x => x.UserGroupId).ToArray();
+      }
+    }
+    public void UpdateProblemUsers(long problemId, IEnumerable<Guid> users) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        okb.ProblemUsers.DeleteAllOnSubmit(okb.ProblemUsers.Where(x => x.ProblemId == problemId));
+        okb.ProblemUsers.InsertAllOnSubmit(users.Select(x => new DataAccess.ProblemUser { ProblemId = problemId, UserGroupId = x }));
+        okb.SubmitChanges();
+      }
+    }
+    public byte[] GetProblemData(long problemId) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var data = okb.Problems.Where(x => x.Id == problemId).Select(x => x.BinaryData).FirstOrDefault();
+        if (data != null) return data.Data.ToArray();
+        else return null;
+      }
+    }
+    public void UpdateProblemData(long problemId, byte[] data) {
+      roleVerifier.AuthenticateForAllRoles(OKBRoles.OKBAdministrator);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var entity = okb.Problems.Where(x => x.Id == problemId).FirstOrDefault();
+        if (entity != null)
+          entity.BinaryData = Convert.ToEntity(data, okb);
+        okb.SubmitChanges();
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/AdministrationService.svc
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/AdministrationService.svc	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/AdministrationService.svc	(revision 8049)
@@ -0,0 +1,1 @@
+<%@ServiceHost language=c# Debug="true" Service="HeuristicLab.Services.OKB.Administration.AdministrationService"%>
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/Convert.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/Convert.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/Convert.cs	(revision 8049)
@@ -0,0 +1,133 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using System.Security.Cryptography;
+using DA = HeuristicLab.Services.OKB.DataAccess;
+using DT = HeuristicLab.Services.OKB.Administration.DataTransfer;
+
+namespace HeuristicLab.Services.OKB.Administration {
+  public static class Convert {
+    #region Platform
+    public static DT.Platform ToDto(DA.Platform source) {
+      if (source == null) return null;
+      return new DT.Platform { Id = source.Id, Name = source.Name, Description = source.Description };
+    }
+    public static DA.Platform ToEntity(DT.Platform source) {
+      if (source == null) return null;
+      return new DA.Platform { Id = source.Id, Name = source.Name, Description = source.Description };
+    }
+    public static void ToEntity(DT.Platform source, DA.Platform target) {
+      if ((source != null) && (target != null)) {
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+      }
+    }
+    #endregion
+
+    #region AlgorithmClass
+    public static DT.AlgorithmClass ToDto(DA.AlgorithmClass source) {
+      if (source == null) return null;
+      return new DT.AlgorithmClass { Id = source.Id, Name = source.Name, Description = source.Description };
+    }
+    public static DA.AlgorithmClass ToEntity(DT.AlgorithmClass source) {
+      if (source == null) return null;
+      return new DA.AlgorithmClass { Id = source.Id, Name = source.Name, Description = source.Description };
+    }
+    public static void ToEntity(DT.AlgorithmClass source, DA.AlgorithmClass target) {
+      if ((source != null) && (target != null)) {
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+      }
+    }
+    #endregion
+
+    #region Algorithm
+    public static DT.Algorithm ToDto(DA.Algorithm source) {
+      if (source == null) return null;
+      return new DT.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId, DataTypeName = source.DataType.Name, DataTypeTypeName = source.DataType.TypeName };
+    }
+    public static DA.Algorithm ToEntity(DT.Algorithm source, DA.OKBDataContext okb) {
+      if (source == null) return null;
+      return new DA.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, AlgorithmClassId = source.AlgorithmClassId, DataType = Convert.ToEntity(source.DataTypeName, source.DataTypeTypeName, okb) };
+    }
+    public static void ToEntity(DT.Algorithm source, DA.Algorithm target, DA.OKBDataContext okb) {
+      if ((source != null) && (target != null)) {
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.PlatformId = source.PlatformId; target.AlgorithmClassId = source.AlgorithmClassId; target.DataType = Convert.ToEntity(source.DataTypeName, source.DataTypeTypeName, okb);
+      }
+    }
+    #endregion
+
+    #region ProblemClass
+    public static DT.ProblemClass ToDto(DA.ProblemClass source) {
+      if (source == null) return null;
+      return new DT.ProblemClass { Id = source.Id, Name = source.Name, Description = source.Description };
+    }
+    public static DA.ProblemClass ToEntity(DT.ProblemClass source) {
+      if (source == null) return null;
+      return new DA.ProblemClass { Id = source.Id, Name = source.Name, Description = source.Description };
+    }
+    public static void ToEntity(DT.ProblemClass source, DA.ProblemClass target) {
+      if ((source != null) && (target != null)) {
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description;
+      }
+    }
+    #endregion
+
+    #region Problem
+    public static DT.Problem ToDto(DA.Problem source) {
+      if (source == null) return null;
+      return new DT.Problem { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, ProblemClassId = source.ProblemClassId, DataTypeName = source.DataType.Name, DataTypeTypeName = source.DataType.TypeName };
+    }
+    public static DA.Problem ToEntity(DT.Problem source, DA.OKBDataContext okb) {
+      if (source == null) return null;
+      return new DA.Problem { Id = source.Id, Name = source.Name, Description = source.Description, PlatformId = source.PlatformId, ProblemClassId = source.ProblemClassId, DataType = Convert.ToEntity(source.DataTypeName, source.DataTypeTypeName, okb) };
+    }
+    public static void ToEntity(DT.Problem source, DA.Problem target, DA.OKBDataContext okb) {
+      if ((source != null) && (target != null)) {
+        target.Id = source.Id; target.Name = source.Name; target.Description = source.Description; target.PlatformId = source.PlatformId; target.ProblemClassId = source.ProblemClassId; target.DataType = Convert.ToEntity(source.DataTypeName, source.DataTypeTypeName, okb);
+      }
+    }
+    #endregion
+
+    #region DataType
+    private static DA.DataType ToEntity(string dataTypeName, string dataTypeTypeName, DA.OKBDataContext okb) {
+      if ((dataTypeName == null) || (dataTypeTypeName == null)) return null;
+      var entity = okb.DataTypes.Where(x => (x.Name == dataTypeName) && (x.TypeName == dataTypeTypeName)).FirstOrDefault();
+      if (entity == null)
+        entity = new DA.DataType() { Id = 0, Name = dataTypeName, TypeName = dataTypeTypeName };
+      return entity;
+    }
+    #endregion
+
+    #region BinaryData
+    internal static DA.BinaryData ToEntity(byte[] data, DA.OKBDataContext okb) {
+      if (data == null) return null;
+      byte[] hash;
+      using (SHA1 sha1 = SHA1.Create()) {
+        hash = sha1.ComputeHash(data);
+      }
+      var entity = okb.BinaryDatas.Where(x => x.Hash.Equals(hash)).FirstOrDefault();
+      if (entity == null)
+        entity = new DA.BinaryData() { Id = 0, Data = data, Hash = hash };
+      return entity;
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/Algorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/Algorithm.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/Algorithm.cs	(revision 8049)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Administration.DataTransfer {
+  [DataContract]
+  public class Algorithm : NamedOKBItem {
+    [DataMember]
+    public long PlatformId { get; set; }
+    [DataMember]
+    public long AlgorithmClassId { get; set; }
+    [DataMember]
+    public string DataTypeName { get; set; }
+    [DataMember]
+    public string DataTypeTypeName { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/AlgorithmClass.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/AlgorithmClass.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/AlgorithmClass.cs	(revision 8049)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Administration.DataTransfer {
+  [DataContract]
+  public class AlgorithmClass : NamedOKBItem { }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/NamedOKBItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/NamedOKBItem.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/NamedOKBItem.cs	(revision 8049)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Administration.DataTransfer {
+  [DataContract]
+  public abstract class NamedOKBItem : OKBItem {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string Description { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/OKBItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/OKBItem.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/OKBItem.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Administration.DataTransfer {
+  [DataContract]
+  public abstract class OKBItem {
+    [DataMember]
+    public long Id { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/Platform.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/Platform.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/Platform.cs	(revision 8049)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Administration.DataTransfer {
+  [DataContract]
+  public class Platform : NamedOKBItem { }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/Problem.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/Problem.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/Problem.cs	(revision 8049)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Administration.DataTransfer {
+  [DataContract]
+  public class Problem : NamedOKBItem {
+    [DataMember]
+    public long PlatformId { get; set; }
+    [DataMember]
+    public long ProblemClassId { get; set; }
+    [DataMember]
+    public string DataTypeName { get; set; }
+    [DataMember]
+    public string DataTypeTypeName { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/ProblemClass.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/ProblemClass.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/DataTransfer/ProblemClass.cs	(revision 8049)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Administration.DataTransfer {
+  [DataContract]
+  public class ProblemClass : NamedOKBItem { }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/IAdministrationService.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/IAdministrationService.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Administration/IAdministrationService.cs	(revision 8049)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Net.Security;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.Administration.DataTransfer;
+
+namespace HeuristicLab.Services.OKB.Administration {
+  /// <summary>
+  /// Interface of the OKB administration service.
+  /// </summary>
+  [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+  public interface IAdministrationService {
+    #region Platform Methods
+    [OperationContract]
+    Platform GetPlatform(long id);
+    [OperationContract]
+    IEnumerable<Platform> GetPlatforms();
+    [OperationContract]
+    long AddPlatform(Platform dto);
+    [OperationContract]
+    void UpdatePlatform(Platform dto);
+    [OperationContract]
+    void DeletePlatform(long id);
+    #endregion
+
+    #region AlgorithmClass Methods
+    [OperationContract]
+    AlgorithmClass GetAlgorithmClass(long id);
+    [OperationContract]
+    IEnumerable<AlgorithmClass> GetAlgorithmClasses();
+    [OperationContract]
+    long AddAlgorithmClass(AlgorithmClass dto);
+    [OperationContract]
+    void UpdateAlgorithmClass(AlgorithmClass dto);
+    [OperationContract]
+    void DeleteAlgorithmClass(long id);
+    #endregion
+
+    #region Algorithm Methods
+    [OperationContract]
+    Algorithm GetAlgorithm(long id);
+    [OperationContract]
+    IEnumerable<Algorithm> GetAlgorithms();
+    [OperationContract]
+    long AddAlgorithm(Algorithm dto);
+    [OperationContract]
+    void UpdateAlgorithm(Algorithm dto);
+    [OperationContract]
+    void DeleteAlgorithm(long id);
+    [OperationContract]
+    IEnumerable<Guid> GetAlgorithmUsers(long algorithmId);
+    [OperationContract]
+    void UpdateAlgorithmUsers(long algorithmId, IEnumerable<Guid> users);
+    [OperationContract]
+    byte[] GetAlgorithmData(long algorithmId);
+    [OperationContract]
+    void UpdateAlgorithmData(long algorithmId, byte[] data);
+    #endregion
+
+    #region ProblemClass Methods
+    [OperationContract]
+    ProblemClass GetProblemClass(long id);
+    [OperationContract]
+    IEnumerable<ProblemClass> GetProblemClasses();
+    [OperationContract]
+    long AddProblemClass(ProblemClass dto);
+    [OperationContract]
+    void UpdateProblemClass(ProblemClass dto);
+    [OperationContract]
+    void DeleteProblemClass(long id);
+    #endregion
+
+    #region Problem Methods
+    [OperationContract]
+    Problem GetProblem(long id);
+    [OperationContract]
+    IEnumerable<Problem> GetProblems();
+    [OperationContract]
+    long AddProblem(Problem dto);
+    [OperationContract]
+    void UpdateProblem(Problem dto);
+    [OperationContract]
+    void DeleteProblem(long id);
+    [OperationContract]
+    IEnumerable<Guid> GetProblemUsers(long problemId);
+    [OperationContract]
+    void UpdateProblemUsers(long problemId, IEnumerable<Guid> users);
+    [OperationContract]
+    byte[] GetProblemData(long problemId);
+    [OperationContract]
+    void UpdateProblemData(long problemId, byte[] data);
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/HeuristicLab.Services.OKB-3.3.csproj	(revision 8049)
@@ -0,0 +1,353 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Services.OKB</RootNamespace>
+    <AssemblyName>HeuristicLab.Services.OKB-3.3</AssemblyName>
+    <ProjectTypeGuids>{3D9AD99F-2412-4246-B90B-4EAA41C64699};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <StartArguments>/client:"WcfTestClient.exe"</StartArguments>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Services.OKB-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Services.OKB-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Services.OKB-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Services.OKB-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.Linq" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Web" />
+    <Reference Include="System.Web.ApplicationServices" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Administration\AdministrationService.cs" />
+    <Compile Include="Administration\Convert.cs" />
+    <Compile Include="Administration\DataTransfer\Algorithm.cs" />
+    <Compile Include="Administration\DataTransfer\AlgorithmClass.cs" />
+    <Compile Include="Administration\DataTransfer\NamedOKBItem.cs" />
+    <Compile Include="Administration\DataTransfer\OKBItem.cs" />
+    <Compile Include="Administration\DataTransfer\Platform.cs" />
+    <Compile Include="Administration\DataTransfer\Problem.cs" />
+    <Compile Include="Administration\DataTransfer\ProblemClass.cs" />
+    <Compile Include="Administration\IAdministrationService.cs" />
+    <Compile Include="OKBRoles.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Query\Convert.cs" />
+    <Compile Include="Query\DataTransfer\Algorithm.cs" />
+    <Compile Include="Query\DataTransfer\BinaryValue.cs" />
+    <Compile Include="Query\DataTransfer\BooleanOperation.cs" />
+    <Compile Include="Query\DataTransfer\BoolValue.cs" />
+    <Compile Include="Query\DataTransfer\CombinedFilter.cs" />
+    <Compile Include="Query\DataTransfer\ValueName.cs" />
+    <Compile Include="Query\DataTransfer\NameOrdinalComparisonTimeSpanFilter.cs" />
+    <Compile Include="Query\DataTransfer\OrdinalComparisonTimeSpanFilter.cs" />
+    <Compile Include="Query\DataTransfer\TimeSpanValue.cs" />
+    <Compile Include="Query\DataTransfer\OrdinalComparisonPercentFilter.cs" />
+    <Compile Include="Query\DataTransfer\NameOrdinalComparisonPercentFilter.cs" />
+    <Compile Include="Query\DataTransfer\OrdinalComparisonFloatFilter.cs" />
+    <Compile Include="Query\DataTransfer\OrdinalComparisonDoubleFilter.cs" />
+    <Compile Include="Query\DataTransfer\EqualityComparisonByteArrayFilter.cs" />
+    <Compile Include="Query\DataTransfer\EqualityComparisonBoolFilter.cs" />
+    <Compile Include="Query\DataTransfer\DataType.cs" />
+    <Compile Include="Query\DataTransfer\DoubleValue.cs" />
+    <Compile Include="Query\DataTransfer\EqualityComparison.cs" />
+    <Compile Include="Query\DataTransfer\EqualityComparisonFilter.cs" />
+    <Compile Include="Query\DataTransfer\Filter.cs" />
+    <Compile Include="Query\DataTransfer\FloatValue.cs" />
+    <Compile Include="Query\DataTransfer\IntValue.cs" />
+    <Compile Include="Query\DataTransfer\LongValue.cs" />
+    <Compile Include="Query\DataTransfer\NameEqualityComparisonBoolFilter.cs" />
+    <Compile Include="Query\DataTransfer\NameEqualityComparisonByteArrayFilter.cs" />
+    <Compile Include="Query\DataTransfer\NameOrdinalComparisonDoubleFilter.cs" />
+    <Compile Include="Query\DataTransfer\NameOrdinalComparisonFloatFilter.cs" />
+    <Compile Include="Query\DataTransfer\NameOrdinalComparisonIntFilter.cs" />
+    <Compile Include="Query\DataTransfer\NameOrdinalComparisonLongFilter.cs" />
+    <Compile Include="Query\DataTransfer\NameStringComparisonAvailableValuesFilter.cs" />
+    <Compile Include="Query\DataTransfer\NameStringComparisonFilter.cs" />
+    <Compile Include="Query\DataTransfer\OrdinalComparison.cs" />
+    <Compile Include="Query\DataTransfer\OrdinalComparisonDateTimeFilter.cs" />
+    <Compile Include="Query\DataTransfer\OrdinalComparisonFilter.cs" />
+    <Compile Include="Query\DataTransfer\OrdinalComparisonIntFilter.cs" />
+    <Compile Include="Query\DataTransfer\OrdinalComparisonLongFilter.cs" />
+    <Compile Include="Query\DataTransfer\PercentValue.cs" />
+    <Compile Include="Query\DataTransfer\Problem.cs" />
+    <Compile Include="Query\DataTransfer\Run.cs" />
+    <Compile Include="Query\DataTransfer\StringComparison.cs" />
+    <Compile Include="Query\DataTransfer\StringComparisonAvailableValuesFilter.cs" />
+    <Compile Include="Query\DataTransfer\StringComparisonFilter.cs" />
+    <Compile Include="Query\DataTransfer\StringValue.cs" />
+    <Compile Include="Query\DataTransfer\Value.cs" />
+    <Compile Include="Query\Filters\AlgorithmClassNameFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\AlgorithmNameFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\AndFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\AlgorithmDataTypeNameFilter.cs" />
+    <Compile Include="Query\Filters\AlgorithmPlatformNameFilter.cs" />
+    <Compile Include="Query\Filters\BoolValueFilter.cs" />
+    <Compile Include="Query\Filters\BinaryValueFilter.cs" />
+    <Compile Include="Query\Filters\TimeSpanValueFilter.cs" />
+    <Compile Include="Query\Filters\PercentValueFilter.cs" />
+    <Compile Include="Query\Filters\StringValueFilter.cs" />
+    <Compile Include="Query\Filters\FloatValueFilter.cs" />
+    <Compile Include="Query\Filters\DoubleValueFilter.cs" />
+    <Compile Include="Query\Filters\LongValueFilter.cs" />
+    <Compile Include="Query\Filters\IntValueFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\ValueDataTypeNameFilter.cs" />
+    <Compile Include="Query\Filters\ProblemPlatformNameFilter.cs" />
+    <Compile Include="Query\Filters\ProblemDataTypeNameFilter.cs" />
+    <Compile Include="Query\Filters\IFilter.cs" />
+    <Compile Include="Query\Filters\OrFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\ProblemClassNameFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\ProblemNameFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\RunClientNameFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\RunCreatedDateFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\RunUserNameFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\Filters\ValueNameFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Query\IQueryService.cs" />
+    <Compile Include="Query\QueryService.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="RunCreation\Convert.cs" />
+    <Compile Include="RunCreation\DataTransfer\Algorithm.cs" />
+    <Compile Include="RunCreation\DataTransfer\AlgorithmClass.cs" />
+    <Compile Include="RunCreation\DataTransfer\BinaryValue.cs" />
+    <Compile Include="RunCreation\DataTransfer\BoolValue.cs" />
+    <Compile Include="RunCreation\DataTransfer\TimeSpanValue.cs" />
+    <Compile Include="RunCreation\DataTransfer\PercentValue.cs" />
+    <Compile Include="RunCreation\DataTransfer\DataType.cs" />
+    <Compile Include="RunCreation\DataTransfer\DoubleValue.cs" />
+    <Compile Include="RunCreation\DataTransfer\FloatValue.cs" />
+    <Compile Include="RunCreation\DataTransfer\IntValue.cs" />
+    <Compile Include="RunCreation\DataTransfer\LongValue.cs" />
+    <Compile Include="RunCreation\DataTransfer\Problem.cs" />
+    <Compile Include="RunCreation\DataTransfer\ProblemClass.cs" />
+    <Compile Include="RunCreation\DataTransfer\Run.cs" />
+    <Compile Include="RunCreation\DataTransfer\StringValue.cs" />
+    <Compile Include="RunCreation\DataTransfer\Value.cs" />
+    <Compile Include="RunCreation\RunCreationService.cs" />
+    <Compile Include="RunCreation\IRunCreationService.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="web.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{3259AA49-8AA1-44D3-9025-A0B520596A8C}" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Administration\AdministrationService.svc" />
+    <Content Include="Query\QueryService.svc" />
+    <Content Include="RunCreation\RunCreationService.svc" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.GeoIP\1.12\HeuristicLab.GeoIP.csproj">
+      <Project>{BE9B0229-9150-49A4-AEA6-BB58E055992F}</Project>
+      <Name>HeuristicLab.GeoIP</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Services.Access.DataAccess\3.3\HeuristicLab.Services.Access.DataAccess-3.3.csproj">
+      <Project>{0F652437-998A-4EAB-8BF1-444B5FE8CE97}</Project>
+      <Name>HeuristicLab.Services.Access.DataAccess-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Services.Access\3.3\HeuristicLab.Services.Access-3.3.csproj">
+      <Project>{9FAC0B23-2730-452A-9BA0-D7CA1746C541}</Project>
+      <Name>HeuristicLab.Services.Access-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Services.OKB.DataAccess\3.3\HeuristicLab.Services.OKB.DataAccess-3.3.csproj">
+      <Project>{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}</Project>
+      <Name>HeuristicLab.Services.OKB.DataAccess-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ProjectExtensions>
+    <VisualStudio>
+      <FlavorProperties GUID="{3D9AD99F-2412-4246-B90B-4EAA41C64699}">
+        <WcfProjectProperties>
+          <AutoStart>True</AutoStart>
+        </WcfProjectProperties>
+      </FlavorProperties>
+    </VisualStudio>
+  </ProjectExtensions>
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/OKBRoles.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/OKBRoles.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/OKBRoles.cs	(revision 8049)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Services.OKB {
+  public static class OKBRoles {
+    public const string OKBUser = "OKB User";
+    public const string OKBAdministrator = "OKB Administrator";
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Properties/AssemblyInfo.cs.frame	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Properties/AssemblyInfo.cs.frame	(revision 8049)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Services.OKB")]
+[assembly: AssemblyDescription("HeuristicLab OKB services")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2012 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("029c79a0-8bf0-460d-9499-3b3b9c7f1a93")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.6.$WCREV$")]
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Convert.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Convert.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Convert.cs	(revision 8049)
@@ -0,0 +1,91 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using DA = HeuristicLab.Services.OKB.DataAccess;
+using DT = HeuristicLab.Services.OKB.Query.DataTransfer;
+
+namespace HeuristicLab.Services.OKB.Query {
+  public static class Convert {
+    public static DT.Run ToDto(DA.Run source, bool includeBinaryValues) {
+      if (source == null) return null;
+      var dto = new DT.Run { Id = source.Id, Algorithm = Convert.ToDto(source.Algorithm), Problem = Convert.ToDto(source.Problem), CreatedDate = source.CreatedDate, ClientId = source.ClientId, UserId = source.UserId };
+      dto.ParameterValues = source.Values.Where(x => x.ValueName.Category == DA.ValueNameCategory.Parameter).Select(x => Convert.ToDto(x, includeBinaryValues)).ToArray();
+      dto.ResultValues = source.Values.Where(x => x.ValueName.Category == DA.ValueNameCategory.Result).Select(x => Convert.ToDto(x, includeBinaryValues)).ToArray();
+      return dto;
+    }
+
+    public static DT.Run ToDto(DA.Run source, bool includeBinaryValues, IEnumerable<DT.ValueName> valueNames) {
+      if (source == null) return null;
+      var dto = new DT.Run { Id = source.Id, Algorithm = Convert.ToDto(source.Algorithm), Problem = Convert.ToDto(source.Problem), CreatedDate = source.CreatedDate, ClientId = source.ClientId, UserId = source.UserId };
+      dto.ParameterValues = source.Values.Where(x => x.ValueName.Category == DA.ValueNameCategory.Parameter && valueNames.Count(y => y.Name == x.ValueName.Name) > 0).Select(x => Convert.ToDto(x, includeBinaryValues)).ToArray();
+      dto.ResultValues = source.Values.Where(x => x.ValueName.Category == DA.ValueNameCategory.Result && valueNames.Count(y => y.Name == x.ValueName.Name) > 0).Select(x => Convert.ToDto(x, includeBinaryValues)).ToArray();
+      return dto;
+    }
+
+    private static DT.Algorithm ToDto(DA.Algorithm source) {
+      if (source == null) return null;
+      return new DT.Algorithm { Name = source.Name, Description = source.Description, AlgorithmClass = source.AlgorithmClass.Name, Platform = source.Platform.Name, DataType = Convert.ToDto(source.DataType) };
+    }
+
+    private static DT.Problem ToDto(DA.Problem source) {
+      if (source == null) return null;
+      return new DT.Problem { Name = source.Name, Description = source.Description, ProblemClass = source.ProblemClass.Name, Platform = source.Platform.Name, DataType = Convert.ToDto(source.DataType) };
+    }
+
+    private static DT.DataType ToDto(DA.DataType source) {
+      if (source == null) return null;
+      return new DT.DataType { Name = source.Name, TypeName = source.TypeName };
+    }
+
+    private static DT.Value ToDto(DA.Value source, bool includeBinaryValues) {
+      if (source == null) return null;
+      if (source.ValueName.Type == DA.ValueNameType.Bool) {
+        return new DT.BoolValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.BoolValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.Int) {
+        return new DT.IntValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.IntValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.TimeSpan) {
+        return new DT.TimeSpanValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.LongValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.Long) {
+        return new DT.LongValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.LongValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.Float) {
+        return new DT.FloatValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.FloatValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.Double) {
+        return new DT.DoubleValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.DoubleValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.Percent) {
+        return new DT.PercentValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.DoubleValue.GetValueOrDefault() };
+      } else if (source.ValueName.Type == DA.ValueNameType.String) {
+        return new DT.StringValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = source.StringValue };
+      } else if (source.ValueName.Type == DA.ValueNameType.Binary) {
+        return new DT.BinaryValue { Name = source.ValueName.Name, DataType = Convert.ToDto(source.DataType), Value = includeBinaryValues ? source.BinaryData.Data.ToArray() : null };
+      } else {
+        throw new ArgumentException("Unknown value type.", "source");
+      }
+    }
+
+    public static DT.ValueName ToDto(DA.ValueName source) {
+      if (source == null) return null;
+      return new DT.ValueName() { Id = source.Id, Category = source.Category, Name = source.Name };
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Algorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Algorithm.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Algorithm.cs	(revision 8049)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class Algorithm {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string Description { get; set; }
+    [DataMember]
+    public string Platform { get; set; }
+    [DataMember]
+    public string AlgorithmClass { get; set; }
+    [DataMember]
+    public DataType DataType { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BinaryValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BinaryValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BinaryValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class BinaryValue : Value {
+    [DataMember]
+    public byte[] Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BoolValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BoolValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BoolValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class BoolValue : Value {
+    [DataMember]
+    public bool Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BooleanOperation.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BooleanOperation.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/BooleanOperation.cs	(revision 8049)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public enum BooleanOperation {
+    [EnumMember]
+    And,
+    [EnumMember]
+    Or
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/CombinedFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/CombinedFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/CombinedFilter.cs	(revision 8049)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class CombinedFilter : Filter {
+    [DataMember]
+    public BooleanOperation Operation { get; protected set; }
+    [DataMember]
+    public IEnumerable<Filter> Filters { get; set; }
+
+    public CombinedFilter(string filterTypeName, string label, BooleanOperation operation) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+      Operation = operation;
+      Filters = Enumerable.Empty<Filter>();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/DataType.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/DataType.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/DataType.cs	(revision 8049)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class DataType {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string TypeName { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/DoubleValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/DoubleValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/DoubleValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class DoubleValue : Value {
+    [DataMember]
+    public double Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparison.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparison.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparison.cs	(revision 8049)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public enum EqualityComparison {
+    [EnumMember]
+    Equal,
+    [EnumMember]
+    NotEqual
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparisonBoolFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparisonBoolFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparisonBoolFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class EqualityComparisonBoolFilter : EqualityComparisonFilter {
+    [DataMember]
+    public bool Value { get; set; }
+
+    public EqualityComparisonBoolFilter(string filterTypeName, string label) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparisonByteArrayFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparisonByteArrayFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparisonByteArrayFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class EqualityComparisonByteArrayFilter : EqualityComparisonFilter {
+    [DataMember]
+    public byte[] Value { get; set; }
+
+    public EqualityComparisonByteArrayFilter(string filterTypeName, string label) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparisonFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparisonFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/EqualityComparisonFilter.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public abstract class EqualityComparisonFilter : Filter {
+    [DataMember]
+    public EqualityComparison Comparison { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Filter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Filter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Filter.cs	(revision 8049)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  [KnownType(typeof(OrdinalComparisonDateTimeFilter))]
+  [KnownType(typeof(OrdinalComparisonIntFilter))]
+  [KnownType(typeof(OrdinalComparisonLongFilter))]
+  [KnownType(typeof(StringComparisonFilter))]
+  [KnownType(typeof(StringComparisonAvailableValuesFilter))]
+  [KnownType(typeof(NameEqualityComparisonBoolFilter))]
+  [KnownType(typeof(NameEqualityComparisonByteArrayFilter))]
+  [KnownType(typeof(NameOrdinalComparisonFloatFilter))]
+  [KnownType(typeof(NameOrdinalComparisonDoubleFilter))]
+  [KnownType(typeof(NameOrdinalComparisonPercentFilter))]
+  [KnownType(typeof(NameOrdinalComparisonIntFilter))]
+  [KnownType(typeof(NameOrdinalComparisonLongFilter))]
+  [KnownType(typeof(NameOrdinalComparisonTimeSpanFilter))]
+  [KnownType(typeof(NameStringComparisonFilter))]
+  [KnownType(typeof(NameStringComparisonAvailableValuesFilter))]
+  [KnownType(typeof(CombinedFilter))]
+  public abstract class Filter {
+    [DataMember]
+    public string FilterTypeName { get; protected set; }
+    [DataMember]
+    public string Label { get; protected set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/FloatValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/FloatValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/FloatValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class FloatValue : Value {
+    [DataMember]
+    public float Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/IntValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/IntValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/IntValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class IntValue : Value {
+    [DataMember]
+    public int Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/LongValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/LongValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/LongValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class LongValue : Value {
+    [DataMember]
+    public long Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameEqualityComparisonBoolFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameEqualityComparisonBoolFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameEqualityComparisonBoolFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class NameEqualityComparisonBoolFilter : EqualityComparisonBoolFilter {
+    [DataMember]
+    public string Name { get; protected set; }
+
+    public NameEqualityComparisonBoolFilter(string filterTypeName, string label, string name)
+      : base(filterTypeName, label) {
+      Name = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameEqualityComparisonByteArrayFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameEqualityComparisonByteArrayFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameEqualityComparisonByteArrayFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class NameEqualityComparisonByteArrayFilter : EqualityComparisonByteArrayFilter {
+    [DataMember]
+    public string Name { get; protected set; }
+
+    public NameEqualityComparisonByteArrayFilter(string filterTypeName, string label, string name)
+      : base(filterTypeName, label) {
+      Name = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonDoubleFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonDoubleFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonDoubleFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class NameOrdinalComparisonDoubleFilter : OrdinalComparisonDoubleFilter {
+    [DataMember]
+    public string Name { get; protected set; }
+
+    public NameOrdinalComparisonDoubleFilter(string filterTypeName, string label, string name)
+      : base(filterTypeName, label) {
+      Name = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonFloatFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonFloatFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonFloatFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class NameOrdinalComparisonFloatFilter : OrdinalComparisonFloatFilter {
+    [DataMember]
+    public string Name { get; protected set; }
+
+    public NameOrdinalComparisonFloatFilter(string filterTypeName, string label, string name)
+      : base(filterTypeName, label) {
+      Name = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonIntFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonIntFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonIntFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class NameOrdinalComparisonIntFilter : OrdinalComparisonIntFilter {
+    [DataMember]
+    public string Name { get; protected set; }
+
+    public NameOrdinalComparisonIntFilter(string filterTypeName, string label, string name)
+      : base(filterTypeName, label) {
+      Name = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonLongFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonLongFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonLongFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class NameOrdinalComparisonLongFilter : OrdinalComparisonLongFilter {
+    [DataMember]
+    public string Name { get; protected set; }
+
+    public NameOrdinalComparisonLongFilter(string filterTypeName, string label, string name)
+      : base(filterTypeName, label) {
+      Name = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonPercentFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonPercentFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonPercentFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class NameOrdinalComparisonPercentFilter : OrdinalComparisonPercentFilter {
+    [DataMember]
+    public string Name { get; protected set; }
+
+    public NameOrdinalComparisonPercentFilter(string filterTypeName, string label, string name)
+      : base(filterTypeName, label) {
+      Name = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonTimeSpanFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonTimeSpanFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameOrdinalComparisonTimeSpanFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class NameOrdinalComparisonTimeSpanFilter : OrdinalComparisonTimeSpanFilter {
+    [DataMember]
+    public string Name { get; protected set; }
+
+    public NameOrdinalComparisonTimeSpanFilter(string filterTypeName, string label, string name)
+      : base(filterTypeName, label) {
+      Name = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameStringComparisonAvailableValuesFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameStringComparisonAvailableValuesFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameStringComparisonAvailableValuesFilter.cs	(revision 8049)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class NameStringComparisonAvailableValuesFilter : StringComparisonAvailableValuesFilter {
+    [DataMember]
+    public string Name { get; protected set; }
+
+    public NameStringComparisonAvailableValuesFilter(string filterTypeName, string label, string name, IEnumerable<string> availableValues)
+      : base(filterTypeName, label, availableValues) {
+      Name = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameStringComparisonFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameStringComparisonFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/NameStringComparisonFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class NameStringComparisonFilter : StringComparisonFilter {
+    [DataMember]
+    public string Name { get; protected set; }
+
+    public NameStringComparisonFilter(string filterTypeName, string label, string name)
+      : base(filterTypeName, label) {
+      Name = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparison.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparison.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparison.cs	(revision 8049)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public enum OrdinalComparison {
+    [EnumMember]
+    Less,
+    [EnumMember]
+    LessOrEqual,
+    [EnumMember]
+    Equal,
+    [EnumMember]
+    GreaterOrEqual,
+    [EnumMember]
+    Greater,
+    [EnumMember]
+    NotEqual
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonDateTimeFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonDateTimeFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonDateTimeFilter.cs	(revision 8049)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class OrdinalComparisonDateTimeFilter : OrdinalComparisonFilter {
+    [DataMember]
+    public DateTime Value { get; set; }
+
+    public OrdinalComparisonDateTimeFilter(string filterTypeName, string label) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonDoubleFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonDoubleFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonDoubleFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class OrdinalComparisonDoubleFilter : OrdinalComparisonFilter {
+    [DataMember]
+    public double Value { get; set; }
+
+    public OrdinalComparisonDoubleFilter(string filterTypeName, string label) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonFilter.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class OrdinalComparisonFilter : Filter {
+    [DataMember]
+    public OrdinalComparison Comparison { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonFloatFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonFloatFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonFloatFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class OrdinalComparisonFloatFilter : OrdinalComparisonFilter {
+    [DataMember]
+    public float Value { get; set; }
+
+    public OrdinalComparisonFloatFilter(string filterTypeName, string label) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonIntFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonIntFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonIntFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class OrdinalComparisonIntFilter : OrdinalComparisonFilter {
+    [DataMember]
+    public int Value { get; set; }
+
+    public OrdinalComparisonIntFilter(string filterTypeName, string label) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonLongFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonLongFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonLongFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class OrdinalComparisonLongFilter : OrdinalComparisonFilter {
+    [DataMember]
+    public long Value { get; set; }
+
+    public OrdinalComparisonLongFilter(string filterTypeName, string label) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonPercentFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonPercentFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonPercentFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class OrdinalComparisonPercentFilter : OrdinalComparisonFilter {
+    [DataMember]
+    public double Value { get; set; }
+
+    public OrdinalComparisonPercentFilter(string filterTypeName, string label) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonTimeSpanFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonTimeSpanFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/OrdinalComparisonTimeSpanFilter.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class OrdinalComparisonTimeSpanFilter : OrdinalComparisonFilter {
+    [DataMember]
+    public long Value { get; set; }
+
+    public OrdinalComparisonTimeSpanFilter(string filterTypeName, string label) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/PercentValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/PercentValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/PercentValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class PercentValue : Value {
+    [DataMember]
+    public double Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Problem.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Problem.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Problem.cs	(revision 8049)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class Problem {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string Description { get; set; }
+    [DataMember]
+    public string Platform { get; set; }
+    [DataMember]
+    public string ProblemClass { get; set; }
+    [DataMember]
+    public DataType DataType { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Run.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Run.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Run.cs	(revision 8049)
@@ -0,0 +1,46 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class Run {
+    [DataMember]
+    public long Id { get; set; }
+    [DataMember]
+    public Algorithm Algorithm { get; set; }
+    [DataMember]
+    public Problem Problem { get; set; }
+    [DataMember]
+    public DateTime CreatedDate { get; set; }
+    [DataMember]
+    public Guid UserId { get; set; }
+    [DataMember]
+    public Guid ClientId { get; set; }
+    [DataMember]
+    public IEnumerable<Value> ParameterValues { get; set; }
+    [DataMember]
+    public IEnumerable<Value> ResultValues { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringComparison.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringComparison.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringComparison.cs	(revision 8049)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public enum StringComparison {
+    [EnumMember]
+    Equal,
+    [EnumMember]
+    NotEqual,
+    [EnumMember]
+    Contains,
+    [EnumMember]
+    NotContains,
+    [EnumMember]
+    Like,
+    [EnumMember]
+    NotLike
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringComparisonAvailableValuesFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringComparisonAvailableValuesFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringComparisonAvailableValuesFilter.cs	(revision 8049)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class StringComparisonAvailableValuesFilter : StringComparisonFilter {
+    [DataMember]
+    public IEnumerable<string> AvailableValues { get; protected set; }
+
+    public StringComparisonAvailableValuesFilter(string filterTypeName, string label, IEnumerable<string> availableValues)
+      : base(filterTypeName, label) {
+      AvailableValues = availableValues;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringComparisonFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringComparisonFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringComparisonFilter.cs	(revision 8049)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class StringComparisonFilter : Filter {
+    [DataMember]
+    public StringComparison Comparison { get; set; }
+    [DataMember]
+    public string Value { get; set; }
+
+    public StringComparisonFilter(string filterTypeName, string label) {
+      FilterTypeName = filterTypeName;
+      Label = label;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/StringValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class StringValue : Value {
+    [DataMember]
+    public string Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/TimeSpanValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/TimeSpanValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/TimeSpanValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class TimeSpanValue : Value {
+    [DataMember]
+    public long Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Value.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Value.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/Value.cs	(revision 8049)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  [KnownType(typeof(BoolValue))]
+  [KnownType(typeof(IntValue))]
+  [KnownType(typeof(LongValue))]
+  [KnownType(typeof(FloatValue))]
+  [KnownType(typeof(DoubleValue))]
+  [KnownType(typeof(StringValue))]
+  [KnownType(typeof(BinaryValue))]
+  [KnownType(typeof(PercentValue))]
+  [KnownType(typeof(TimeSpanValue))]
+  public abstract class Value {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public DataType DataType { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/ValueName.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/ValueName.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/DataTransfer/ValueName.cs	(revision 8049)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.DataTransfer {
+  [DataContract]
+  public class ValueName {
+    [DataMember]
+    public long Id { get; set; }
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public ValueNameCategory Category { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmClassNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmClassNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmClassNameFilter.cs	(revision 8049)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class AlgorithmClassNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Algorithm.AlgorithmClass.Name == Value;
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Algorithm.AlgorithmClass.Name != Value;
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Algorithm.AlgorithmClass.Name.Contains(Value);
+          case DataTransfer.StringComparison.NotContains:
+            return x => !x.Algorithm.AlgorithmClass.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Algorithm.AlgorithmClass.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Algorithm.AlgorithmClass.Name, Value);
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public AlgorithmClassNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public AlgorithmClassNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmDataTypeNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmDataTypeNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmDataTypeNameFilter.cs	(revision 8049)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class AlgorithmDataTypeNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Algorithm.DataType.Name == Value;
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Algorithm.DataType.Name != Value;
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Algorithm.DataType.Name.Contains(Value);
+          case DataTransfer.StringComparison.NotContains:
+            return x => !x.Algorithm.DataType.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Algorithm.DataType.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Algorithm.DataType.Name, Value);
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public AlgorithmDataTypeNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public AlgorithmDataTypeNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmNameFilter.cs	(revision 8049)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class AlgorithmNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Algorithm.Name == Value;
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Algorithm.Name != Value;
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Algorithm.Name.Contains(Value);
+          case DataTransfer.StringComparison.NotContains:
+            return x => !x.Algorithm.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Algorithm.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Algorithm.Name, Value);
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public AlgorithmNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public AlgorithmNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmPlatformNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmPlatformNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AlgorithmPlatformNameFilter.cs	(revision 8049)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class AlgorithmPlatformNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Algorithm.Platform.Name == Value;
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Algorithm.Platform.Name != Value;
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Algorithm.Platform.Name.Contains(Value);
+          case DataTransfer.StringComparison.NotContains:
+            return x => !x.Algorithm.Platform.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Algorithm.Platform.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Algorithm.Platform.Name, Value);
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public AlgorithmPlatformNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public AlgorithmPlatformNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AndFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AndFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/AndFilter.cs	(revision 8049)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class AndFilter : IFilter {
+    public List<IFilter> Filters { get; private set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        ParameterExpression parameter = System.Linq.Expressions.Expression.Parameter(typeof(Run));
+        Expression expr = System.Linq.Expressions.Expression.Constant(true);
+        foreach (IFilter filter in Filters)
+          expr = System.Linq.Expressions.Expression.AndAlso(expr, System.Linq.Expressions.Expression.Invoke(filter.Expression, parameter));
+        return System.Linq.Expressions.Expression.Lambda<Func<Run, bool>>(expr, parameter);
+      }
+    }
+
+    public AndFilter(IEnumerable<IFilter> filters) {
+      Filters = new List<IFilter>(filters);
+    }
+    public AndFilter(DataTransfer.CombinedFilter filter) {
+      Filters = new List<IFilter>(filter.Filters.Select(x => (IFilter)Activator.CreateInstance(Type.GetType(x.FilterTypeName), x)));
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/BinaryValueFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/BinaryValueFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/BinaryValueFilter.cs	(revision 8049)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class BinaryValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.EqualityComparison Comparison { get; set; }
+    public byte[] Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.EqualityComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.BinaryData.Data == Value));
+          case DataTransfer.EqualityComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.BinaryData.Data != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public BinaryValueFilter(string name, DataTransfer.EqualityComparison comparison, byte[] value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public BinaryValueFilter(DataTransfer.NameEqualityComparisonByteArrayFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/BoolValueFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/BoolValueFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/BoolValueFilter.cs	(revision 8049)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class BoolValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.EqualityComparison Comparison { get; set; }
+    public bool Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.EqualityComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.BoolValue == Value));
+          case DataTransfer.EqualityComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.BoolValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public BoolValueFilter(string name, DataTransfer.EqualityComparison comparison, bool value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public BoolValueFilter(DataTransfer.NameEqualityComparisonBoolFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/DoubleValueFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/DoubleValueFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/DoubleValueFilter.cs	(revision 8049)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class DoubleValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public double Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue < Value));
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue <= Value));
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue == Value));
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue >= Value));
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue > Value));
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public DoubleValueFilter(string name, DataTransfer.OrdinalComparison comparison, double value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public DoubleValueFilter(DataTransfer.NameOrdinalComparisonDoubleFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/FloatValueFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/FloatValueFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/FloatValueFilter.cs	(revision 8049)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class FloatValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public float Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue < Value));
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue <= Value));
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue == Value));
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue >= Value));
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue > Value));
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.FloatValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public FloatValueFilter(string name, DataTransfer.OrdinalComparison comparison, float value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public FloatValueFilter(DataTransfer.NameOrdinalComparisonFloatFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/IFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/IFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/IFilter.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public interface IFilter {
+    Expression<Func<Run, bool>> Expression { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/IntValueFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/IntValueFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/IntValueFilter.cs	(revision 8049)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class IntValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public int Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue < Value));
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue <= Value));
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue == Value));
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue >= Value));
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue > Value));
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.IntValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public IntValueFilter(string name, DataTransfer.OrdinalComparison comparison, int value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public IntValueFilter(DataTransfer.NameOrdinalComparisonIntFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/LongValueFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/LongValueFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/LongValueFilter.cs	(revision 8049)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class LongValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public long Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue < Value));
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue <= Value));
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue == Value));
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue >= Value));
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue > Value));
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public LongValueFilter(string name, DataTransfer.OrdinalComparison comparison, long value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public LongValueFilter(DataTransfer.NameOrdinalComparisonLongFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/OrFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/OrFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/OrFilter.cs	(revision 8049)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class OrFilter : IFilter {
+    public List<IFilter> Filters { get; private set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        ParameterExpression parameter = System.Linq.Expressions.Expression.Parameter(typeof(Run));
+        Expression expr = System.Linq.Expressions.Expression.Constant(false);
+        foreach (IFilter filter in Filters)
+          expr = System.Linq.Expressions.Expression.OrElse(expr, System.Linq.Expressions.Expression.Invoke(filter.Expression, parameter));
+        return System.Linq.Expressions.Expression.Lambda<Func<Run, bool>>(expr, parameter);
+      }
+    }
+
+    public OrFilter(IEnumerable<IFilter> filters) {
+      Filters = new List<IFilter>(filters);
+    }
+    public OrFilter(DataTransfer.CombinedFilter filter) {
+      Filters = new List<IFilter>(filter.Filters.Select(x => (IFilter)Activator.CreateInstance(Type.GetType(x.FilterTypeName), x)));
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/PercentValueFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/PercentValueFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/PercentValueFilter.cs	(revision 8049)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class PercentValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public double Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue < Value));
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue <= Value));
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue == Value));
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue >= Value));
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue > Value));
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.DoubleValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public PercentValueFilter(string name, DataTransfer.OrdinalComparison comparison, double value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public PercentValueFilter(DataTransfer.NameOrdinalComparisonPercentFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemClassNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemClassNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemClassNameFilter.cs	(revision 8049)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class ProblemClassNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Problem.ProblemClass.Name == Value;
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Problem.ProblemClass.Name != Value;
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Problem.ProblemClass.Name.Contains(Value);
+          case DataTransfer.StringComparison.NotContains:
+            return x => !x.Problem.ProblemClass.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Problem.ProblemClass.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Problem.ProblemClass.Name, Value);
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public ProblemClassNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public ProblemClassNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemDataTypeNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemDataTypeNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemDataTypeNameFilter.cs	(revision 8049)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class ProblemDataTypeNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Problem.DataType.Name == Value;
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Problem.DataType.Name != Value;
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Problem.DataType.Name.Contains(Value);
+          case DataTransfer.StringComparison.NotContains:
+            return x => !x.Problem.DataType.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Problem.DataType.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Problem.DataType.Name, Value);
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public ProblemDataTypeNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public ProblemDataTypeNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemNameFilter.cs	(revision 8049)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class ProblemNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Problem.Name == Value;
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Problem.Name != Value;
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Problem.Name.Contains(Value);
+          case DataTransfer.StringComparison.NotContains:
+            return x => !x.Problem.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Problem.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Problem.Name, Value);
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public ProblemNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public ProblemNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemPlatformNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemPlatformNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ProblemPlatformNameFilter.cs	(revision 8049)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class ProblemPlatformNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Problem.Platform.Name == Value;
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Problem.Platform.Name != Value;
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Problem.Platform.Name.Contains(Value);
+          case DataTransfer.StringComparison.NotContains:
+            return x => !x.Problem.Platform.Name.Contains(Value);
+          case DataTransfer.StringComparison.Like:
+            return x => SqlMethods.Like(x.Problem.Platform.Name, Value);
+          case DataTransfer.StringComparison.NotLike:
+            return x => !SqlMethods.Like(x.Problem.Platform.Name, Value);
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public ProblemPlatformNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public ProblemPlatformNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/RunClientNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/RunClientNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/RunClientNameFilter.cs	(revision 8049)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class RunClientNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.NotEqual:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.Contains:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.NotContains:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.Like:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.NotLike:
+            throw new NotSupportedException();
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public RunClientNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public RunClientNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/RunCreatedDateFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/RunCreatedDateFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/RunCreatedDateFilter.cs	(revision 8049)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class RunCreatedDateFilter : IFilter {
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public DateTime Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.CreatedDate < Value;
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.CreatedDate <= Value;
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.CreatedDate == Value;
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.CreatedDate >= Value;
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.CreatedDate > Value;
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.CreatedDate != Value;
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public RunCreatedDateFilter(DataTransfer.OrdinalComparison comparison, DateTime value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public RunCreatedDateFilter(DataTransfer.OrdinalComparisonDateTimeFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/RunUserNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/RunUserNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/RunUserNameFilter.cs	(revision 8049)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class RunUserNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.NotEqual:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.Contains:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.NotContains:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.Like:
+            throw new NotSupportedException();
+          case DataTransfer.StringComparison.NotLike:
+            throw new NotSupportedException();
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public RunUserNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public RunUserNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/StringValueFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/StringValueFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/StringValueFilter.cs	(revision 8049)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class StringValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.StringValue == Value));
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.StringValue != Value));
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && y.StringValue.Contains(Value));
+          case DataTransfer.StringComparison.NotContains:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && !y.StringValue.Contains(Value));
+          case DataTransfer.StringComparison.Like:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && SqlMethods.Like(y.StringValue, Value));
+          case DataTransfer.StringComparison.NotLike:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && !SqlMethods.Like(y.StringValue, Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public StringValueFilter(string name, DataTransfer.StringComparison comparison, string value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public StringValueFilter(DataTransfer.NameStringComparisonFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/TimeSpanValueFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/TimeSpanValueFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/TimeSpanValueFilter.cs	(revision 8049)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class TimeSpanValueFilter : IFilter {
+    public string Name { get; protected set; }
+    public DataTransfer.OrdinalComparison Comparison { get; set; }
+    public long Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.OrdinalComparison.Less:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue < Value));
+          case DataTransfer.OrdinalComparison.LessOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue <= Value));
+          case DataTransfer.OrdinalComparison.Equal:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue == Value));
+          case DataTransfer.OrdinalComparison.GreaterOrEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue >= Value));
+          case DataTransfer.OrdinalComparison.Greater:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue > Value));
+          case DataTransfer.OrdinalComparison.NotEqual:
+            return x => x.Values.Any(y => (y.ValueName.Name == Name) && (y.LongValue != Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public TimeSpanValueFilter(string name, DataTransfer.OrdinalComparison comparison, long value) {
+      Name = name;
+      Comparison = comparison;
+      Value = value;
+    }
+    public TimeSpanValueFilter(DataTransfer.NameOrdinalComparisonTimeSpanFilter filter) {
+      Name = filter.Name;
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueDataTypeNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueDataTypeNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueDataTypeNameFilter.cs	(revision 8049)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class ValueDataTypeNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Values.Any(y => y.DataType.Name == Value);
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Values.All(y => y.DataType.Name != Value);
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Values.Any(y => y.DataType.Name.Contains(Value));
+          case DataTransfer.StringComparison.NotContains:
+            return x => x.Values.All(y => !y.DataType.Name.Contains(Value));
+          case DataTransfer.StringComparison.Like:
+            return x => x.Values.Any(y => SqlMethods.Like(y.DataType.Name, Value));
+          case DataTransfer.StringComparison.NotLike:
+            return x => x.Values.All(y => !SqlMethods.Like(y.DataType.Name, Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public ValueDataTypeNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public ValueDataTypeNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueNameFilter.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueNameFilter.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/Filters/ValueNameFilter.cs	(revision 8049)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq.SqlClient;
+using System.Linq;
+using System.Linq.Expressions;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.Query.Filters {
+  public class ValueNameFilter : IFilter {
+    public DataTransfer.StringComparison Comparison { get; set; }
+    public string Value { get; set; }
+
+    public Expression<Func<Run, bool>> Expression {
+      get {
+        switch (Comparison) {
+          case DataTransfer.StringComparison.Equal:
+            return x => x.Values.Any(y => y.ValueName.Name == Value);
+          case DataTransfer.StringComparison.NotEqual:
+            return x => x.Values.All(y => y.ValueName.Name != Value);
+          case DataTransfer.StringComparison.Contains:
+            return x => x.Values.Any(y => y.ValueName.Name.Contains(Value));
+          case DataTransfer.StringComparison.NotContains:
+            return x => x.Values.All(y => !y.ValueName.Name.Contains(Value));
+          case DataTransfer.StringComparison.Like:
+            return x => x.Values.Any(y => SqlMethods.Like(y.ValueName.Name, Value));
+          case DataTransfer.StringComparison.NotLike:
+            return x => x.Values.All(y => !SqlMethods.Like(y.ValueName.Name, Value));
+          default:
+            return x => true;
+        }
+      }
+    }
+
+    public ValueNameFilter(DataTransfer.StringComparison comparison, string value) {
+      Comparison = comparison;
+      Value = value;
+    }
+    public ValueNameFilter(DataTransfer.StringComparisonFilter filter) {
+      Comparison = filter.Comparison;
+      Value = filter.Value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/IQueryService.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/IQueryService.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/IQueryService.cs	(revision 8049)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Net.Security;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.Query.DataTransfer;
+
+namespace HeuristicLab.Services.OKB.Query {
+  /// <summary>
+  /// Interface of the OKB query service.
+  /// </summary>
+  [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+  public interface IQueryService {
+    [OperationContract]
+    IEnumerable<Filter> GetFilters();
+
+    [OperationContract]
+    long GetNumberOfRuns(Filter filter);
+
+    [OperationContract]
+    IEnumerable<long> GetRunIds(Filter filter);
+
+    [OperationContract]
+    IEnumerable<Run> GetRuns(IEnumerable<long> ids, bool includeBinaryValues);
+
+    [OperationContract]
+    IEnumerable<Run> GetRunsWithValues(IEnumerable<long> ids, bool includeBinaryValues, IEnumerable<DataTransfer.ValueName> valueNames);
+
+    [OperationContract]
+    IEnumerable<ValueName> GetValueNames();
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/QueryService.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/QueryService.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/QueryService.cs	(revision 8049)
@@ -0,0 +1,331 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Data.Linq;
+using System.Linq;
+using System.ServiceModel;
+using HeuristicLab.Services.Access;
+using HeuristicLab.Services.OKB.DataAccess;
+using HeuristicLab.Services.OKB.Query.DataTransfer;
+using HeuristicLab.Services.OKB.Query.Filters;
+
+namespace HeuristicLab.Services.OKB.Query {
+  /// <summary>
+  /// Implementation of the OKB query service (interface <see cref="IQueryService"/>).
+  /// </summary>
+  [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
+  public class QueryService : IQueryService {
+    IRoleVerifier roleVerifier = AccessServiceLocator.Instance.RoleVerifier;
+    IUserManager userManager = AccessServiceLocator.Instance.UserManager;
+
+    public IEnumerable<Filter> GetFilters() {
+      List<Filter> filters = new List<Filter>();
+      using (OKBDataContext okb = new OKBDataContext()) {
+        #region Run Filters
+        filters.Add(new OrdinalComparisonDateTimeFilter(typeof(RunCreatedDateFilter).AssemblyQualifiedName, "Run Created Date"));
+        filters.Add(new StringComparisonFilter(typeof(RunUserNameFilter).AssemblyQualifiedName, "Run User Name"));
+        filters.Add(new StringComparisonFilter(typeof(RunClientNameFilter).AssemblyQualifiedName, "Run Client Name"));
+        #endregion
+
+        #region Parameter Filters
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ValueNameFilter).AssemblyQualifiedName,
+          "Parameter Name",
+          okb.ValueNames.Where(x => x.Category == ValueNameCategory.Parameter).Select(x => x.Name).Distinct().ToArray()
+        ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
+          filters.Add(new NameStringComparisonAvailableValuesFilter(
+            typeof(ValueDataTypeNameFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value Data Type Name",
+            name,
+            okb.Values.Where(x => (x.ValueName.Name == name) && (x.ValueName.Category == ValueNameCategory.Parameter) && (x.ValueName.Type == ValueNameType.Binary)).Select(x => x.DataType.Name).Distinct().ToArray()
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Bool)).Select(x => x.Name).Distinct())
+          filters.Add(new NameEqualityComparisonBoolFilter(
+            typeof(BoolValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Int)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonIntFilter(
+            typeof(IntValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Long)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonLongFilter(
+            typeof(LongValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.TimeSpan)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonTimeSpanFilter(
+            typeof(TimeSpanValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Float)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonFloatFilter(
+            typeof(FloatValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Double)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonDoubleFilter(
+            typeof(DoubleValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Percent)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonPercentFilter(
+            typeof(PercentValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.String)).Select(x => x.Name).Distinct())
+          filters.Add(new NameStringComparisonFilter(
+            typeof(StringValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
+          filters.Add(new NameEqualityComparisonByteArrayFilter(
+            typeof(BinaryValueFilter).AssemblyQualifiedName,
+            "Parameter " + name + " Value",
+            name
+          ));
+        #endregion
+
+        #region Result Filters
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ValueNameFilter).AssemblyQualifiedName,
+          "Result Name",
+          okb.ValueNames.Where(x => x.Category == ValueNameCategory.Result).Select(x => x.Name).Distinct().ToArray()
+        ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
+          filters.Add(new NameStringComparisonAvailableValuesFilter(
+            typeof(ValueDataTypeNameFilter).AssemblyQualifiedName,
+            "Result " + name + " Value Data Type Name",
+            name,
+            okb.Values.Where(x => (x.ValueName.Name == name) && (x.ValueName.Category == ValueNameCategory.Result) && (x.ValueName.Type == ValueNameType.Binary)).Select(x => x.DataType.Name).Distinct().ToArray()
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Bool)).Select(x => x.Name).Distinct())
+          filters.Add(new NameEqualityComparisonBoolFilter(
+            typeof(BoolValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Int)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonIntFilter(
+            typeof(IntValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Long)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonLongFilter(
+            typeof(LongValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.TimeSpan)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonTimeSpanFilter(
+            typeof(TimeSpanValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Float)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonFloatFilter(
+            typeof(FloatValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Double)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonDoubleFilter(
+            typeof(DoubleValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Percent)).Select(x => x.Name).Distinct())
+          filters.Add(new NameOrdinalComparisonPercentFilter(
+            typeof(PercentValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.String)).Select(x => x.Name).Distinct())
+          filters.Add(new NameStringComparisonFilter(
+            typeof(StringValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
+          filters.Add(new NameEqualityComparisonByteArrayFilter(
+            typeof(BinaryValueFilter).AssemblyQualifiedName,
+            "Result " + name + " Value",
+            name
+          ));
+        #endregion
+
+        #region Algorithm Filters
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(AlgorithmNameFilter).AssemblyQualifiedName,
+          "Algorithm Name",
+          okb.Algorithms.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(AlgorithmClassNameFilter).AssemblyQualifiedName,
+          "Algorithm Class Name",
+          okb.AlgorithmClasses.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(AlgorithmPlatformNameFilter).AssemblyQualifiedName,
+          "Algorithm Platform Name",
+          okb.Platforms.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(AlgorithmDataTypeNameFilter).AssemblyQualifiedName,
+          "Algorithm Data Type Name",
+          okb.Algorithms.Select(x => x.DataType.Name).Distinct().ToArray()
+        ));
+        #endregion
+
+        #region Problem Filters
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ProblemNameFilter).AssemblyQualifiedName,
+          "Problem Name",
+          okb.Problems.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ProblemClassNameFilter).AssemblyQualifiedName,
+          "Problem Class Name",
+          okb.ProblemClasses.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ProblemPlatformNameFilter).AssemblyQualifiedName,
+          "Problem Platform Name",
+          okb.Platforms.Select(x => x.Name).Distinct().ToArray()
+        ));
+        filters.Add(new StringComparisonAvailableValuesFilter(
+          typeof(ProblemDataTypeNameFilter).AssemblyQualifiedName,
+          "Problem Data Type Name",
+          okb.Problems.Select(x => x.DataType.Name).Distinct().ToArray()
+        ));
+        #endregion
+
+        #region Combined Filters
+        filters.Add(new CombinedFilter(typeof(AndFilter).AssemblyQualifiedName, "AND", BooleanOperation.And));
+        filters.Add(new CombinedFilter(typeof(OrFilter).AssemblyQualifiedName, "OR", BooleanOperation.Or));
+        #endregion
+      }
+      return filters.OrderBy(x => x.Label);
+    }
+
+    public long GetNumberOfRuns(Filter filter) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return FilterRuns(okb.Runs, filter, okb).LongCount();
+      }
+    }
+
+    public IEnumerable<long> GetRunIds(Filter filter) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return FilterRuns(okb.Runs, filter, okb).Select(x => x.Id).ToArray();
+      }
+    }
+
+    public IEnumerable<DataTransfer.Run> GetRuns(IEnumerable<long> ids, bool includeBinaryValues) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        // TODO: specify LoadWiths
+        okb.LoadOptions = dlo;
+
+        return FilterUnauthorizedRuns(okb.Runs.Where(x => ids.Contains(x.Id)).ToList(), okb).Select(x => Convert.ToDto(x, includeBinaryValues)).ToArray();
+      }
+    }
+
+    public IEnumerable<DataTransfer.Run> GetRunsWithValues(IEnumerable<long> ids, bool includeBinaryValues, IEnumerable<DataTransfer.ValueName> valueNames) {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        // TODO: specify LoadWiths
+        okb.LoadOptions = dlo;
+
+        return FilterUnauthorizedRuns(okb.Runs.Where(x => ids.Contains(x.Id)).ToList(), okb).Select(x => Convert.ToDto(x, includeBinaryValues, valueNames)).ToArray();
+      }
+    }
+
+    public IEnumerable<DataTransfer.ValueName> GetValueNames() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        return okb.ValueNames.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+
+    private List<DataAccess.Run> FilterRuns(IQueryable<DataAccess.Run> runs, Filter filter, OKBDataContext okb) {
+      IFilter f = (IFilter)Activator.CreateInstance(Type.GetType(filter.FilterTypeName), filter);
+
+      var query = runs.Where(f.Expression);
+      List<DataAccess.Run> results = new List<DataAccess.Run>();
+
+      if (roleVerifier.IsInRole(OKBRoles.OKBAdministrator)) {
+        results.AddRange(query);
+      } else {
+        foreach (DataAccess.Run r in query) {
+          if (IsAuthorizedForAlgorithm(r.AlgorithmId, okb) && IsAuthorizedForProblem(r.ProblemId, okb)) {
+            results.Add(r);
+          }
+        }
+      }
+      return results;
+    }
+
+    private List<DataAccess.Run> FilterUnauthorizedRuns(List<DataAccess.Run> runs, OKBDataContext okb) {
+      List<DataAccess.Run> results = new List<DataAccess.Run>();
+
+      if (roleVerifier.IsInRole(OKBRoles.OKBAdministrator)) {
+        results.AddRange(runs);
+      } else {
+        foreach (DataAccess.Run r in runs) {
+          if (IsAuthorizedForAlgorithm(r.AlgorithmId, okb) && IsAuthorizedForProblem(r.ProblemId, okb)) {
+            results.Add(r);
+          }
+        }
+      }
+      return results;
+    }
+
+    private bool IsAuthorizedForAlgorithm(long algorithmId, OKBDataContext okb) {
+      var algUsers = okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId).Select(x => x.UserGroupId).ToList();
+
+      if (algUsers.Count == 0 || userManager.VerifyUser(userManager.CurrentUserId, algUsers)) {
+        return true;
+      }
+      return false;
+    }
+
+    private bool IsAuthorizedForProblem(long problemId, OKBDataContext okb) {
+      var problemUsers = okb.ProblemUsers.Where(x => x.ProblemId == problemId).Select(x => x.UserGroupId).ToList();
+
+      if (problemUsers.Count == 0 || userManager.VerifyUser(userManager.CurrentUserId, problemUsers)) {
+        return true;
+      }
+      return false;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/Query/QueryService.svc
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/Query/QueryService.svc	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/Query/QueryService.svc	(revision 8049)
@@ -0,0 +1,1 @@
+<%@ServiceHost language=c# Debug="true" Service="HeuristicLab.Services.OKB.Query.QueryService"%>
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/Convert.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/Convert.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/Convert.cs	(revision 8049)
@@ -0,0 +1,147 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Cryptography;
+using DA = HeuristicLab.Services.OKB.DataAccess;
+using DT = HeuristicLab.Services.OKB.RunCreation.DataTransfer;
+
+namespace HeuristicLab.Services.OKB.RunCreation {
+  public static class Convert {
+    #region ToDto
+    public static DT.Algorithm ToDto(DA.Algorithm source) {
+      if (source == null) return null;
+      return new DT.Algorithm { Id = source.Id, Name = source.Name, Description = source.Description, AlgorithmClass = Convert.ToDto(source.AlgorithmClass), DataType = Convert.ToDto(source.DataType) };
+    }
+
+    public static DT.Problem ToDto(DA.Problem source) {
+      if (source == null) return null;
+      return new DT.Problem { Id = source.Id, Name = source.Name, Description = source.Description, ProblemClass = Convert.ToDto(source.ProblemClass), DataType = Convert.ToDto(source.DataType) };
+    }
+
+    private static DT.DataType ToDto(DA.DataType source) {
+      if (source == null) return null;
+      return new DT.DataType { Name = source.Name, TypeName = source.TypeName };
+    }
+
+    private static DT.AlgorithmClass ToDto(DA.AlgorithmClass source) {
+      if (source == null) return null;
+      return new DT.AlgorithmClass { Name = source.Name, Description = source.Description };
+    }
+
+    private static DT.ProblemClass ToDto(DA.ProblemClass source) {
+      if (source == null) return null;
+      return new DT.ProblemClass { Name = source.Name, Description = source.Description };
+    }
+    #endregion
+
+    #region ToEntity
+    public static DA.Run ToEntity(DT.Run source, DA.OKBDataContext okb) {
+      if (source == null) return null;
+
+      List<DA.BinaryData> binCache = new List<DA.BinaryData>();
+
+      DA.Run entity = new DA.Run { Id = 0, AlgorithmId = source.AlgorithmId, ProblemId = source.ProblemId, CreatedDate = source.CreatedDate, UserId = source.UserId, ClientId = source.ClientId };
+      foreach (var value in source.ParameterValues)
+        entity.Values.Add(Convert.ToEntity(value, entity, DA.ValueNameCategory.Parameter, okb, binCache));
+      foreach (var value in source.ResultValues)
+        entity.Values.Add(Convert.ToEntity(value, entity, DA.ValueNameCategory.Result, okb, binCache));
+      return entity;
+    }
+
+    private static DA.Value ToEntity(DT.Value source, DA.Run run, DA.ValueNameCategory category, DA.OKBDataContext okb, List<DA.BinaryData> binCache) {
+      if (source == null) return null;
+      var entity = new DA.Value();
+      entity.Run = run;
+      entity.DataType = Convert.ToEntity(source.DataType, okb);
+      if (source is DT.BoolValue) {
+        entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Bool, okb);
+        entity.BoolValue = ((DT.BoolValue)source).Value;
+      } else if (source is DT.IntValue) {
+        entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Int, okb);
+        entity.IntValue = ((DT.IntValue)source).Value;
+      } else if (source is DT.TimeSpanValue) {
+        entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.TimeSpan, okb);
+        entity.LongValue = ((DT.TimeSpanValue)source).Value;
+      } else if (source is DT.LongValue) {
+        entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Long, okb);
+        entity.LongValue = ((DT.LongValue)source).Value;
+      } else if (source is DT.FloatValue) {
+        entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Float, okb);
+        entity.FloatValue = ((DT.FloatValue)source).Value;
+      } else if (source is DT.DoubleValue) {
+        entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Double, okb);
+        entity.DoubleValue = ((DT.DoubleValue)source).Value;
+      } else if (source is DT.PercentValue) {
+        entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Percent, okb);
+        entity.DoubleValue = ((DT.PercentValue)source).Value;
+      } else if (source is DT.StringValue) {
+        entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.String, okb);
+        entity.StringValue = ((DT.StringValue)source).Value;
+      } else if (source is DT.BinaryValue) {
+        entity.ValueName = Convert.ToEntity(source.Name, category, DA.ValueNameType.Binary, okb);
+        entity.BinaryData = Convert.ToEntity(((DT.BinaryValue)source).Value, okb, binCache);
+      } else {
+        throw new ArgumentException("Unknown value type.", "source");
+      }
+      return entity;
+    }
+
+    private static DA.DataType ToEntity(DT.DataType source, DA.OKBDataContext okb) {
+      if (source == null) return null;
+      var entity = okb.DataTypes.Where(x => (x.Name == source.Name) && (x.TypeName == source.TypeName)).FirstOrDefault();
+      if (entity == null)
+        entity = new DA.DataType() { Id = 0, Name = source.Name, TypeName = source.TypeName };
+      return entity;
+    }
+
+    private static DA.ValueName ToEntity(string name, DA.ValueNameCategory category, DA.ValueNameType type, DA.OKBDataContext okb) {
+      if (string.IsNullOrEmpty(name)) return null;
+      var entity = okb.ValueNames.Where(x => (x.Name == name) && (x.Category == category) && (x.Type == type)).FirstOrDefault();
+      if (entity == null)
+        entity = new DA.ValueName() { Id = 0, Name = name, Category = category, Type = type };
+      return entity;
+    }
+
+    private static DA.BinaryData ToEntity(byte[] data, DA.OKBDataContext okb, List<DA.BinaryData> binCache) {
+      if (data == null) return null;
+      byte[] hash;
+      using (SHA1 sha1 = SHA1.Create()) {
+        hash = sha1.ComputeHash(data);
+      }
+
+      var cachedBinaryData = binCache.Where(x => x.Hash.SequenceEqual(hash)).FirstOrDefault();
+      if (cachedBinaryData != null)
+        return cachedBinaryData;
+
+      var entity = okb.BinaryDatas.Where(x => x.Hash.Equals(hash)).FirstOrDefault();
+      if (entity == null) {
+        entity = new DA.BinaryData() { Id = 0, Data = data, Hash = hash };
+        binCache.Add(entity);
+      }
+
+      return entity;
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Algorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Algorithm.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Algorithm.cs	(revision 8049)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class Algorithm {
+    [DataMember]
+    public long Id { get; set; }
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string Description { get; set; }
+    [DataMember]
+    public AlgorithmClass AlgorithmClass { get; set; }
+    [DataMember]
+    public DataType DataType { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/AlgorithmClass.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/AlgorithmClass.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/AlgorithmClass.cs	(revision 8049)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class AlgorithmClass {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string Description { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/BinaryValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/BinaryValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/BinaryValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class BinaryValue : Value {
+    [DataMember]
+    public byte[] Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/BoolValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/BoolValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/BoolValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class BoolValue : Value {
+    [DataMember]
+    public bool Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/DataType.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/DataType.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/DataType.cs	(revision 8049)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class DataType {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string TypeName { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/DoubleValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/DoubleValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/DoubleValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class DoubleValue : Value {
+    [DataMember]
+    public double Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/FloatValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/FloatValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/FloatValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class FloatValue : Value {
+    [DataMember]
+    public float Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/IntValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/IntValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/IntValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class IntValue : Value {
+    [DataMember]
+    public int Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/LongValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/LongValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/LongValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class LongValue : Value {
+    [DataMember]
+    public long Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/PercentValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/PercentValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/PercentValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class PercentValue : Value {
+    [DataMember]
+    public double Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Problem.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Problem.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Problem.cs	(revision 8049)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class Problem {
+    [DataMember]
+    public long Id { get; set; }
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string Description { get; set; }
+    [DataMember]
+    public ProblemClass ProblemClass { get; set; }
+    [DataMember]
+    public DataType DataType { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/ProblemClass.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/ProblemClass.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/ProblemClass.cs	(revision 8049)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class ProblemClass {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public string Description { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Run.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Run.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Run.cs	(revision 8049)
@@ -0,0 +1,44 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class Run {
+    [DataMember]
+    public long AlgorithmId { get; set; }
+    [DataMember]
+    public long ProblemId { get; set; }
+    [DataMember]
+    public DateTime CreatedDate { get; set; }
+    [DataMember]
+    public Guid UserId { get; set; }
+    [DataMember]
+    public Guid ClientId { get; set; }
+    [DataMember]
+    public IEnumerable<Value> ParameterValues { get; set; }
+    [DataMember]
+    public IEnumerable<Value> ResultValues { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/StringValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/StringValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/StringValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class StringValue : Value {
+    [DataMember]
+    public string Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/TimeSpanValue.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/TimeSpanValue.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/TimeSpanValue.cs	(revision 8049)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  public class TimeSpanValue : Value {
+    [DataMember]
+    public long Value { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Value.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Value.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/DataTransfer/Value.cs	(revision 8049)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Services.OKB.RunCreation.DataTransfer {
+  [DataContract]
+  [KnownType(typeof(BoolValue))]
+  [KnownType(typeof(IntValue))]
+  [KnownType(typeof(LongValue))]
+  [KnownType(typeof(FloatValue))]
+  [KnownType(typeof(DoubleValue))]
+  [KnownType(typeof(StringValue))]
+  [KnownType(typeof(BinaryValue))]
+  [KnownType(typeof(PercentValue))]
+  [KnownType(typeof(TimeSpanValue))]
+  public abstract class Value {
+    [DataMember]
+    public string Name { get; set; }
+    [DataMember]
+    public DataType DataType { get; set; }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/IRunCreationService.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/IRunCreationService.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/IRunCreationService.cs	(revision 8049)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Net.Security;
+using System.ServiceModel;
+using HeuristicLab.Services.OKB.RunCreation.DataTransfer;
+
+namespace HeuristicLab.Services.OKB.RunCreation {
+  /// <summary>
+  /// Interface of the OKB run creation service.
+  /// </summary>
+  [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
+  public interface IRunCreationService {
+    [OperationContract]
+    IEnumerable<Algorithm> GetAlgorithms(string platformName);
+
+    [OperationContract]
+    byte[] GetAlgorithmData(long algorithmId);
+
+    [OperationContract]
+    IEnumerable<Problem> GetProblems(string platformName);
+
+    [OperationContract]
+    byte[] GetProblemData(long problemId);
+
+    [OperationContract]
+    void AddRun(Run run);
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/RunCreationService.cs
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/RunCreationService.cs	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/RunCreationService.cs	(revision 8049)
@@ -0,0 +1,138 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Data.Linq;
+using System.Linq;
+using System.ServiceModel;
+using HeuristicLab.Services.Access;
+using HeuristicLab.Services.OKB.DataAccess;
+
+namespace HeuristicLab.Services.OKB.RunCreation {
+  /// <summary>
+  /// Implementation of the OKB run creation service (interface <see cref="IRunCreationService"/>).
+  /// </summary>
+  [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
+  public class RunCreationService : IRunCreationService {
+    IRoleVerifier roleVerifier = AccessServiceLocator.Instance.RoleVerifier;
+    IUserManager userManager = AccessServiceLocator.Instance.UserManager;
+
+    public IEnumerable<DataTransfer.Algorithm> GetAlgorithms(string platformName) {
+      roleVerifier.AuthenticateForAnyRole(OKBRoles.OKBAdministrator, OKBRoles.OKBUser);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<Algorithm>(x => x.AlgorithmClass);
+        dlo.LoadWith<Algorithm>(x => x.DataType);
+        dlo.LoadWith<Algorithm>(x => x.AlgorithmUsers);
+        okb.LoadOptions = dlo;
+
+        var query = okb.Algorithms.Where(x => x.Platform.Name == platformName);
+        List<Algorithm> results = new List<Algorithm>();
+
+        if (roleVerifier.IsInRole(OKBRoles.OKBAdministrator)) {
+          results.AddRange(query);
+        } else {
+          foreach (var alg in query) {
+            if (alg.AlgorithmUsers.Count() == 0 || userManager.VerifyUser(userManager.CurrentUserId, alg.AlgorithmUsers.Select(y => y.UserGroupId).ToList())) {
+              results.Add(alg);
+            }
+          }
+        }
+        return results.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+
+    public byte[] GetAlgorithmData(long algorithmId) {
+      roleVerifier.AuthenticateForAnyRole(OKBRoles.OKBAdministrator, OKBRoles.OKBUser);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var result = okb.Algorithms.Where(x => x.Id == algorithmId).Select(x => x.BinaryData.Data.ToArray()).FirstOrDefault();
+
+        if (roleVerifier.IsInRole(OKBRoles.OKBAdministrator)) {
+          return result;
+        } else {
+          var algUsers = okb.AlgorithmUsers.Where(x => x.AlgorithmId == algorithmId);
+          if (algUsers.Count() == 0 || userManager.VerifyUser(userManager.CurrentUserId, algUsers.Select(y => y.UserGroupId).ToList())) {
+            return result;
+          } else {
+            return null;
+          }
+        }
+      }
+    }
+
+    public IEnumerable<DataTransfer.Problem> GetProblems(string platformName) {
+      roleVerifier.AuthenticateForAnyRole(OKBRoles.OKBAdministrator, OKBRoles.OKBUser);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataLoadOptions dlo = new DataLoadOptions();
+        dlo.LoadWith<Problem>(x => x.ProblemClass);
+        dlo.LoadWith<Problem>(x => x.DataType);
+        dlo.LoadWith<Problem>(x => x.ProblemUsers);
+        okb.LoadOptions = dlo;
+
+        var query = okb.Problems.Where(x => x.Platform.Name == platformName);
+        List<Problem> results = new List<Problem>();
+
+        if (roleVerifier.IsInRole(OKBRoles.OKBAdministrator)) {
+          results.AddRange(query);
+        } else {
+          foreach (var problem in query) {
+            if (problem.ProblemUsers.Count() == 0 || userManager.VerifyUser(userManager.CurrentUserId, problem.ProblemUsers.Select(y => y.UserGroupId).ToList())) {
+              results.Add(problem);
+            }
+          }
+        }
+        return results.Select(x => Convert.ToDto(x)).ToArray();
+      }
+    }
+
+    public byte[] GetProblemData(long problemId) {
+      roleVerifier.AuthenticateForAnyRole(OKBRoles.OKBAdministrator, OKBRoles.OKBUser);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        var result = okb.Problems.Where(x => x.Id == problemId).Select(x => x.BinaryData.Data.ToArray()).FirstOrDefault();
+
+        if (roleVerifier.IsInRole(OKBRoles.OKBAdministrator)) {
+          return result;
+        } else {
+          var problemUsers = okb.ProblemUsers.Where(x => x.ProblemId == problemId);
+          if (problemUsers.Count() == 0 || userManager.VerifyUser(userManager.CurrentUserId, problemUsers.Select(y => y.UserGroupId).ToList())) {
+            return result;
+          } else {
+            return null;
+          }
+        }
+      }
+    }
+
+    public void AddRun(DataTransfer.Run run) {
+      roleVerifier.AuthenticateForAnyRole(OKBRoles.OKBAdministrator, OKBRoles.OKBUser);
+
+      using (OKBDataContext okb = new OKBDataContext()) {
+        DataAccess.Run entity = Convert.ToEntity(run, okb);
+        okb.Runs.InsertOnSubmit(entity);
+        okb.SubmitChanges();
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/RunCreationService.svc
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/RunCreationService.svc	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/RunCreation/RunCreationService.svc	(revision 8049)
@@ -0,0 +1,1 @@
+<%@ServiceHost language=c# Debug="true" Service="HeuristicLab.Services.OKB.RunCreation.RunCreationService"%>
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/app.config
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/app.config	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/app.config	(revision 8049)
@@ -0,0 +1,99 @@
+<?xml version="1.0"?>
+<configuration>
+  <connectionStrings>
+    <add name="HeuristicLab.Authentication"
+         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.Authentication" />
+    <add name="HeuristicLab.Services.OKB.DataAccess.Properties.Settings.OKBConnectionString"
+         connectionString="Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OKB" />
+  </connectionStrings>
+
+  <system.web>
+    <compilation debug="true" />
+    <membership>
+      <providers>
+        <clear />
+        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="HeuristicLab.Authentication"
+             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
+             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
+             applicationName="HeuristicLab.Authentication" />
+      </providers>
+    </membership>
+    <roleManager enabled="true">
+      <providers>
+        <clear />
+        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="HeuristicLab.Authentication"
+             applicationName="HeuristicLab.Authentication" />
+      </providers>
+    </roleManager>
+  </system.web>
+
+  <system.serviceModel>
+    <bindings>
+      <mexHttpBinding>
+        <binding name="DefaultMexHttpBinding" />
+      </mexHttpBinding>
+      <wsHttpBinding>
+        <binding name="DefaultWsHttpBinding" maxReceivedMessageSize="200000000">
+          <readerQuotas maxArrayLength="200000000" maxBytesPerRead="200000000" />
+          <security mode="Message">
+            <message clientCredentialType="UserName" />
+          </security>
+        </binding>
+      </wsHttpBinding>
+    </bindings>
+
+    <behaviors>
+      <serviceBehaviors>
+        <behavior name="DefaultServiceBehavior">
+          <serviceMetadata httpGetEnabled="true" />
+          <serviceDebug includeExceptionDetailInFaults="true" />
+          <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" />
+          <serviceCredentials>
+            <serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" />
+            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="AspNetSqlMembershipProvider" />
+          </serviceCredentials>
+          <dataContractSerializer maxItemsInObjectGraph="6553600" />
+        </behavior>
+      </serviceBehaviors>
+    </behaviors>
+
+    <services>     
+      <service behaviorConfiguration="DefaultServiceBehavior" name="HeuristicLab.Services.OKB.Administration.AdministrationService">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding"
+          contract="IMetadataExchange" />
+        <endpoint binding="wsHttpBinding" bindingConfiguration="DefaultWsHttpBinding"
+          contract="HeuristicLab.Services.OKB.Administration.IAdministrationService" />
+        <host>
+          <baseAddresses>
+            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/AdministrationService" />
+          </baseAddresses>
+        </host>
+      </service>
+      <service behaviorConfiguration="DefaultServiceBehavior" name="HeuristicLab.Services.OKB.RunCreation.RunCreationService">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding"
+          contract="IMetadataExchange" />
+        <endpoint binding="wsHttpBinding" bindingConfiguration="DefaultWsHttpBinding"
+          contract="HeuristicLab.Services.OKB.RunCreation.IRunCreationService" />
+        <host>
+          <baseAddresses>
+            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/RunCreationService" />
+          </baseAddresses>
+        </host>
+      </service>
+      <service behaviorConfiguration="DefaultServiceBehavior" name="HeuristicLab.Services.OKB.Query.QueryService">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding"
+          contract="IMetadataExchange" />
+        <endpoint binding="wsHttpBinding" bindingConfiguration="DefaultWsHttpBinding"
+          contract="HeuristicLab.Services.OKB.Query.IQueryService" />
+        <host>
+          <baseAddresses>
+            <add baseAddress="http://localhost:8732/Design_Time_Addresses/OKB-3.3/QueryService" />
+          </baseAddresses>
+        </host>
+      </service>
+    </services>
+  </system.serviceModel>
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
+  </startup>
+</configuration>
Index: trunk/sources/HeuristicLab.Services.OKB/3.3/web.config
===================================================================
--- trunk/sources/HeuristicLab.Services.OKB/3.3/web.config	(revision 8049)
+++ trunk/sources/HeuristicLab.Services.OKB/3.3/web.config	(revision 8049)
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<configuration>
+  <connectionStrings>
+    <clear />
+    <add name="HeuristicLab.Authentication"
+           connectionString="data source=.;Integrated Security=SSPI;Initial Catalog=HeuristicLab.Authentication" />
+    <add name="HeuristicLab.Services.OKB.DataAccess.Properties.Settings.OKBConnectionString"
+         connectionString="Data Source=.;Integrated Security=SSPI;Initial Catalog=HeuristicLab.OKB" />
+  </connectionStrings>
+
+  <system.web>
+    <authentication mode="Forms" />
+    <compilation debug="true" targetFramework="4.0" />
+    <customErrors mode="Off"/>
+    <membership>
+      <providers>
+        <clear />
+        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="HeuristicLab.Authentication"
+             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
+             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
+             applicationName="HeuristicLab.Authentication" />
+      </providers>
+    </membership>
+    <roleManager enabled="true">
+      <providers>
+        <clear />
+        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="HeuristicLab.Authentication"
+             applicationName="HeuristicLab.Authentication" />
+      </providers>
+    </roleManager>
+  </system.web>
+
+  <system.serviceModel>
+    <bindings>
+      <mexHttpBinding>
+        <binding name="DefaultMexHttpBinding" />
+      </mexHttpBinding>
+      <wsHttpBinding>
+        <binding name="DefaultWsHttpBinding" maxReceivedMessageSize="200000000">
+          <readerQuotas maxArrayLength="200000000" maxBytesPerRead="200000000" />
+          <security mode="Message">
+            <message clientCredentialType="UserName" />
+          </security>
+        </binding>
+      </wsHttpBinding>
+    </bindings>
+
+    <behaviors>
+      <serviceBehaviors>
+        <behavior name="DefaultServiceBehavior">
+          <serviceMetadata httpGetEnabled="true" />
+          <serviceDebug includeExceptionDetailInFaults="true" />
+          <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" />
+          <serviceCredentials>
+            <serviceCertificate findValue="services.heuristiclab.com" x509FindType="FindBySubjectName" />
+            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="AspNetSqlMembershipProvider" />
+          </serviceCredentials>
+        </behavior>
+      </serviceBehaviors>
+    </behaviors>
+
+    <services> 
+
+      <service name="HeuristicLab.Services.OKB.Administration.AdministrationService" behaviorConfiguration="DefaultServiceBehavior">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding" contract="IMetadataExchange" listenUriMode="Explicit" />
+        <endpoint binding="wsHttpBinding" bindingConfiguration="DefaultWsHttpBinding" contract="HeuristicLab.Services.OKB.Administration.IAdministrationService" listenUriMode="Explicit" />
+      </service>
+
+      <service name="HeuristicLab.Services.OKB.RunCreation.RunCreationService" behaviorConfiguration="DefaultServiceBehavior">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding" contract="IMetadataExchange" listenUriMode="Explicit" />
+        <endpoint binding="wsHttpBinding" bindingConfiguration="DefaultWsHttpBinding" contract="HeuristicLab.Services.OKB.RunCreation.IRunCreationService" listenUriMode="Explicit" />
+      </service>
+
+      <service name="HeuristicLab.Services.OKB.Query.QueryService" behaviorConfiguration="DefaultServiceBehavior">
+        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="DefaultMexHttpBinding" contract="IMetadataExchange" listenUriMode="Explicit" />
+        <endpoint binding="wsHttpBinding" bindingConfiguration="DefaultWsHttpBinding" contract="HeuristicLab.Services.OKB.Query.IQueryService" listenUriMode="Explicit" />
+      </service>
+
+    </services>
+
+    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
+  </system.serviceModel>
+
+  <system.webServer>
+    <modules runAllManagedModulesForAllRequests="true" />
+  </system.webServer>
+
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
+  </startup>
+</configuration>
