#region License Information
/* HeuristicLab
* Copyright (C) 2002-2010 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 .
*/
#endregion
using System;
using System.Collections.Generic;
using System.Data.Linq;
using System.Linq;
using System.ServiceModel;
using HeuristicLab.Services.OKB.DataAccess;
using HeuristicLab.Services.OKB.Query.DataTransfer;
using HeuristicLab.Services.OKB.Query.Filters;
namespace HeuristicLab.Services.OKB.Query {
///
/// Implementation of the OKB query service (interface ).
///
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class QueryService : IQueryService {
public IEnumerable GetFilters() {
List filters = new List();
using (OKBDataContext okb = new OKBDataContext()) {
#region Run Filters
filters.Add(new OrdinalComparisonLongFilter(typeof(RunRandomSeedFilter).AssemblyQualifiedName, "Run Random Seed"));
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.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.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.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.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).LongCount();
}
}
public IEnumerable GetRunIds(Filter filter) {
using (OKBDataContext okb = new OKBDataContext()) {
return FilterRuns(okb.Runs, filter).Select(x => x.Id).ToArray();
}
}
public IEnumerable GetRuns(IEnumerable ids, bool includeBinaryValues) {
using (OKBDataContext okb = new OKBDataContext()) {
DataLoadOptions dlo = new DataLoadOptions();
// TODO: specify LoadWiths
okb.LoadOptions = dlo;
return okb.Runs.Where(x => ids.Contains(x.Id)).Select(x => Convert.ToDto(x, includeBinaryValues)).ToArray();
}
}
private IQueryable FilterRuns(IQueryable runs, Filter filter) {
IFilter f = (IFilter)Activator.CreateInstance(Type.GetType(filter.FilterTypeName), filter);
return runs.Where(f.Expression);
}
}
}