source: branches/OKB (trunk integration)/HeuristicLab.Services.OKB/3.3/Query/QueryService.cs @ 7385

Last change on this file since 7385 was 7385, checked in by ascheibe, 8 years ago

#1174 removed RandomSeed from Run

File size: 12.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Data.Linq;
25using System.Linq;
26using System.ServiceModel;
27using HeuristicLab.Services.OKB.DataAccess;
28using HeuristicLab.Services.OKB.Query.DataTransfer;
29using HeuristicLab.Services.OKB.Query.Filters;
30
31namespace HeuristicLab.Services.OKB.Query {
32  /// <summary>
33  /// Implementation of the OKB query service (interface <see cref="IQueryService"/>).
34  /// </summary>
35  [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
36  public class QueryService : IQueryService {
37    public IEnumerable<Filter> GetFilters() {
38      List<Filter> filters = new List<Filter>();
39      using (OKBDataContext okb = new OKBDataContext()) {
40        #region Run Filters
41        filters.Add(new OrdinalComparisonDateTimeFilter(typeof(RunCreatedDateFilter).AssemblyQualifiedName, "Run Created Date"));
42        filters.Add(new StringComparisonFilter(typeof(RunUserNameFilter).AssemblyQualifiedName, "Run User Name"));
43        filters.Add(new StringComparisonFilter(typeof(RunClientNameFilter).AssemblyQualifiedName, "Run Client Name"));
44        #endregion
45
46        #region Parameter Filters
47        filters.Add(new StringComparisonAvailableValuesFilter(
48          typeof(ValueNameFilter).AssemblyQualifiedName,
49          "Parameter Name",
50          okb.ValueNames.Where(x => x.Category == ValueNameCategory.Parameter).Select(x => x.Name).Distinct().ToArray()
51        ));
52        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
53          filters.Add(new NameStringComparisonAvailableValuesFilter(
54            typeof(ValueDataTypeNameFilter).AssemblyQualifiedName,
55            "Parameter " + name + " Value Data Type Name",
56            name,
57            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()
58          ));
59        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Bool)).Select(x => x.Name).Distinct())
60          filters.Add(new NameEqualityComparisonBoolFilter(
61            typeof(BoolValueFilter).AssemblyQualifiedName,
62            "Parameter " + name + " Value",
63            name
64          ));
65        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Int)).Select(x => x.Name).Distinct())
66          filters.Add(new NameOrdinalComparisonIntFilter(
67            typeof(IntValueFilter).AssemblyQualifiedName,
68            "Parameter " + name + " Value",
69            name
70          ));
71        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Long)).Select(x => x.Name).Distinct())
72          filters.Add(new NameOrdinalComparisonLongFilter(
73            typeof(LongValueFilter).AssemblyQualifiedName,
74            "Parameter " + name + " Value",
75            name
76          ));
77        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Float)).Select(x => x.Name).Distinct())
78          filters.Add(new NameOrdinalComparisonFloatFilter(
79            typeof(FloatValueFilter).AssemblyQualifiedName,
80            "Parameter " + name + " Value",
81            name
82          ));
83        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Double)).Select(x => x.Name).Distinct())
84          filters.Add(new NameOrdinalComparisonDoubleFilter(
85            typeof(DoubleValueFilter).AssemblyQualifiedName,
86            "Parameter " + name + " Value",
87            name
88          ));
89        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.String)).Select(x => x.Name).Distinct())
90          filters.Add(new NameStringComparisonFilter(
91            typeof(StringValueFilter).AssemblyQualifiedName,
92            "Parameter " + name + " Value",
93            name
94          ));
95        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Parameter) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
96          filters.Add(new NameEqualityComparisonByteArrayFilter(
97            typeof(BinaryValueFilter).AssemblyQualifiedName,
98            "Parameter " + name + " Value",
99            name
100          ));
101        #endregion
102
103        #region Result Filters
104        filters.Add(new StringComparisonAvailableValuesFilter(
105          typeof(ValueNameFilter).AssemblyQualifiedName,
106          "Result Name",
107          okb.ValueNames.Where(x => x.Category == ValueNameCategory.Result).Select(x => x.Name).Distinct().ToArray()
108        ));
109        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
110          filters.Add(new NameStringComparisonAvailableValuesFilter(
111            typeof(ValueDataTypeNameFilter).AssemblyQualifiedName,
112            "Result " + name + " Value Data Type Name",
113            name,
114            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()
115          ));
116        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Bool)).Select(x => x.Name).Distinct())
117          filters.Add(new NameEqualityComparisonBoolFilter(
118            typeof(BoolValueFilter).AssemblyQualifiedName,
119            "Result " + name + " Value",
120            name
121          ));
122        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Int)).Select(x => x.Name).Distinct())
123          filters.Add(new NameOrdinalComparisonIntFilter(
124            typeof(IntValueFilter).AssemblyQualifiedName,
125            "Result " + name + " Value",
126            name
127          ));
128        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Long)).Select(x => x.Name).Distinct())
129          filters.Add(new NameOrdinalComparisonLongFilter(
130            typeof(LongValueFilter).AssemblyQualifiedName,
131            "Result " + name + " Value",
132            name
133          ));
134        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Float)).Select(x => x.Name).Distinct())
135          filters.Add(new NameOrdinalComparisonFloatFilter(
136            typeof(FloatValueFilter).AssemblyQualifiedName,
137            "Result " + name + " Value",
138            name
139          ));
140        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Double)).Select(x => x.Name).Distinct())
141          filters.Add(new NameOrdinalComparisonDoubleFilter(
142            typeof(DoubleValueFilter).AssemblyQualifiedName,
143            "Result " + name + " Value",
144            name
145          ));
146        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.String)).Select(x => x.Name).Distinct())
147          filters.Add(new NameStringComparisonFilter(
148            typeof(StringValueFilter).AssemblyQualifiedName,
149            "Result " + name + " Value",
150            name
151          ));
152        foreach (string name in okb.ValueNames.Where(x => (x.Category == ValueNameCategory.Result) && (x.Type == ValueNameType.Binary)).Select(x => x.Name).Distinct())
153          filters.Add(new NameEqualityComparisonByteArrayFilter(
154            typeof(BinaryValueFilter).AssemblyQualifiedName,
155            "Result " + name + " Value",
156            name
157          ));
158        #endregion
159
160        #region Algorithm Filters
161        filters.Add(new StringComparisonAvailableValuesFilter(
162          typeof(AlgorithmNameFilter).AssemblyQualifiedName,
163          "Algorithm Name",
164          okb.Algorithms.Select(x => x.Name).Distinct().ToArray()
165        ));
166        filters.Add(new StringComparisonAvailableValuesFilter(
167          typeof(AlgorithmClassNameFilter).AssemblyQualifiedName,
168          "Algorithm Class Name",
169          okb.AlgorithmClasses.Select(x => x.Name).Distinct().ToArray()
170        ));
171        filters.Add(new StringComparisonAvailableValuesFilter(
172          typeof(AlgorithmPlatformNameFilter).AssemblyQualifiedName,
173          "Algorithm Platform Name",
174          okb.Platforms.Select(x => x.Name).Distinct().ToArray()
175        ));
176        filters.Add(new StringComparisonAvailableValuesFilter(
177          typeof(AlgorithmDataTypeNameFilter).AssemblyQualifiedName,
178          "Algorithm Data Type Name",
179          okb.Algorithms.Select(x => x.DataType.Name).Distinct().ToArray()
180        ));
181        #endregion
182
183        #region Problem Filters
184        filters.Add(new StringComparisonAvailableValuesFilter(
185          typeof(ProblemNameFilter).AssemblyQualifiedName,
186          "Problem Name",
187          okb.Problems.Select(x => x.Name).Distinct().ToArray()
188        ));
189        filters.Add(new StringComparisonAvailableValuesFilter(
190          typeof(ProblemClassNameFilter).AssemblyQualifiedName,
191          "Problem Class Name",
192          okb.ProblemClasses.Select(x => x.Name).Distinct().ToArray()
193        ));
194        filters.Add(new StringComparisonAvailableValuesFilter(
195          typeof(ProblemPlatformNameFilter).AssemblyQualifiedName,
196          "Problem Platform Name",
197          okb.Platforms.Select(x => x.Name).Distinct().ToArray()
198        ));
199        filters.Add(new StringComparisonAvailableValuesFilter(
200          typeof(ProblemDataTypeNameFilter).AssemblyQualifiedName,
201          "Problem Data Type Name",
202          okb.Problems.Select(x => x.DataType.Name).Distinct().ToArray()
203        ));
204        #endregion
205
206        #region Combined Filters
207        filters.Add(new CombinedFilter(typeof(AndFilter).AssemblyQualifiedName, "AND", BooleanOperation.And));
208        filters.Add(new CombinedFilter(typeof(OrFilter).AssemblyQualifiedName, "OR", BooleanOperation.Or));
209        #endregion
210      }
211      return filters.OrderBy(x => x.Label);
212    }
213
214    public long GetNumberOfRuns(Filter filter) {
215      using (OKBDataContext okb = new OKBDataContext()) {
216        return FilterRuns(okb.Runs, filter).LongCount();
217      }
218    }
219
220    public IEnumerable<long> GetRunIds(Filter filter) {
221      using (OKBDataContext okb = new OKBDataContext()) {
222        return FilterRuns(okb.Runs, filter).Select(x => x.Id).ToArray();
223      }
224    }
225
226    public IEnumerable<DataTransfer.Run> GetRuns(IEnumerable<long> ids, bool includeBinaryValues) {
227      using (OKBDataContext okb = new OKBDataContext()) {
228        DataLoadOptions dlo = new DataLoadOptions();
229        // TODO: specify LoadWiths
230        okb.LoadOptions = dlo;
231
232        return okb.Runs.Where(x => ids.Contains(x.Id)).Select(x => Convert.ToDto(x, includeBinaryValues)).ToArray();
233      }
234    }
235
236    private IQueryable<DataAccess.Run> FilterRuns(IQueryable<DataAccess.Run> runs, Filter filter) {
237      IFilter f = (IFilter)Activator.CreateInstance(Type.GetType(filter.FilterTypeName), filter);
238      return runs.Where(f.Expression);
239    }
240  }
241}
Note: See TracBrowser for help on using the repository browser.