diff --git a/java/com.sap.sailing.datamining.shared/META-INF/MANIFEST.MF b/java/com.sap.sailing.datamining.shared/META-INF/MANIFEST.MF index 539b60a6976..ed08f19c375 100644 --- a/java/com.sap.sailing.datamining.shared/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.datamining.shared/META-INF/MANIFEST.MF @@ -7,6 +7,6 @@ Bundle-Vendor: SAP Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . -Export-Package: com.sap.sailing.datamining.shared, - com.sap.sailing.datamining.shared.impl -Require-Bundle: com.sap.sse.datamining.shared;bundle-version="1.0.0" +Require-Bundle: com.sap.sse.datamining.shared;bundle-version="1.0.0", + com.sap.sailing.domain.common;bundle-version="1.0.0" +Export-Package: com.sap.sailing.datamining.shared diff --git a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/DataTypes.java b/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/DataTypes.java deleted file mode 100644 index 56112a57434..00000000000 --- a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/DataTypes.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sap.sailing.datamining.shared; - -public enum DataTypes { - - GPSFix, TrackedLegOfCompetitor - -} diff --git a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/DimensionIdentifier.java b/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/DimensionIdentifier.java deleted file mode 100644 index 0cc0779f6d7..00000000000 --- a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/DimensionIdentifier.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sap.sailing.datamining.shared; - -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; - -public enum DimensionIdentifier { - RegattaName, BoatClassName, CourseAreaName, FleetName, RaceName, LegType, LegNumber, Nationality, CompetitorName, SailID, WindStrength, Year; - - public static class OrdinalComparator implements Comparator { - private static final List dimensions = Arrays.asList(DimensionIdentifier.values()); - - @Override - public int compare(DimensionIdentifier dimension1, DimensionIdentifier dimension2) { - Integer ordinal1 = dimensions.indexOf(dimension1); - Integer ordinal2 = dimensions.indexOf(dimension2); - return ordinal1.compareTo(ordinal2); - } - - } -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/QueryDefinition.java b/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/QueryDefinition.java deleted file mode 100644 index 5f6548e13c9..00000000000 --- a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/QueryDefinition.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.datamining.shared; - -import java.io.Serializable; -import java.util.List; -import java.util.Map; - -import com.sap.sse.datamining.shared.components.AggregatorType; -import com.sap.sse.datamining.shared.components.GrouperType; - -public interface QueryDefinition extends Serializable { - - public String getLocaleInfoName(); - - public GrouperType getGrouperType(); - - public StatisticType getStatisticType(); - - public AggregatorType getAggregatorType(); - - public DataTypes getDataType(); - - public List getDimensionsToGroupBy(); - - public Map> getSelection(); - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/SailingDataMiningSerializationDummy.java b/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/SailingDataMiningSerializationDummy.java new file mode 100644 index 00000000000..1dd021fdb0d --- /dev/null +++ b/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/SailingDataMiningSerializationDummy.java @@ -0,0 +1,16 @@ +package com.sap.sailing.datamining.shared; + +import java.io.Serializable; + +import com.sap.sailing.domain.common.LegType; +import com.sap.sse.datamining.shared.impl.GenericGroupKey; + +@SuppressWarnings("unused") +public final class SailingDataMiningSerializationDummy implements Serializable { + private static final long serialVersionUID = 2L; + + private LegType legType; + + private SailingDataMiningSerializationDummy() { } + +} diff --git a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/StatisticType.java b/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/StatisticType.java deleted file mode 100644 index 04b91a9cd42..00000000000 --- a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/StatisticType.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.sap.sailing.datamining.shared; - -import com.sap.sse.datamining.shared.Message; -import com.sap.sse.datamining.shared.Unit; -import com.sap.sse.datamining.shared.components.ElementType; - -public enum StatisticType { - - Speed(ElementType.Double, Unit.Knots, 2), - Distance(ElementType.Double, Unit.Meters, 2); - - private final ElementType valueType; - private final Unit unit; - private final int valueDecimals; - - private StatisticType(ElementType valueType, Unit unit, int valueDecimals) { - this.valueType = valueType; - this.unit = unit; - this.valueDecimals = valueDecimals; - } - - public ElementType getValueType() { - return valueType; - } - - public Message getSignifierMessage() { - switch (this) { - case Distance: - return Message.Distance; - case Speed: - return Message.Speed; - } - throw new IllegalArgumentException("No message available for the statistic type '" + this + "'"); - } - - public Unit getUnit() { - return unit; - } - - public Message getUnitMessage() { - switch (unit) { - case Knots: - return Message.Knots; - case Meters: - return Message.Meters; - case None: - return null; - } - throw new IllegalArgumentException("No message available for the unit '" + unit + "'"); - } - - public int getValueDecimals() { - return valueDecimals; - } - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/impl/SimpleQueryDefinition.java b/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/impl/SimpleQueryDefinition.java deleted file mode 100644 index 5547f158e17..00000000000 --- a/java/com.sap.sailing.datamining.shared/src/com/sap/sailing/datamining/shared/impl/SimpleQueryDefinition.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.sap.sailing.datamining.shared.impl; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sailing.datamining.shared.StatisticType; -import com.sap.sse.datamining.shared.components.AggregatorType; -import com.sap.sse.datamining.shared.components.GrouperType; - -public class SimpleQueryDefinition implements QueryDefinition { - private static final long serialVersionUID = 8408302866342877839L; - - private String localeInfoName; - - private GrouperType grouperType; - private StatisticType statisticType; - private AggregatorType aggregatorType; - private DataTypes dataType; - - private List dimensionsToGroupBy; - private Map> selectionMappedByDimension; - - /** - * Constructor for the GWT-Serialization. Don't use this! - */ - @Deprecated - SimpleQueryDefinition() { } - - public SimpleQueryDefinition(String localeInfoName, GrouperType grouperType, StatisticType statisticType, AggregatorType aggregatorType, DataTypes dataType) { - this.localeInfoName = localeInfoName; - this.grouperType = grouperType; - this.statisticType = statisticType; - this.aggregatorType = aggregatorType; - this.dataType = dataType; - - dimensionsToGroupBy = new ArrayList(); - selectionMappedByDimension = new HashMap>(); - } - - @Override - public String getLocaleInfoName() { - return localeInfoName; - } - - @Override - public GrouperType getGrouperType() { - return grouperType; - } - - @Override - public StatisticType getStatisticType() { - return statisticType; - } - - @Override - public AggregatorType getAggregatorType() { - return aggregatorType; - } - - @Override - public DataTypes getDataType() { - return dataType; - } - - @Override - public List getDimensionsToGroupBy() { - return dimensionsToGroupBy; - } - - @Override - public Map> getSelection() { - return selectionMappedByDimension; - } - - public void appendDimensionToGroupBy(DimensionIdentifier dimension) { - dimensionsToGroupBy.add(dimension); - } - - public void setSelectionFor(DimensionIdentifier dimension, Collection selection) { - selectionMappedByDimension.put(dimension, selection); - } - -} diff --git a/java/com.sap.sailing.datamining.test/.classpath b/java/com.sap.sailing.datamining.test/.classpath index 5c0149e1673..ba4e0d198fd 100644 --- a/java/com.sap.sailing.datamining.test/.classpath +++ b/java/com.sap.sailing.datamining.test/.classpath @@ -4,5 +4,6 @@ + diff --git a/java/com.sap.sailing.datamining.test/build.properties b/java/com.sap.sailing.datamining.test/build.properties index 34d2e4d2dad..3520af99683 100644 --- a/java/com.sap.sailing.datamining.test/build.properties +++ b/java/com.sap.sailing.datamining.test/build.properties @@ -1,4 +1,5 @@ -source.. = src/ +source.. = src/,\ + resources/ output.. = bin/ bin.includes = META-INF/,\ . diff --git a/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_2.mtb b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_2.mtb new file mode 100644 index 00000000000..38321e1dff2 Binary files /dev/null and b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_2.mtb differ diff --git a/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_2.txt b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_2.txt new file mode 100644 index 00000000000..f797b4bd1a9 --- /dev/null +++ b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_2.txt @@ -0,0 +1,1419 @@ +stored-uri:datafiles/event_20110609_KielerWoch-505_Race_2.mtb +StartReplay:1 + +// Input from params_static: + +// Input from event_parameters: + +CompMarkerUUID:1 +CodanIsSponsor:0 +EnablePrint:1 +DefaultTailLength:60 +APzoomChangeTime:2500 +disableAutoProduce:0 +autoProduce:0 +APstartLineShowOfLeg:0.25 +APsideOfStartLine:0.30 +APstartSwitch:0.8 +APwholeLegBehindMarks:0.15 +APmarkSwitch:0.13 +APmarkZoomBehindMarks:0.10 +APmarkZoomInFrontOfMarks:0.20 +PopupMarkerUUID:2 +ManualUrl:http://www.tractrac.com/files/userguide_sailing.pdf +WeatherLat1:56 +WeatherLat2:54 +Marker1UUID:1 +Marker1Type:RGBMarkerFactory +Marker1Directional:1 +Marker1Image:markers/boat_FF0000_big.png +Marker1MetersPerPixel:0.0617 +Marker1MinScale:0.396 +Startlocation:10.197659,54.456129 +MaxDiffTime:600 +MaxMetersPerSecond:20 +PrecisionMeters:20 +ShortAvgTime:180 +LongAvgTime:900 +TimeZone:2 +CompMarkerTimeout:60 +FramesPerSecond:8 +replayspeedup:5 +MatchRaceClock:0 +MatchRaceClockNo:3 +MatchRaceClockSpacing:300 +Minimap:1 +MinimapUseLayers:1 +Minimapgeorect:9.840775,54.516538,10.3022,54.309554 +MinimapMarkerUUID:2 +Marker4UUID:2 +Marker4Type:RGBmarkerFactory +Marker4Directional:1 +Marker4Image:markers/boat_FF0000_small.png +MetersPerPixel:25 +MetersPerPixelMax:200 +MetersPerPixelMin:0.2 +isMatchRace:0 +weatherEnabled:0 +showRaceClock:1 +BackGroundImage:graphics/background.jpg +DisableRotation:0 +ControlPointMarkerRadius:13 +disableselection:0 +disableleaderline:0 +WeatherLon1:9 +WeatherLon2:12 +DisableChangeRace:0 +PopUpRow1Name: +PopUpRow1Type:Name +PopUpRow2Name:Knots +PopUpRow2Type:BoatSpeed +PopUpRow3Name:Ranking +PopUpRow3Type:RowNumber +PopUpRow4Name:Sail +PopUpRow4Type:Ini +PopUpRow5Name:After +PopUpRow5Type:BoatAfter +ResultColumn1Name:# +ResultColumn1Size:20 +ResultColumn1Type:RowNumber +ResultColumn2Size:20 +ResultColumn2Type:ColorMarker +ResultColumn3Name:sail +ResultColumn3Size:60 +ResultColumn3Type:Ini +ResultColumn4Name:name +ResultColumn4Size:110 +ResultColumn4Type:Name +ResultColumn5Name:after +ResultColumn5Size:45 +ResultColumn5Type:BoatAfter +ResultColumn6Name:kts +ResultColumn6Size:40 +ResultColumn6Type:BoatSpeed +DisableLeaderboard:0 +DisableAnalysis:0 +TableFontSize:11 +//live-uri:tcp://germanmaster.traclive.dk:4400 +//stored-uri:tcp://germanmaster.traclive.dk:4401 +compInitialsFontSize:11 +AutoRotate:0 +MassStart:0 +SegmentFile:segments.php +StartType:Mass +ReCalcDirAndSpeed:0 +RaceHandicapSystem:NONE +TeamCompetitionType:NONE +LiveDelaySecs: 180 + +//-------- AUTO GENERATED PARAMETERS START ---------------- + +EventID:f34b232a-934e-11e0-b3bb-406186cbf87c +EventName:Kieler Woche +EventDB:event_20110609_KielerWoch +EventStartTime:2011-06-15 09:00:00 +EventEndTime:2011-06-26 23:59:00 + +RaceID:357c700a-9d9a-11e0-85be-406186cbf87c +RaceName:505 Race 2 +RaceStartTime:2011-06-23 13:25:00 +RaceEndTime: +RaceTrackingStartTime:2011-06-23 13:14:31 +RaceTrackingEndTime:2011-06-23 14:58:23 +RaceDefaultRouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c +RaceHandicapSystem:NONE + +Image1UUID:0ba089bc-996f-11e0-85be-406186cbf87c +Image1Type:Logo +Image1Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/URU.gif +Image1Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/URU.gif + +Image2UUID:1d548b00-996e-11e0-85be-406186cbf87c +Image2Type:Logo +Image2Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUT.gif +Image2Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUT.gif + +Image3UUID:1ece41fa-9c49-11e0-85be-406186cbf87c +Image3Type:Logo +Image3Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NZL.gif +Image3Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NZL.gif + +Image4UUID:22b1a988-98e3-11e0-85be-406186cbf87c +Image4Type:Logo +Image4Description:Veolia +Image4Image: + +Image5UUID:22ba0304-98d8-11e0-85be-406186cbf87c +Image5Type:Logo +Image5Description:Kieler Woche +Image5Image: + +Image6UUID:2767b7e8-996e-11e0-85be-406186cbf87c +Image6Type:Logo +Image6Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BEL.gif +Image6Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BEL.gif + +Image7UUID:2cda6f4a-996e-11e0-85be-406186cbf87c +Image7Type:Logo +Image7Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BRA.gif +Image7Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BRA.gif + +Image8UUID:3313b588-98d8-11e0-85be-406186cbf87c +Image8Type:Logo +Image8Description:Audi +Image8Image: + +Image9UUID:33a26700-98e3-11e0-85be-406186cbf87c +Image9Type:Logo +Image9Description:HSH NORDBANK +Image9Image: + +Image10UUID:373009a0-996e-11e0-85be-406186cbf87c +Image10Type:Logo +Image10Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CHI.gif +Image10Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CHI.gif + +Image11UUID:4cc5360a-996e-11e0-85be-406186cbf87c +Image11Type:Logo +Image11Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/EST.gif +Image11Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/EST.gif + +Image12UUID:514008f8-98e3-11e0-85be-406186cbf87c +Image12Type:Logo +Image12Description:ISAF SAILING WORLDCUP +Image12Image: + +Image13UUID:5222c1c6-996e-11e0-85be-406186cbf87c +Image13Type:Logo +Image13Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/FRA.gif +Image13Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/FRA.gif + +Image14UUID:574e0d40-98d8-11e0-85be-406186cbf87c +Image14Type:Logo +Image14Description:SAP +Image14Image: + +Image15UUID:617e8236-996e-11e0-85be-406186cbf87c +Image15Type:Logo +Image15Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GBR.gif +Image15Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GBR.gif + +Image16UUID:6d332670-9934-11e0-85be-406186cbf87c +Image16Type:Logo +Image16Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUS.gif +Image16Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUS.gif + +Image17UUID:7252c142-9934-11e0-85be-406186cbf87c +Image17Type:Logo +Image17Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CAN.gif +Image17Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CAN.gif + +Image18UUID:77555f2e-9934-11e0-85be-406186cbf87c +Image18Type:Logo +Image18Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CRO.gif +Image18Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CRO.gif + +Image19UUID:7c87105a-9934-11e0-85be-406186cbf87c +Image19Type:Logo +Image19Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/DEN.gif +Image19Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/DEN.gif + +Image20UUID:7deb67ce-9930-11e0-85be-406186cbf87c +Image20Type:Logo +Image20Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/RUS.gif +Image20Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/RUS.gif + +Image21UUID:81fea498-9930-11e0-85be-406186cbf87c +Image21Type:Logo +Image21Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GER.gif +Image21Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GER.gif + +Image22UUID:93a58cc0-9930-11e0-85be-406186cbf87c +Image22Type:Logo +Image22Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/USA.gif +Image22Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/USA.gif + +Image23UUID:bc6068c4-9d77-11e0-85be-406186cbf87c +Image23Type:Logo +Image23Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UAE.gif +Image23Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UAE.gif + +Image24UUID:be8c642a-996e-11e0-85be-406186cbf87c +Image24Type:Logo +Image24Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GRE.gif +Image24Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GRE.gif + +Image25UUID:c2fdb14c-9934-11e0-85be-406186cbf87c +Image25Type:Logo +Image25Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/HUN.gif +Image25Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/HUN.gif + +Image26UUID:c3a2eaa6-996e-11e0-85be-406186cbf87c +Image26Type:Logo +Image26Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/IRL.gif +Image26Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/IRL.gif + +Image27UUID:c85b16fc-9934-11e0-85be-406186cbf87c +Image27Type:Logo +Image27Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ISV.gif +Image27Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ISV.gif + +Image28UUID:c8eaf36e-996e-11e0-85be-406186cbf87c +Image28Type:Logo +Image28Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/MEX.gif +Image28Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/MEX.gif + +Image29UUID:cd74b15c-9934-11e0-85be-406186cbf87c +Image29Type:Logo +Image29Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ITA.gif +Image29Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ITA.gif + +Image30UUID:cdf05d40-996e-11e0-85be-406186cbf87c +Image30Type:Logo +Image30Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NED.gif +Image30Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NED.gif + +Image31UUID:d3764b44-996e-11e0-85be-406186cbf87c +Image31Type:Logo +Image31Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/POL.gif +Image31Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/POL.gif + +Image32UUID:d77c220c-9934-11e0-85be-406186cbf87c +Image32Type:Logo +Image32Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/JPN.gif +Image32Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/JPN.gif + +Image33UUID:dcb92152-9934-11e0-85be-406186cbf87c +Image33Type:Logo +Image33Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NOR.gif +Image33Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NOR.gif + +Image34UUID:e69d47f2-9934-11e0-85be-406186cbf87c +Image34Type:Logo +Image34Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SUI.gif +Image34Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SUI.gif + +Image35UUID:ebb4c5da-9934-11e0-85be-406186cbf87c +Image35Type:Logo +Image35Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SWE.gif +Image35Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SWE.gif + +Image36UUID:f5cab6b0-9934-11e0-85be-406186cbf87c +Image36Type:Logo +Image36Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UKR.gif +Image36Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UKR.gif + +Class1UUID:da553a2a-9d14-11e0-85be-406186cbf87c +Class1Name:5o5 + +Team1UUID:6cf050ac-9934-11e0-85be-406186cbf87c +Team1Name:AUS +Team1Comp1UUID:de7d2ba8-9d14-11e0-85be-406186cbf87c + +Team2UUID:1d07e516-996e-11e0-85be-406186cbf87c +Team2Name:AUT + +Team3UUID:271ac230-996e-11e0-85be-406186cbf87c +Team3Name:BEL + +Team4UUID:2c8e2630-996e-11e0-85be-406186cbf87c +Team4Name:BRA + +Team5UUID:7210a622-9934-11e0-85be-406186cbf87c +Team5Name:CAN + +Team6UUID:36ebe888-996e-11e0-85be-406186cbf87c +Team6Name:CHI + +Team7UUID:77133b08-9934-11e0-85be-406186cbf87c +Team7Name:CRO + +Team8UUID:7c3a4770-9934-11e0-85be-406186cbf87c +Team8Name:DEN +Team8Comp1UUID:e7bc96f4-9d14-11e0-85be-406186cbf87c +Team8Comp2UUID:f0c9604c-9d14-11e0-85be-406186cbf87c +Team8Comp3UUID:ec336744-9d14-11e0-85be-406186cbf87c +Team8Comp4UUID:e3587876-9d14-11e0-85be-406186cbf87c + +Team9UUID:4c650fc8-996e-11e0-85be-406186cbf87c +Team9Name:EST + +Team10UUID:51d56ce6-996e-11e0-85be-406186cbf87c +Team10Name:FRA +Team10Comp1UUID:f969da74-9d14-11e0-85be-406186cbf87c +Team10Comp2UUID:f50675be-9d14-11e0-85be-406186cbf87c +Team10Comp3UUID:fda897ba-9d14-11e0-85be-406186cbf87c + +Team11UUID:613a12ea-996e-11e0-85be-406186cbf87c +Team11Name:GBR + +Team12UUID:81b951d6-9930-11e0-85be-406186cbf87c +Team12Name:GER +Team12Comp1UUID:70eb542e-9d15-11e0-85be-406186cbf87c +Team12Comp2UUID:40bd6314-9d15-11e0-85be-406186cbf87c +Team12Comp3UUID:0a917a14-9d15-11e0-85be-406186cbf87c +Team12Comp4UUID:9d4e23d4-9d15-11e0-85be-406186cbf87c +Team12Comp5UUID:498b40ec-9d15-11e0-85be-406186cbf87c +Team12Comp6UUID:7e051528-9d15-11e0-85be-406186cbf87c +Team12Comp7UUID:949b11b6-9d15-11e0-85be-406186cbf87c +Team12Comp8UUID:991ab354-9d15-11e0-85be-406186cbf87c +Team12Comp9UUID:826bdcb4-9d15-11e0-85be-406186cbf87c +Team12Comp10UUID:3c1fb294-9d15-11e0-85be-406186cbf87c +Team12Comp11UUID:4e00eaa0-9d15-11e0-85be-406186cbf87c +Team12Comp12UUID:a1f9ca46-9d15-11e0-85be-406186cbf87c +Team12Comp13UUID:1cd7dcc2-9d15-11e0-85be-406186cbf87c +Team12Comp14UUID:5b14f704-9d15-11e0-85be-406186cbf87c +Team12Comp15UUID:5f520bea-9d15-11e0-85be-406186cbf87c +Team12Comp16UUID:86d2fb5c-9d15-11e0-85be-406186cbf87c +Team12Comp17UUID:13e98db8-9d15-11e0-85be-406186cbf87c +Team12Comp18UUID:21584926-9d15-11e0-85be-406186cbf87c +Team12Comp19UUID:450c5a92-9d15-11e0-85be-406186cbf87c +Team12Comp20UUID:8b618332-9d15-11e0-85be-406186cbf87c +Team12Comp21UUID:75325a1e-9d15-11e0-85be-406186cbf87c +Team12Comp22UUID:37b2223c-9d15-11e0-85be-406186cbf87c +Team12Comp23UUID:062ea47e-9d15-11e0-85be-406186cbf87c +Team12Comp24UUID:2a8fbab0-9d15-11e0-85be-406186cbf87c +Team12Comp25UUID:56b22d94-9d15-11e0-85be-406186cbf87c +Team12Comp26UUID:63855546-9d15-11e0-85be-406186cbf87c +Team12Comp27UUID:25ea8cce-9d15-11e0-85be-406186cbf87c +Team12Comp28UUID:68315036-9d15-11e0-85be-406186cbf87c +Team12Comp29UUID:aa852246-9d15-11e0-85be-406186cbf87c +Team12Comp30UUID:0f4448e8-9d15-11e0-85be-406186cbf87c +Team12Comp31UUID:1859e280-9d15-11e0-85be-406186cbf87c + +Team13UUID:be35f1ee-996e-11e0-85be-406186cbf87c +Team13Name:GRE + +Team14UUID:c2b1d6a0-9934-11e0-85be-406186cbf87c +Team14Name:HUN + +Team15UUID:c3601ba4-996e-11e0-85be-406186cbf87c +Team15Name:IRL + +Team16UUID:c818eb6a-9934-11e0-85be-406186cbf87c +Team16Name:ISV + +Team17UUID:cd2435f6-9934-11e0-85be-406186cbf87c +Team17Name:ITA + +Team18UUID:d737d124-9934-11e0-85be-406186cbf87c +Team18Name:JPN + +Team19UUID:c8a808d8-996e-11e0-85be-406186cbf87c +Team19Name:MEX + +Team20UUID:cdaadaae-996e-11e0-85be-406186cbf87c +Team20Name:NED + +Team21UUID:dc76ea44-9934-11e0-85be-406186cbf87c +Team21Name:NOR + +Team22UUID:1e8f7452-9c49-11e0-85be-406186cbf87c +Team22Name:NZL + +Team23UUID:d3297b7a-996e-11e0-85be-406186cbf87c +Team23Name:POL + +Team24UUID:7d9ca8fa-9930-11e0-85be-406186cbf87c +Team24Name:RUS + +Team25UUID:e6510b62-9934-11e0-85be-406186cbf87c +Team25Name:SUI + +Team26UUID:eb727d9c-9934-11e0-85be-406186cbf87c +Team26Name:SWE +Team26Comp1UUID:aec14cd6-9d15-11e0-85be-406186cbf87c + +Team27UUID:ffb184b0-98e4-11e0-85be-406186cbf87c +Team27Name:Test + +Team28UUID:bc22780c-9d77-11e0-85be-406186cbf87c +Team28Name:UAE + +Team29UUID:f57e7ea8-9934-11e0-85be-406186cbf87c +Team29Name:UKR + +Team30UUID:0b5469f6-996f-11e0-85be-406186cbf87c +Team30Name:URU + +Team31UUID:9361c468-9930-11e0-85be-406186cbf87c +Team31Name:USA +SELECT Competitors.UUID,FirstName,LastName,Initials,Color,Nationality,Description,Icon,Picture,ClassId,Handicap,HandicapDistance,StartTime FROM event_20110609_KielerWoch.RaceObject INNER JOIN event_20110609_KielerWoch.Competitors ON event_20110609_KielerWoch.RaceObject.TrackedObjectId = event_20110609_KielerWoch.Competitors.UUID WHERE RaceId='357c700a-9d9a-11e0-85be-406186cbf87c' ORDER BY LID,StartTime,Competitors.UUID + + +Comp1UUID:de7d2ba8-9d14-11e0-85be-406186cbf87c +Comp1Name:Kevin +Comp1NameShort:AUS9061 +Comp1Color:FF0000 +Comp1Nationality:AUS +Comp1Description: +Comp1Handicap:1.0000000000 +Comp1HandicapDistance:0.00000 +Comp1StartTime:2011-06-23 13:25:00 +Comp1PictureUUID:6d332670-9934-11e0-85be-406186cbf87c +Comp1ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp1RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp2UUID:e3587876-9d14-11e0-85be-406186cbf87c +Comp2Name:van Wonterghem +Comp2NameShort:DEN8828 +Comp2Color:808000 +Comp2Nationality:DEN +Comp2Description: +Comp2Handicap:1.0000000000 +Comp2HandicapDistance:0.00000 +Comp2StartTime:2011-06-23 13:25:00 +Comp2PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp2ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp2RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp3UUID:e7bc96f4-9d14-11e0-85be-406186cbf87c +Comp3Name:Buhl +Comp3NameShort:DEN8958 +Comp3Color:FFFFFF +Comp3Nationality:DEN +Comp3Description: +Comp3Handicap:1.0000000000 +Comp3HandicapDistance:0.00000 +Comp3StartTime:2011-06-23 13:25:00 +Comp3PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp3ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp3RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp4UUID:ec336744-9d14-11e0-85be-406186cbf87c +Comp4Name:Saugmann +Comp4NameShort:DEN8964 +Comp4Color:FFFF00 +Comp4Nationality:DEN +Comp4Description: +Comp4Handicap:1.0000000000 +Comp4HandicapDistance:0.00000 +Comp4StartTime:2011-06-23 13:25:00 +Comp4PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp4ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp4RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp5UUID:f0c9604c-9d14-11e0-85be-406186cbf87c +Comp5Name:Bøjland +Comp5NameShort:DEN9023 +Comp5Color:800080 +Comp5Nationality:DEN +Comp5Description: +Comp5Handicap:1.0000000000 +Comp5HandicapDistance:0.00000 +Comp5StartTime:2011-06-23 13:25:00 +Comp5PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp5ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp5RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp6UUID:f50675be-9d14-11e0-85be-406186cbf87c +Comp6Name:Broise +Comp6NameShort:FRA8844 +Comp6Color:008080 +Comp6Nationality:FRA +Comp6Description: +Comp6Handicap:1.0000000000 +Comp6HandicapDistance:0.00000 +Comp6StartTime:2011-06-23 13:25:00 +Comp6PictureUUID:5222c1c6-996e-11e0-85be-406186cbf87c +Comp6ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp6RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp7UUID:f969da74-9d14-11e0-85be-406186cbf87c +Comp7Name:boite +Comp7NameShort:FRA8902 +Comp7Color:800000 +Comp7Nationality:FRA +Comp7Description: +Comp7Handicap:1.0000000000 +Comp7HandicapDistance:0.00000 +Comp7StartTime:2011-06-23 13:25:00 +Comp7PictureUUID:5222c1c6-996e-11e0-85be-406186cbf87c +Comp7ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp7RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp8UUID:fda897ba-9d14-11e0-85be-406186cbf87c +Comp8Name:de Lisle +Comp8NameShort:FRA9068 +Comp8Color:000080 +Comp8Nationality:FRA +Comp8Description: +Comp8Handicap:1.0000000000 +Comp8HandicapDistance:0.00000 +Comp8StartTime:2011-06-23 13:25:00 +Comp8PictureUUID:5222c1c6-996e-11e0-85be-406186cbf87c +Comp8ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp8RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp9UUID:062ea47e-9d15-11e0-85be-406186cbf87c +Comp9Name:Menge +Comp9NameShort:GER7861 +Comp9Color:000000 +Comp9Nationality:GER +Comp9Description: +Comp9Handicap:1.0000000000 +Comp9HandicapDistance:0.00000 +Comp9StartTime:2011-06-23 13:25:00 +Comp9PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp9ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp9RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp10UUID:0a917a14-9d15-11e0-85be-406186cbf87c +Comp10Name:Barop +Comp10NameShort:GER8392 +Comp10Color:0000FF +Comp10Nationality:GER +Comp10Description: +Comp10Handicap:1.0000000000 +Comp10HandicapDistance:0.00000 +Comp10StartTime:2011-06-23 13:25:00 +Comp10PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp10ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp10RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp11UUID:0f4448e8-9d15-11e0-85be-406186cbf87c +Comp11Name:Steffen +Comp11NameShort:GER8437 +Comp11Color:FF00FF +Comp11Nationality:GER +Comp11Description: +Comp11Handicap:1.0000000000 +Comp11HandicapDistance:0.00000 +Comp11StartTime:2011-06-23 13:25:00 +Comp11PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp11ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp11RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp12UUID:13e98db8-9d15-11e0-85be-406186cbf87c +Comp12Name:Katja +Comp12NameShort:GER8500 +Comp12Color:008000 +Comp12Nationality:GER +Comp12Description: +Comp12Handicap:1.0000000000 +Comp12HandicapDistance:0.00000 +Comp12StartTime:2011-06-23 13:25:00 +Comp12PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp12ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp12RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp13UUID:1859e280-9d15-11e0-85be-406186cbf87c +Comp13Name:von Nerée +Comp13NameShort:GER8522 +Comp13Color:00FF00 +Comp13Nationality:GER +Comp13Description: +Comp13Handicap:1.0000000000 +Comp13HandicapDistance:0.00000 +Comp13StartTime:2011-06-23 13:25:00 +Comp13PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp13ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp13RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp14UUID:1cd7dcc2-9d15-11e0-85be-406186cbf87c +Comp14Name:Goedeking +Comp14NameShort:GER8622 +Comp14Color:FF0000 +Comp14Nationality:GER +Comp14Description: +Comp14Handicap:1.0000000000 +Comp14HandicapDistance:0.00000 +Comp14StartTime:2011-06-23 13:25:00 +Comp14PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp14ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp14RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp15UUID:21584926-9d15-11e0-85be-406186cbf87c +Comp15Name:Kellner +Comp15NameShort:GER8651 +Comp15Color:808000 +Comp15Nationality:GER +Comp15Description: +Comp15Handicap:1.0000000000 +Comp15HandicapDistance:0.00000 +Comp15StartTime:2011-06-23 13:25:00 +Comp15PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp15ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp15RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp16UUID:25ea8cce-9d15-11e0-85be-406186cbf87c +Comp16Name:Reincke +Comp16NameShort:GER8656 +Comp16Color:FFFFFF +Comp16Nationality:GER +Comp16Description: +Comp16Handicap:1.0000000000 +Comp16HandicapDistance:0.00000 +Comp16StartTime:2011-06-23 13:25:00 +Comp16PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp16ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp16RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp17UUID:2a8fbab0-9d15-11e0-85be-406186cbf87c +Comp17Name:Neulen +Comp17NameShort:GER8657 +Comp17Color:FFFF00 +Comp17Nationality:GER +Comp17Description: +Comp17Handicap:1.0000000000 +Comp17HandicapDistance:0.00000 +Comp17StartTime:2011-06-23 13:25:00 +Comp17PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp17ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp17RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp18UUID:37b2223c-9d15-11e0-85be-406186cbf87c +Comp18Name:Lietz +Comp18NameShort:GER8721 +Comp18Color:800000 +Comp18Nationality:GER +Comp18Description: +Comp18Handicap:1.0000000000 +Comp18HandicapDistance:0.00000 +Comp18StartTime:2011-06-23 13:25:00 +Comp18PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp18ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp18RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp19UUID:3c1fb294-9d15-11e0-85be-406186cbf87c +Comp19Name:Feldmann +Comp19NameShort:GER8730 +Comp19Color:000080 +Comp19Nationality:GER +Comp19Description: +Comp19Handicap:1.0000000000 +Comp19HandicapDistance:0.00000 +Comp19StartTime:2011-06-23 13:25:00 +Comp19PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp19ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp19RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp20UUID:40bd6314-9d15-11e0-85be-406186cbf87c +Comp20Name:Anton +Comp20NameShort:GER8741 +Comp20Color:00FFFF +Comp20Nationality:GER +Comp20Description: +Comp20Handicap:1.0000000000 +Comp20HandicapDistance:0.00000 +Comp20StartTime:2011-06-23 13:25:00 +Comp20PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp20ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp20RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp21UUID:450c5a92-9d15-11e0-85be-406186cbf87c +Comp21Name:Kraft +Comp21NameShort:GER8843 +Comp21Color:000000 +Comp21Nationality:GER +Comp21Description: +Comp21Handicap:1.0000000000 +Comp21HandicapDistance:0.00000 +Comp21StartTime:2011-06-23 13:25:00 +Comp21PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp21ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp21RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp22UUID:498b40ec-9d15-11e0-85be-406186cbf87c +Comp22Name:Brill +Comp22NameShort:GER8874 +Comp22Color:0000FF +Comp22Nationality:GER +Comp22Description: +Comp22Handicap:1.0000000000 +Comp22HandicapDistance:0.00000 +Comp22StartTime:2011-06-23 13:25:00 +Comp22PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp22ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp22RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp23UUID:4e00eaa0-9d15-11e0-85be-406186cbf87c +Comp23Name:Findel +Comp23NameShort:GER8875 +Comp23Color:FF00FF +Comp23Nationality:GER +Comp23Description: +Comp23Handicap:1.0000000000 +Comp23HandicapDistance:0.00000 +Comp23StartTime:2011-06-23 13:25:00 +Comp23PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp23ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp23RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp24UUID:56b22d94-9d15-11e0-85be-406186cbf87c +Comp24Name:Pleßmann +Comp24NameShort:GER8927 +Comp24Color:00FF00 +Comp24Nationality:GER +Comp24Description: +Comp24Handicap:1.0000000000 +Comp24HandicapDistance:0.00000 +Comp24StartTime:2011-06-23 13:25:00 +Comp24PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp24ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp24RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp25UUID:5b14f704-9d15-11e0-85be-406186cbf87c +Comp25Name:Gosch +Comp25NameShort:GER8929 +Comp25Color:FF0000 +Comp25Nationality:GER +Comp25Description: +Comp25Handicap:1.0000000000 +Comp25HandicapDistance:0.00000 +Comp25StartTime:2011-06-23 13:25:00 +Comp25PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp25ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp25RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp26UUID:5f520bea-9d15-11e0-85be-406186cbf87c +Comp26Name:Henge +Comp26NameShort:GER8932 +Comp26Color:808000 +Comp26Nationality:GER +Comp26Description: +Comp26Handicap:1.0000000000 +Comp26HandicapDistance:0.00000 +Comp26StartTime:2011-06-23 13:25:00 +Comp26PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp26ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp26RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp27UUID:63855546-9d15-11e0-85be-406186cbf87c +Comp27Name:Rasenack +Comp27NameShort:GER8956 +Comp27Color:FFFFFF +Comp27Nationality:GER +Comp27Description: +Comp27Handicap:1.0000000000 +Comp27HandicapDistance:0.00000 +Comp27StartTime:2011-06-23 13:25:00 +Comp27PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp27ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp27RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp28UUID:68315036-9d15-11e0-85be-406186cbf87c +Comp28Name:Roos +Comp28NameShort:GER8972 +Comp28Color:FFFF00 +Comp28Nationality:GER +Comp28Description: +Comp28Handicap:1.0000000000 +Comp28HandicapDistance:0.00000 +Comp28StartTime:2011-06-23 13:25:00 +Comp28PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp28ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp28RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp29UUID:70eb542e-9d15-11e0-85be-406186cbf87c +Comp29Name:Achterberg +Comp29NameShort:GER8990 +Comp29Color:008080 +Comp29Nationality:GER +Comp29Description: +Comp29Handicap:1.0000000000 +Comp29HandicapDistance:0.00000 +Comp29StartTime:2011-06-23 13:25:00 +Comp29PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp29ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp29RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp30UUID:75325a1e-9d15-11e0-85be-406186cbf87c +Comp30Name:Lehmann +Comp30NameShort:GER8992 +Comp30Color:800000 +Comp30Nationality:GER +Comp30Description: +Comp30Handicap:1.0000000000 +Comp30HandicapDistance:0.00000 +Comp30StartTime:2011-06-23 13:25:00 +Comp30PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp30ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp30RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp31UUID:7e051528-9d15-11e0-85be-406186cbf87c +Comp31Name:Böger +Comp31NameShort:GER902 +Comp31Color:00FFFF +Comp31Nationality:GER +Comp31Description: +Comp31Handicap:1.0000000000 +Comp31HandicapDistance:0.00000 +Comp31StartTime:2011-06-23 13:25:00 +Comp31PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp31ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp31RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp32UUID:826bdcb4-9d15-11e0-85be-406186cbf87c +Comp32Name:Dr.Plattner +Comp32NameShort:GER9026 +Comp32Color:000000 +Comp32Nationality:GER +Comp32Description: +Comp32Handicap:1.0000000000 +Comp32HandicapDistance:0.00000 +Comp32StartTime:2011-06-23 13:25:00 +Comp32PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp32ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp32RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp33UUID:86d2fb5c-9d15-11e0-85be-406186cbf87c +Comp33Name:Hunger +Comp33NameShort:GER9027 +Comp33Color:0000FF +Comp33Nationality:GER +Comp33Description: +Comp33Handicap:1.0000000000 +Comp33HandicapDistance:0.00000 +Comp33StartTime:2011-06-23 13:25:00 +Comp33PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp33ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp33RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp34UUID:8b618332-9d15-11e0-85be-406186cbf87c +Comp34Name:Köchlin +Comp34NameShort:GER9028 +Comp34Color:FF00FF +Comp34Nationality:GER +Comp34Description: +Comp34Handicap:1.0000000000 +Comp34HandicapDistance:0.00000 +Comp34StartTime:2011-06-23 13:25:00 +Comp34PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp34ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp34RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp35UUID:949b11b6-9d15-11e0-85be-406186cbf87c +Comp35Name:Böhm +Comp35NameShort:GER9035 +Comp35Color:00FF00 +Comp35Nationality:GER +Comp35Description: +Comp35Handicap:1.0000000000 +Comp35HandicapDistance:0.00000 +Comp35StartTime:2011-06-23 13:25:00 +Comp35PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp35ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp35RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp36UUID:991ab354-9d15-11e0-85be-406186cbf87c +Comp36Name:Dasenbrook +Comp36NameShort:GER9040 +Comp36Color:FF0000 +Comp36Nationality:GER +Comp36Description: +Comp36Handicap:1.0000000000 +Comp36HandicapDistance:0.00000 +Comp36StartTime:2011-06-23 13:25:00 +Comp36PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp36ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp36RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp37UUID:9d4e23d4-9d15-11e0-85be-406186cbf87c +Comp37Name:Birkner +Comp37NameShort:GER9043 +Comp37Color:808000 +Comp37Nationality:GER +Comp37Description: +Comp37Handicap:1.0000000000 +Comp37HandicapDistance:0.00000 +Comp37StartTime:2011-06-23 13:25:00 +Comp37PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp37ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp37RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp38UUID:a1f9ca46-9d15-11e0-85be-406186cbf87c +Comp38Name:Fischer +Comp38NameShort:GER9054 +Comp38Color:FFFFFF +Comp38Nationality:GER +Comp38Description: +Comp38Handicap:1.0000000000 +Comp38HandicapDistance:0.00000 +Comp38StartTime:2011-06-23 13:25:00 +Comp38PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp38ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp38RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp39UUID:aa852246-9d15-11e0-85be-406186cbf87c +Comp39Name:Schomäker +Comp39NameShort:GER9070 +Comp39Color:800080 +Comp39Nationality:GER +Comp39Description: +Comp39Handicap:1.0000000000 +Comp39HandicapDistance:0.00000 +Comp39StartTime:2011-06-23 13:25:00 +Comp39PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp39ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp39RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +Comp40UUID:aec14cd6-9d15-11e0-85be-406186cbf87c +Comp40Name:Hastenpflug +Comp40NameShort:SWE8912 +Comp40Color:008080 +Comp40Nationality:SWE +Comp40Description: +Comp40Handicap:1.0000000000 +Comp40HandicapDistance:0.00000 +Comp40StartTime:2011-06-23 13:25:00 +Comp40PictureUUID:ebb4c5da-9934-11e0-85be-406186cbf87c +Comp40ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp40RouteUUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c + +ControlPoint1UUID:07d84022-9951-11e0-85be-406186cbf87c +ControlPoint1Name:D Mark4 +ControlPoint1HasTwoPoints:1 +ControlPoint1ShortName:4 +ControlPoint1Mark1Lon:10.169475 +ControlPoint1Mark1Lat:54.428818 +ControlPoint1Mark2Lon:10.169460 +ControlPoint1Mark2Lat:54.428757 + +ControlPoint2UUID:0807af7c-9b42-11e0-85be-406186cbf87c +ControlPoint2Name:Star-R6-1 +ControlPoint2HasTwoPoints:0 +ControlPoint2ShortName:1 +ControlPoint2Mark1Lon:10.235563 +ControlPoint2Mark1Lat:54.504244 + +ControlPoint3UUID:0beb273c-992f-11e0-85be-406186cbf87c +ControlPoint3Name:Finish Silbernes Band +ControlPoint3HasTwoPoints:1 +ControlPoint3ShortName:F +ControlPoint3Mark1Lon:10.000465 +ControlPoint3Mark1Lat:54.273018 +ControlPoint3Mark2Lon:10.273137 +ControlPoint3Mark2Lat:54.500737 + +ControlPoint4UUID:144f44f4-9dac-11e0-85be-406186cbf87c +ControlPoint4Name:SB-Mark H5 (y) (WP 33) +ControlPoint4HasTwoPoints:0 +ControlPoint4ShortName:H5 +ControlPoint4Mark1Lon:10.666667 +ControlPoint4Mark1Lat:54.548333 + +ControlPoint5UUID:18e98784-9930-11e0-85be-406186cbf87c +ControlPoint5Name:Start Silbernes Band +ControlPoint5HasTwoPoints:1 +ControlPoint5ShortName:S +ControlPoint5Mark1Lon:10.171790 +ControlPoint5Mark1Lat:54.436000 +ControlPoint5Mark2Lon:10.172257 +ControlPoint5Mark2Lat:54.436363 + +ControlPoint6UUID:1d8536e6-9a91-11e0-85be-406186cbf87c +ControlPoint6Name:Star1-4 +ControlPoint6HasTwoPoints:1 +ControlPoint6ShortName:4 +ControlPoint6Mark1Lon:10.219525 +ControlPoint6Mark1Lat:54.500618 +ControlPoint6Mark2Lon:10.220421 +ControlPoint6Mark2Lat:54.500744 + +ControlPoint7UUID:22475d30-9951-11e0-85be-406186cbf87c +ControlPoint7Name:Audi Start +ControlPoint7HasTwoPoints:1 +ControlPoint7ShortName:S +ControlPoint7Mark1Lon:10.169428 +ControlPoint7Mark1Lat:54.428623 +ControlPoint7Mark2Lon:10.168688 +ControlPoint7Mark2Lat:54.346428 + +ControlPoint8UUID:2307bec6-992f-11e0-85be-406186cbf87c +ControlPoint8Name:Mark KO2 red/white +ControlPoint8HasTwoPoints:0 +ControlPoint8ShortName:KO +ControlPoint8Mark1Lon:10.450000 +ControlPoint8Mark1Lat:54.533333 + +ControlPoint9UUID:2497f822-9ab1-11e0-85be-406186cbf87c +ControlPoint9Name:49Y-R7-1 +ControlPoint9HasTwoPoints:0 +ControlPoint9ShortName:1 +ControlPoint9Mark1Lon:10.207426 +ControlPoint9Mark1Lat:54.435751 + +ControlPoint10UUID:27c13096-9a8d-11e0-85be-406186cbf87c +ControlPoint10Name:49b4-4 +ControlPoint10HasTwoPoints:1 +ControlPoint10ShortName:4 +ControlPoint10Mark1Lon:10.208914 +ControlPoint10Mark1Lat:54.445496 +ControlPoint10Mark2Lon:10.209630 +ControlPoint10Mark2Lat:54.444822 + +ControlPoint11UUID:2c8584ca-9dac-11e0-85be-406186cbf87c +ControlPoint11Name:SB-Finish (Ziel) at Kiel Lighthouse +ControlPoint11HasTwoPoints:0 +ControlPoint11ShortName:KL +ControlPoint11Mark1Lon:10.278333 +ControlPoint11Mark1Lat:54.498333 + +ControlPoint12UUID:32ad8a14-992e-11e0-85be-406186cbf87c +ControlPoint12Name:Mark 14 red (Fahrwassertonne 14) +ControlPoint12HasTwoPoints:0 +ControlPoint12ShortName:14 +ControlPoint12Mark1Lon:10.185000 +ControlPoint12Mark1Lat:54.371667 + +ControlPoint13UUID:32fb2850-9951-11e0-85be-406186cbf87c +ControlPoint13Name:Audi Mark1 +ControlPoint13HasTwoPoints:0 +ControlPoint13ShortName:1 +ControlPoint13Mark1Lon:10.169383 +ControlPoint13Mark1Lat:54.428848 + +ControlPoint14UUID:34feeaea-9c32-11e0-85be-406186cbf87c +ControlPoint14Name:Star7-1a +ControlPoint14HasTwoPoints:0 +ControlPoint14ShortName:1a +ControlPoint14Mark1Lon:10.230608 +ControlPoint14Mark1Lat:54.508407 + +ControlPoint15UUID:3ecf9ade-992f-11e0-85be-406186cbf87c +ControlPoint15Name:Schlei Safe Water Mark red/white +ControlPoint15HasTwoPoints:0 +ControlPoint15ShortName:SS +ControlPoint15Mark1Lon:10.055000 +ControlPoint15Mark1Lat:54.668333 + +ControlPoint16UUID:405f346c-99e9-11e0-85be-406186cbf87c +ControlPoint16Name:49erYR2-1 +ControlPoint16HasTwoPoints:0 +ControlPoint16ShortName:1 +ControlPoint16Mark1Lon:10.200182 +ControlPoint16Mark1Lat:54.427670 + +ControlPoint17UUID:4123b6ea-9951-11e0-85be-406186cbf87c +ControlPoint17Name:Audi Mark2 +ControlPoint17HasTwoPoints:0 +ControlPoint17ShortName:2 +ControlPoint17Mark1Lon:10.169350 +ControlPoint17Mark1Lat:54.428940 + +ControlPoint18UUID:4bac3eca-992e-11e0-85be-406186cbf87c +ControlPoint18Name:Three yellow marks* (3 gelbe Tonnen) +ControlPoint18HasTwoPoints:0 +ControlPoint18ShortName:3y +ControlPoint18Mark1Lon:10.198333 +ControlPoint18Mark1Lat:54.386667 + +ControlPoint19UUID:535fb3f4-9951-11e0-85be-406186cbf87c +ControlPoint19Name:Audi Finish +ControlPoint19HasTwoPoints:1 +ControlPoint19ShortName:F +ControlPoint19Mark1Lon:10.159173 +ControlPoint19Mark1Lat:54.341737 +ControlPoint19Mark2Lon:10.169527 +ControlPoint19Mark2Lat:54.429047 + +ControlPoint20UUID:56f63cf8-99e8-11e0-85be-406186cbf87c +ControlPoint20Name:49erYR1-T +ControlPoint20HasTwoPoints:0 +ControlPoint20ShortName:T +ControlPoint20Mark1Lon:10.199148 +ControlPoint20Mark1Lat:54.429370 + +ControlPoint21UUID:5933cdca-9950-11e0-85be-406186cbf87c +ControlPoint21Name:H Start +ControlPoint21HasTwoPoints:1 +ControlPoint21ShortName:S +ControlPoint21Mark1Lon:10.169285 +ControlPoint21Mark1Lat:54.428848 +ControlPoint21Mark2Lon:10.169413 +ControlPoint21Mark2Lat:54.428753 + +ControlPoint22UUID:65b2dfbc-9b64-11e0-85be-406186cbf87c +ControlPoint22Name:K Start +ControlPoint22HasTwoPoints:1 +ControlPoint22ShortName:S +ControlPoint22Mark1Lon:10.205912 +ControlPoint22Mark1Lat:54.497498 +ControlPoint22Mark2Lon:10.203480 +ControlPoint22Mark2Lat:54.498760 + +ControlPoint23UUID:65c3a9ec-992e-11e0-85be-406186cbf87c +ControlPoint23Name:Mark 4 red (Fahrwassertonne 4) +ControlPoint23HasTwoPoints:0 +ControlPoint23ShortName:4 +ControlPoint23Mark1Lon:10.233333 +ControlPoint23Mark1Lat:54.428333 + +ControlPoint24UUID:69a347b2-9950-11e0-85be-406186cbf87c +ControlPoint24Name:H Mark1 +ControlPoint24HasTwoPoints:0 +ControlPoint24ShortName:1 +ControlPoint24Mark1Lon:10.169690 +ControlPoint24Mark1Lat:54.428840 + +ControlPoint25UUID:6c30e118-9a8d-11e0-85be-406186cbf87c +ControlPoint25Name:49b4-F +ControlPoint25HasTwoPoints:1 +ControlPoint25ShortName:F +ControlPoint25Mark1Lon:10.209712 +ControlPoint25Mark1Lat:54.445952 +ControlPoint25Mark2Lon:10.210658 +ControlPoint25Mark2Lat:54.445241 + +ControlPoint26UUID:7634bbfe-9dac-11e0-85be-406186cbf87c +ControlPoint26Name:SB-Mark Red (WP 124) +ControlPoint26HasTwoPoints:0 +ControlPoint26ShortName:WP +ControlPoint26Mark1Lon:10.236667 +ControlPoint26Mark1Lat:55.045000 + +ControlPoint27UUID:79dab2ea-9aaf-11e0-85be-406186cbf87c +ControlPoint27Name:49erB5-4 +ControlPoint27HasTwoPoints:1 +ControlPoint27ShortName:4 +ControlPoint27Mark1Lon:10.201355 +ControlPoint27Mark1Lat:54.446073 +ControlPoint27Mark2Lon:10.197830 +ControlPoint27Mark2Lat:54.446886 + +ControlPoint28UUID:7a218886-9b64-11e0-85be-406186cbf87c +ControlPoint28Name:K Mark1 +ControlPoint28HasTwoPoints:0 +ControlPoint28ShortName:1 +ControlPoint28Mark1Lon:10.174787 +ControlPoint28Mark1Lat:54.492633 + +ControlPoint29UUID:7c639ea8-9da9-11e0-85be-406186cbf87c +ControlPoint29Name:SB Mark1 (Schleimünde Approach (r/w) ) +ControlPoint29HasTwoPoints:0 +ControlPoint29ShortName:1 +ControlPoint29Mark1Lon:10.060000 +ControlPoint29Mark1Lat:54.665000 + +ControlPoint30UUID:8145342e-992e-11e0-85be-406186cbf87c +ControlPoint30Name:Mark 2 red (Fahrwassertonne 2) +ControlPoint30HasTwoPoints:0 +ControlPoint30ShortName:2 +ControlPoint30Mark1Lon:10.283333 +ControlPoint30Mark1Lat:54.465000 + +ControlPoint31UUID:84009c94-98e3-11e0-85be-406186cbf87c +ControlPoint31Name:Test - Top Mark +ControlPoint31HasTwoPoints:0 +ControlPoint31ShortName:1 +ControlPoint31Mark1Lon:10.169028 +ControlPoint31Mark1Lat:54.428993 + +ControlPoint32UUID:86c90a6e-9a9c-11e0-85be-406186cbf87c +ControlPoint32Name:S3-4 +ControlPoint32HasTwoPoints:1 +ControlPoint32ShortName:4 +ControlPoint32Mark1Lon:10.218663 +ControlPoint32Mark1Lat:54.515525 +ControlPoint32Mark2Lon:10.218214 +ControlPoint32Mark2Lat:54.515649 + +ControlPoint33UUID:8d1c4750-9b64-11e0-85be-406186cbf87c +ControlPoint33Name:K Mark2 +ControlPoint33HasTwoPoints:0 +ControlPoint33ShortName:2 +ControlPoint33Mark1Lon:10.170753 +ControlPoint33Mark1Lat:54.429023 + +ControlPoint34UUID:99cae4d0-992e-11e0-85be-406186cbf87c +ControlPoint34Name:Mark 1 green (Fahrwassertonne 1) +ControlPoint34HasTwoPoints:0 +ControlPoint34ShortName:1 +ControlPoint34Mark1Lon:10.251667 +ControlPoint34Mark1Lat:54.475000 + +ControlPoint35UUID:9beca160-9a8f-11e0-85be-406186cbf87c +ControlPoint35Name:49erb1-1 +ControlPoint35HasTwoPoints:0 +ControlPoint35ShortName:T +ControlPoint35Mark1Lon:10.196778 +ControlPoint35Mark1Lat:54.439621 + +ControlPoint36UUID:9c4e4984-9a93-11e0-85be-406186cbf87c +ControlPoint36Name:Star2-4 +ControlPoint36HasTwoPoints:1 +ControlPoint36ShortName:4 +ControlPoint36Mark1Lon:10.230194 +ControlPoint36Mark1Lat:54.504793 +ControlPoint36Mark2Lon:10.229448 +ControlPoint36Mark2Lat:54.505033 + +ControlPoint37UUID:9caa2f3a-98e3-11e0-85be-406186cbf87c +ControlPoint37Name:Test - start +ControlPoint37HasTwoPoints:1 +ControlPoint37ShortName:S +ControlPoint37Mark1Lon:10.169440 +ControlPoint37Mark1Lat:54.428712 +ControlPoint37Mark2Lon:10.169403 +ControlPoint37Mark2Lat:54.428872 + +ControlPoint38UUID:9da911ea-9950-11e0-85be-406186cbf87c +ControlPoint38Name:H Mark4 +ControlPoint38HasTwoPoints:1 +ControlPoint38ShortName:4 +ControlPoint38Mark1Lon:10.199247 +ControlPoint38Mark1Lat:54.426952 +ControlPoint38Mark2Lon:10.169390 +ControlPoint38Mark2Lat:54.428780 + +ControlPoint39UUID:a0cbd40c-9dab-11e0-85be-406186cbf87c +ControlPoint39Name:SB-Mark Schleimünde Approach (r/w) +ControlPoint39HasTwoPoints:0 +ControlPoint39ShortName:SA +ControlPoint39Mark1Lon:10.060000 +ControlPoint39Mark1Lat:54.665000 + +ControlPoint40UUID:a68cc03e-9b64-11e0-85be-406186cbf87c +ControlPoint40Name:K Mark3 +ControlPoint40HasTwoPoints:1 +ControlPoint40ShortName:3 +ControlPoint40Mark1Lon:10.169493 +ControlPoint40Mark1Lat:54.428673 +ControlPoint40Mark2Lon:10.242970 +ControlPoint40Mark2Lat:54.475930 + +ControlPoint41UUID:a8c75c3e-9a8c-11e0-85be-406186cbf87c +ControlPoint41Name:49b4-Start +ControlPoint41HasTwoPoints:1 +ControlPoint41ShortName:S +ControlPoint41Mark1Lon:10.209545 +ControlPoint41Mark1Lat:54.446065 +ControlPoint41Mark2Lon:10.211504 +ControlPoint41Mark2Lat:54.444520 + +ControlPoint42UUID:a91da4ea-9dac-11e0-85be-406186cbf87c +ControlPoint42Name:SB-Mark Thurö Rev (Y/B) (WP 277) +ControlPoint42HasTwoPoints:0 +ControlPoint42ShortName:Th +ControlPoint42Mark1Lon:10.735000 +ControlPoint42Mark1Lat:55.020000 + +ControlPoint43UUID:b2ad1adc-9950-11e0-85be-406186cbf87c +ControlPoint43Name:H Finish +ControlPoint43HasTwoPoints:1 +ControlPoint43ShortName:F +ControlPoint43Mark1Lon:10.169407 +ControlPoint43Mark1Lat:54.428787 +ControlPoint43Mark2Lon:10.169665 +ControlPoint43Mark2Lat:54.428878 + +ControlPoint44UUID:b31eaad0-9dab-11e0-85be-406186cbf87c +ControlPoint44Name:SB-Mark Spodsbjerg-SE +ControlPoint44HasTwoPoints:0 +ControlPoint44ShortName:Sp +ControlPoint44Mark1Lon:10.845000 +ControlPoint44Mark1Lat:54.918333 + +ControlPoint45UUID:b3af1998-992e-11e0-85be-406186cbf87c +ControlPoint45Name:Mark K yellow (Kabeltonne) +ControlPoint45HasTwoPoints:0 +ControlPoint45ShortName:K +ControlPoint45Mark1Lon:10.255000 +ControlPoint45Mark1Lat:54.488333 + +ControlPoint46UUID:bfe4dc42-9b64-11e0-85be-406186cbf87c +ControlPoint46Name:K Mark4 +ControlPoint46HasTwoPoints:1 +ControlPoint46ShortName:4 +ControlPoint46Mark1Lon:10.200983 +ControlPoint46Mark1Lat:54.499038 +ControlPoint46Mark2Lon:10.200347 +ControlPoint46Mark2Lat:54.499482 + +ControlPoint47UUID:c2199936-9dac-11e0-85be-406186cbf87c +ControlPoint47Name:SB-Mark Black Yellow (WP 253) +ControlPoint47HasTwoPoints:0 +ControlPoint47ShortName:BY +ControlPoint47Mark1Lon:10.936667 +ControlPoint47Mark1Lat:55.185000 + +ControlPoint48UUID:c583e438-9950-11e0-85be-406186cbf87c +ControlPoint48Name:D Start +ControlPoint48HasTwoPoints:1 +ControlPoint48ShortName:S +ControlPoint48Mark1Lon:10.169282 +ControlPoint48Mark1Lat:54.428715 +ControlPoint48Mark2Lon:10.169437 +ControlPoint48Mark2Lat:54.428597 + +ControlPoint49UUID:cd57b5f8-992e-11e0-85be-406186cbf87c +ControlPoint49Name:Stollergrund-N (black/yellow) +ControlPoint49HasTwoPoints:0 +ControlPoint49ShortName:SN +ControlPoint49Mark1Lon:10.200000 +ControlPoint49Mark1Lat:54.536667 + +ControlPoint50UUID:d2b4c5d2-9950-11e0-85be-406186cbf87c +ControlPoint50Name:D Mark1 +ControlPoint50HasTwoPoints:0 +ControlPoint50ShortName:1 +ControlPoint50Mark1Lon:10.166928 +ControlPoint50Mark1Lat:54.345997 + +ControlPoint51UUID:de21cff2-9ab6-11e0-85be-406186cbf87c +ControlPoint51Name:49Y-R8-1a +ControlPoint51HasTwoPoints:0 +ControlPoint51ShortName:1 +ControlPoint51Mark1Lon:10.207476 +ControlPoint51Mark1Lat:54.435762 + +ControlPoint52UUID:e299f688-9dac-11e0-85be-406186cbf87c +ControlPoint52Name:SB-Gate DW 59 green and DW 56 red +ControlPoint52HasTwoPoints:0 +ControlPoint52ShortName:59 +ControlPoint52Mark1Lon:10.780000 +ControlPoint52Mark1Lat:54.736667 + +ControlPoint53UUID:e59815c6-9b64-11e0-85be-406186cbf87c +ControlPoint53Name:K Finish +ControlPoint53HasTwoPoints:1 +ControlPoint53ShortName:F +ControlPoint53Mark1Lon:10.169688 +ControlPoint53Mark1Lat:54.489167 +ControlPoint53Mark2Lon:10.170013 +ControlPoint53Mark2Lat:54.488803 + +ControlPoint54UUID:e663db6c-9a8c-11e0-85be-406186cbf87c +ControlPoint54Name:49b4-1 +ControlPoint54HasTwoPoints:0 +ControlPoint54ShortName:1 +ControlPoint54Mark1Lon:10.196146 +ControlPoint54Mark1Lat:54.441407 + +ControlPoint55UUID:f214ea50-992e-11e0-85be-406186cbf87c +ControlPoint55Name:Gate between Mittelgrund-N +ControlPoint55HasTwoPoints:0 +ControlPoint55ShortName:MN +ControlPoint55Mark1Lon:10.055000 +ControlPoint55Mark1Lat:54.513333 + +ControlPoint56UUID:f641d92e-9ab6-11e0-85be-406186cbf87c +ControlPoint56Name:49Y-R8-1b +ControlPoint56HasTwoPoints:0 +ControlPoint56ShortName:1 +ControlPoint56Mark1Lon:10.203712 +ControlPoint56Mark1Lat:54.434916 + +ControlPoint57UUID:f76bea2c-9a95-11e0-85be-406186cbf87c +ControlPoint57Name:DIM1-F +ControlPoint57HasTwoPoints:1 +ControlPoint57ShortName:F +ControlPoint57Mark1Lon:9.850912 +ControlPoint57Mark1Lat:54.474097 +ControlPoint57Mark2Lon:9.849851 +ControlPoint57Mark2Lat:54.472319 + + +SegmentFile:segments.php +Route1UUID:09ba5a4a-9d9a-11e0-85be-406186cbf87c +Route1Description:505 Race 2 +Route1Length:0 +Route1ControlPoint1UUID:65b2dfbc-9b64-11e0-85be-406186cbf87c +Route1ControlPoint2UUID:7a218886-9b64-11e0-85be-406186cbf87c +Route1ControlPoint3UUID:bfe4dc42-9b64-11e0-85be-406186cbf87c +Route1ControlPoint4UUID:7a218886-9b64-11e0-85be-406186cbf87c +Route1ControlPoint5UUID:bfe4dc42-9b64-11e0-85be-406186cbf87c +Route1ControlPoint6UUID:e59815c6-9b64-11e0-85be-406186cbf87c + +//-------- AUTO GENERATED PARAMETERS END ------------------ diff --git a/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_3.mtb b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_3.mtb new file mode 100644 index 00000000000..900aff34e17 Binary files /dev/null and b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_3.mtb differ diff --git a/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_3.txt b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_3.txt new file mode 100644 index 00000000000..b5231fd4c60 --- /dev/null +++ b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_Race_3.txt @@ -0,0 +1,1419 @@ +stored-uri:datafiles/event_20110609_KielerWoch-505_Race_3.mtb +StartReplay:1 + +// Input from params_static: + +// Input from event_parameters: + +CompMarkerUUID:1 +CodanIsSponsor:0 +EnablePrint:1 +DefaultTailLength:60 +APzoomChangeTime:2500 +disableAutoProduce:0 +autoProduce:0 +APstartLineShowOfLeg:0.25 +APsideOfStartLine:0.30 +APstartSwitch:0.8 +APwholeLegBehindMarks:0.15 +APmarkSwitch:0.13 +APmarkZoomBehindMarks:0.10 +APmarkZoomInFrontOfMarks:0.20 +PopupMarkerUUID:2 +ManualUrl:http://www.tractrac.com/files/userguide_sailing.pdf +WeatherLat1:56 +WeatherLat2:54 +Marker1UUID:1 +Marker1Type:RGBMarkerFactory +Marker1Directional:1 +Marker1Image:markers/boat_FF0000_big.png +Marker1MetersPerPixel:0.0617 +Marker1MinScale:0.396 +Startlocation:10.197659,54.456129 +MaxDiffTime:600 +MaxMetersPerSecond:20 +PrecisionMeters:20 +ShortAvgTime:180 +LongAvgTime:900 +TimeZone:2 +CompMarkerTimeout:60 +FramesPerSecond:8 +replayspeedup:5 +MatchRaceClock:0 +MatchRaceClockNo:3 +MatchRaceClockSpacing:300 +Minimap:1 +MinimapUseLayers:1 +Minimapgeorect:9.840775,54.516538,10.3022,54.309554 +MinimapMarkerUUID:2 +Marker4UUID:2 +Marker4Type:RGBmarkerFactory +Marker4Directional:1 +Marker4Image:markers/boat_FF0000_small.png +MetersPerPixel:25 +MetersPerPixelMax:200 +MetersPerPixelMin:0.2 +isMatchRace:0 +weatherEnabled:0 +showRaceClock:1 +BackGroundImage:graphics/background.jpg +DisableRotation:0 +ControlPointMarkerRadius:13 +disableselection:0 +disableleaderline:0 +WeatherLon1:9 +WeatherLon2:12 +DisableChangeRace:0 +PopUpRow1Name: +PopUpRow1Type:Name +PopUpRow2Name:Knots +PopUpRow2Type:BoatSpeed +PopUpRow3Name:Ranking +PopUpRow3Type:RowNumber +PopUpRow4Name:Sail +PopUpRow4Type:Ini +PopUpRow5Name:After +PopUpRow5Type:BoatAfter +ResultColumn1Name:# +ResultColumn1Size:20 +ResultColumn1Type:RowNumber +ResultColumn2Size:20 +ResultColumn2Type:ColorMarker +ResultColumn3Name:sail +ResultColumn3Size:60 +ResultColumn3Type:Ini +ResultColumn4Name:name +ResultColumn4Size:110 +ResultColumn4Type:Name +ResultColumn5Name:after +ResultColumn5Size:45 +ResultColumn5Type:BoatAfter +ResultColumn6Name:kts +ResultColumn6Size:40 +ResultColumn6Type:BoatSpeed +DisableLeaderboard:0 +DisableAnalysis:0 +TableFontSize:11 +//live-uri:tcp://germanmaster.traclive.dk:4400 +//stored-uri:tcp://germanmaster.traclive.dk:4401 +compInitialsFontSize:11 +AutoRotate:0 +MassStart:0 +SegmentFile:segments.php +StartType:Mass +ReCalcDirAndSpeed:0 +RaceHandicapSystem:NONE +TeamCompetitionType:NONE +LiveDelaySecs: 180 + +//-------- AUTO GENERATED PARAMETERS START ---------------- + +EventID:f34b232a-934e-11e0-b3bb-406186cbf87c +EventName:Kieler Woche +EventDB:event_20110609_KielerWoch +EventStartTime:2011-06-15 09:00:00 +EventEndTime:2011-06-26 23:59:00 + +RaceID:e876c3a0-9da8-11e0-85be-406186cbf87c +RaceName:505 Race 3 +RaceStartTime:2011-06-23 15:13:00 +RaceEndTime: +RaceTrackingStartTime:2011-06-23 14:58:33 +RaceTrackingEndTime:2011-06-23 17:00:00 +RaceDefaultRouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c +RaceHandicapSystem:NONE + +Image1UUID:0ba089bc-996f-11e0-85be-406186cbf87c +Image1Type:Logo +Image1Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/URU.gif +Image1Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/URU.gif + +Image2UUID:1d548b00-996e-11e0-85be-406186cbf87c +Image2Type:Logo +Image2Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUT.gif +Image2Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUT.gif + +Image3UUID:1ece41fa-9c49-11e0-85be-406186cbf87c +Image3Type:Logo +Image3Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NZL.gif +Image3Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NZL.gif + +Image4UUID:22b1a988-98e3-11e0-85be-406186cbf87c +Image4Type:Logo +Image4Description:Veolia +Image4Image: + +Image5UUID:22ba0304-98d8-11e0-85be-406186cbf87c +Image5Type:Logo +Image5Description:Kieler Woche +Image5Image: + +Image6UUID:2767b7e8-996e-11e0-85be-406186cbf87c +Image6Type:Logo +Image6Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BEL.gif +Image6Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BEL.gif + +Image7UUID:2cda6f4a-996e-11e0-85be-406186cbf87c +Image7Type:Logo +Image7Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BRA.gif +Image7Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BRA.gif + +Image8UUID:3313b588-98d8-11e0-85be-406186cbf87c +Image8Type:Logo +Image8Description:Audi +Image8Image: + +Image9UUID:33a26700-98e3-11e0-85be-406186cbf87c +Image9Type:Logo +Image9Description:HSH NORDBANK +Image9Image: + +Image10UUID:373009a0-996e-11e0-85be-406186cbf87c +Image10Type:Logo +Image10Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CHI.gif +Image10Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CHI.gif + +Image11UUID:4cc5360a-996e-11e0-85be-406186cbf87c +Image11Type:Logo +Image11Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/EST.gif +Image11Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/EST.gif + +Image12UUID:514008f8-98e3-11e0-85be-406186cbf87c +Image12Type:Logo +Image12Description:ISAF SAILING WORLDCUP +Image12Image: + +Image13UUID:5222c1c6-996e-11e0-85be-406186cbf87c +Image13Type:Logo +Image13Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/FRA.gif +Image13Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/FRA.gif + +Image14UUID:574e0d40-98d8-11e0-85be-406186cbf87c +Image14Type:Logo +Image14Description:SAP +Image14Image: + +Image15UUID:617e8236-996e-11e0-85be-406186cbf87c +Image15Type:Logo +Image15Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GBR.gif +Image15Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GBR.gif + +Image16UUID:6d332670-9934-11e0-85be-406186cbf87c +Image16Type:Logo +Image16Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUS.gif +Image16Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUS.gif + +Image17UUID:7252c142-9934-11e0-85be-406186cbf87c +Image17Type:Logo +Image17Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CAN.gif +Image17Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CAN.gif + +Image18UUID:77555f2e-9934-11e0-85be-406186cbf87c +Image18Type:Logo +Image18Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CRO.gif +Image18Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CRO.gif + +Image19UUID:7c87105a-9934-11e0-85be-406186cbf87c +Image19Type:Logo +Image19Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/DEN.gif +Image19Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/DEN.gif + +Image20UUID:7deb67ce-9930-11e0-85be-406186cbf87c +Image20Type:Logo +Image20Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/RUS.gif +Image20Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/RUS.gif + +Image21UUID:81fea498-9930-11e0-85be-406186cbf87c +Image21Type:Logo +Image21Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GER.gif +Image21Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GER.gif + +Image22UUID:93a58cc0-9930-11e0-85be-406186cbf87c +Image22Type:Logo +Image22Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/USA.gif +Image22Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/USA.gif + +Image23UUID:bc6068c4-9d77-11e0-85be-406186cbf87c +Image23Type:Logo +Image23Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UAE.gif +Image23Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UAE.gif + +Image24UUID:be8c642a-996e-11e0-85be-406186cbf87c +Image24Type:Logo +Image24Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GRE.gif +Image24Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GRE.gif + +Image25UUID:c2fdb14c-9934-11e0-85be-406186cbf87c +Image25Type:Logo +Image25Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/HUN.gif +Image25Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/HUN.gif + +Image26UUID:c3a2eaa6-996e-11e0-85be-406186cbf87c +Image26Type:Logo +Image26Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/IRL.gif +Image26Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/IRL.gif + +Image27UUID:c85b16fc-9934-11e0-85be-406186cbf87c +Image27Type:Logo +Image27Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ISV.gif +Image27Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ISV.gif + +Image28UUID:c8eaf36e-996e-11e0-85be-406186cbf87c +Image28Type:Logo +Image28Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/MEX.gif +Image28Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/MEX.gif + +Image29UUID:cd74b15c-9934-11e0-85be-406186cbf87c +Image29Type:Logo +Image29Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ITA.gif +Image29Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ITA.gif + +Image30UUID:cdf05d40-996e-11e0-85be-406186cbf87c +Image30Type:Logo +Image30Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NED.gif +Image30Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NED.gif + +Image31UUID:d3764b44-996e-11e0-85be-406186cbf87c +Image31Type:Logo +Image31Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/POL.gif +Image31Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/POL.gif + +Image32UUID:d77c220c-9934-11e0-85be-406186cbf87c +Image32Type:Logo +Image32Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/JPN.gif +Image32Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/JPN.gif + +Image33UUID:dcb92152-9934-11e0-85be-406186cbf87c +Image33Type:Logo +Image33Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NOR.gif +Image33Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NOR.gif + +Image34UUID:e69d47f2-9934-11e0-85be-406186cbf87c +Image34Type:Logo +Image34Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SUI.gif +Image34Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SUI.gif + +Image35UUID:ebb4c5da-9934-11e0-85be-406186cbf87c +Image35Type:Logo +Image35Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SWE.gif +Image35Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SWE.gif + +Image36UUID:f5cab6b0-9934-11e0-85be-406186cbf87c +Image36Type:Logo +Image36Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UKR.gif +Image36Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UKR.gif + +Class1UUID:da553a2a-9d14-11e0-85be-406186cbf87c +Class1Name:5o5 + +Team1UUID:6cf050ac-9934-11e0-85be-406186cbf87c +Team1Name:AUS +Team1Comp1UUID:de7d2ba8-9d14-11e0-85be-406186cbf87c + +Team2UUID:1d07e516-996e-11e0-85be-406186cbf87c +Team2Name:AUT + +Team3UUID:271ac230-996e-11e0-85be-406186cbf87c +Team3Name:BEL + +Team4UUID:2c8e2630-996e-11e0-85be-406186cbf87c +Team4Name:BRA + +Team5UUID:7210a622-9934-11e0-85be-406186cbf87c +Team5Name:CAN + +Team6UUID:36ebe888-996e-11e0-85be-406186cbf87c +Team6Name:CHI + +Team7UUID:77133b08-9934-11e0-85be-406186cbf87c +Team7Name:CRO + +Team8UUID:7c3a4770-9934-11e0-85be-406186cbf87c +Team8Name:DEN +Team8Comp1UUID:e7bc96f4-9d14-11e0-85be-406186cbf87c +Team8Comp2UUID:f0c9604c-9d14-11e0-85be-406186cbf87c +Team8Comp3UUID:ec336744-9d14-11e0-85be-406186cbf87c +Team8Comp4UUID:e3587876-9d14-11e0-85be-406186cbf87c + +Team9UUID:4c650fc8-996e-11e0-85be-406186cbf87c +Team9Name:EST + +Team10UUID:51d56ce6-996e-11e0-85be-406186cbf87c +Team10Name:FRA +Team10Comp1UUID:f969da74-9d14-11e0-85be-406186cbf87c +Team10Comp2UUID:f50675be-9d14-11e0-85be-406186cbf87c +Team10Comp3UUID:fda897ba-9d14-11e0-85be-406186cbf87c + +Team11UUID:613a12ea-996e-11e0-85be-406186cbf87c +Team11Name:GBR + +Team12UUID:81b951d6-9930-11e0-85be-406186cbf87c +Team12Name:GER +Team12Comp1UUID:70eb542e-9d15-11e0-85be-406186cbf87c +Team12Comp2UUID:40bd6314-9d15-11e0-85be-406186cbf87c +Team12Comp3UUID:0a917a14-9d15-11e0-85be-406186cbf87c +Team12Comp4UUID:9d4e23d4-9d15-11e0-85be-406186cbf87c +Team12Comp5UUID:498b40ec-9d15-11e0-85be-406186cbf87c +Team12Comp6UUID:7e051528-9d15-11e0-85be-406186cbf87c +Team12Comp7UUID:949b11b6-9d15-11e0-85be-406186cbf87c +Team12Comp8UUID:991ab354-9d15-11e0-85be-406186cbf87c +Team12Comp9UUID:826bdcb4-9d15-11e0-85be-406186cbf87c +Team12Comp10UUID:3c1fb294-9d15-11e0-85be-406186cbf87c +Team12Comp11UUID:4e00eaa0-9d15-11e0-85be-406186cbf87c +Team12Comp12UUID:a1f9ca46-9d15-11e0-85be-406186cbf87c +Team12Comp13UUID:1cd7dcc2-9d15-11e0-85be-406186cbf87c +Team12Comp14UUID:5b14f704-9d15-11e0-85be-406186cbf87c +Team12Comp15UUID:5f520bea-9d15-11e0-85be-406186cbf87c +Team12Comp16UUID:86d2fb5c-9d15-11e0-85be-406186cbf87c +Team12Comp17UUID:13e98db8-9d15-11e0-85be-406186cbf87c +Team12Comp18UUID:21584926-9d15-11e0-85be-406186cbf87c +Team12Comp19UUID:450c5a92-9d15-11e0-85be-406186cbf87c +Team12Comp20UUID:8b618332-9d15-11e0-85be-406186cbf87c +Team12Comp21UUID:75325a1e-9d15-11e0-85be-406186cbf87c +Team12Comp22UUID:37b2223c-9d15-11e0-85be-406186cbf87c +Team12Comp23UUID:062ea47e-9d15-11e0-85be-406186cbf87c +Team12Comp24UUID:2a8fbab0-9d15-11e0-85be-406186cbf87c +Team12Comp25UUID:56b22d94-9d15-11e0-85be-406186cbf87c +Team12Comp26UUID:63855546-9d15-11e0-85be-406186cbf87c +Team12Comp27UUID:25ea8cce-9d15-11e0-85be-406186cbf87c +Team12Comp28UUID:68315036-9d15-11e0-85be-406186cbf87c +Team12Comp29UUID:aa852246-9d15-11e0-85be-406186cbf87c +Team12Comp30UUID:0f4448e8-9d15-11e0-85be-406186cbf87c +Team12Comp31UUID:1859e280-9d15-11e0-85be-406186cbf87c + +Team13UUID:be35f1ee-996e-11e0-85be-406186cbf87c +Team13Name:GRE + +Team14UUID:c2b1d6a0-9934-11e0-85be-406186cbf87c +Team14Name:HUN + +Team15UUID:c3601ba4-996e-11e0-85be-406186cbf87c +Team15Name:IRL + +Team16UUID:c818eb6a-9934-11e0-85be-406186cbf87c +Team16Name:ISV + +Team17UUID:cd2435f6-9934-11e0-85be-406186cbf87c +Team17Name:ITA + +Team18UUID:d737d124-9934-11e0-85be-406186cbf87c +Team18Name:JPN + +Team19UUID:c8a808d8-996e-11e0-85be-406186cbf87c +Team19Name:MEX + +Team20UUID:cdaadaae-996e-11e0-85be-406186cbf87c +Team20Name:NED + +Team21UUID:dc76ea44-9934-11e0-85be-406186cbf87c +Team21Name:NOR + +Team22UUID:1e8f7452-9c49-11e0-85be-406186cbf87c +Team22Name:NZL + +Team23UUID:d3297b7a-996e-11e0-85be-406186cbf87c +Team23Name:POL + +Team24UUID:7d9ca8fa-9930-11e0-85be-406186cbf87c +Team24Name:RUS + +Team25UUID:e6510b62-9934-11e0-85be-406186cbf87c +Team25Name:SUI + +Team26UUID:eb727d9c-9934-11e0-85be-406186cbf87c +Team26Name:SWE +Team26Comp1UUID:aec14cd6-9d15-11e0-85be-406186cbf87c + +Team27UUID:ffb184b0-98e4-11e0-85be-406186cbf87c +Team27Name:Test + +Team28UUID:bc22780c-9d77-11e0-85be-406186cbf87c +Team28Name:UAE + +Team29UUID:f57e7ea8-9934-11e0-85be-406186cbf87c +Team29Name:UKR + +Team30UUID:0b5469f6-996f-11e0-85be-406186cbf87c +Team30Name:URU + +Team31UUID:9361c468-9930-11e0-85be-406186cbf87c +Team31Name:USA +SELECT Competitors.UUID,FirstName,LastName,Initials,Color,Nationality,Description,Icon,Picture,ClassId,Handicap,HandicapDistance,StartTime FROM event_20110609_KielerWoch.RaceObject INNER JOIN event_20110609_KielerWoch.Competitors ON event_20110609_KielerWoch.RaceObject.TrackedObjectId = event_20110609_KielerWoch.Competitors.UUID WHERE RaceId='e876c3a0-9da8-11e0-85be-406186cbf87c' ORDER BY LID,StartTime,Competitors.UUID + + +Comp1UUID:de7d2ba8-9d14-11e0-85be-406186cbf87c +Comp1Name:Kevin +Comp1NameShort:AUS9061 +Comp1Color:FF0000 +Comp1Nationality:AUS +Comp1Description: +Comp1Handicap:1.0000000000 +Comp1HandicapDistance:0.00000 +Comp1StartTime:2011-06-23 15:13:00 +Comp1PictureUUID:6d332670-9934-11e0-85be-406186cbf87c +Comp1ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp1RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp2UUID:e3587876-9d14-11e0-85be-406186cbf87c +Comp2Name:van Wonterghem +Comp2NameShort:DEN8828 +Comp2Color:808000 +Comp2Nationality:DEN +Comp2Description: +Comp2Handicap:1.0000000000 +Comp2HandicapDistance:0.00000 +Comp2StartTime:2011-06-23 15:13:00 +Comp2PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp2ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp2RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp3UUID:e7bc96f4-9d14-11e0-85be-406186cbf87c +Comp3Name:Buhl +Comp3NameShort:DEN8958 +Comp3Color:FFFFFF +Comp3Nationality:DEN +Comp3Description: +Comp3Handicap:1.0000000000 +Comp3HandicapDistance:0.00000 +Comp3StartTime:2011-06-23 15:13:00 +Comp3PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp3ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp3RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp4UUID:ec336744-9d14-11e0-85be-406186cbf87c +Comp4Name:Saugmann +Comp4NameShort:DEN8964 +Comp4Color:FFFF00 +Comp4Nationality:DEN +Comp4Description: +Comp4Handicap:1.0000000000 +Comp4HandicapDistance:0.00000 +Comp4StartTime:2011-06-23 15:13:00 +Comp4PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp4ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp4RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp5UUID:f0c9604c-9d14-11e0-85be-406186cbf87c +Comp5Name:Bøjland +Comp5NameShort:DEN9023 +Comp5Color:800080 +Comp5Nationality:DEN +Comp5Description: +Comp5Handicap:1.0000000000 +Comp5HandicapDistance:0.00000 +Comp5StartTime:2011-06-23 15:13:00 +Comp5PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp5ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp5RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp6UUID:f50675be-9d14-11e0-85be-406186cbf87c +Comp6Name:Broise +Comp6NameShort:FRA8844 +Comp6Color:008080 +Comp6Nationality:FRA +Comp6Description: +Comp6Handicap:1.0000000000 +Comp6HandicapDistance:0.00000 +Comp6StartTime:2011-06-23 15:13:00 +Comp6PictureUUID:5222c1c6-996e-11e0-85be-406186cbf87c +Comp6ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp6RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp7UUID:f969da74-9d14-11e0-85be-406186cbf87c +Comp7Name:boite +Comp7NameShort:FRA8902 +Comp7Color:800000 +Comp7Nationality:FRA +Comp7Description: +Comp7Handicap:1.0000000000 +Comp7HandicapDistance:0.00000 +Comp7StartTime:2011-06-23 15:13:00 +Comp7PictureUUID:5222c1c6-996e-11e0-85be-406186cbf87c +Comp7ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp7RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp8UUID:fda897ba-9d14-11e0-85be-406186cbf87c +Comp8Name:de Lisle +Comp8NameShort:FRA9068 +Comp8Color:000080 +Comp8Nationality:FRA +Comp8Description: +Comp8Handicap:1.0000000000 +Comp8HandicapDistance:0.00000 +Comp8StartTime:2011-06-23 15:13:00 +Comp8PictureUUID:5222c1c6-996e-11e0-85be-406186cbf87c +Comp8ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp8RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp9UUID:062ea47e-9d15-11e0-85be-406186cbf87c +Comp9Name:Menge +Comp9NameShort:GER7861 +Comp9Color:000000 +Comp9Nationality:GER +Comp9Description: +Comp9Handicap:1.0000000000 +Comp9HandicapDistance:0.00000 +Comp9StartTime:2011-06-23 15:13:00 +Comp9PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp9ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp9RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp10UUID:0a917a14-9d15-11e0-85be-406186cbf87c +Comp10Name:Barop +Comp10NameShort:GER8392 +Comp10Color:0000FF +Comp10Nationality:GER +Comp10Description: +Comp10Handicap:1.0000000000 +Comp10HandicapDistance:0.00000 +Comp10StartTime:2011-06-23 15:13:00 +Comp10PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp10ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp10RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp11UUID:0f4448e8-9d15-11e0-85be-406186cbf87c +Comp11Name:Steffen +Comp11NameShort:GER8437 +Comp11Color:FF00FF +Comp11Nationality:GER +Comp11Description: +Comp11Handicap:1.0000000000 +Comp11HandicapDistance:0.00000 +Comp11StartTime:2011-06-23 15:13:00 +Comp11PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp11ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp11RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp12UUID:13e98db8-9d15-11e0-85be-406186cbf87c +Comp12Name:Katja +Comp12NameShort:GER8500 +Comp12Color:008000 +Comp12Nationality:GER +Comp12Description: +Comp12Handicap:1.0000000000 +Comp12HandicapDistance:0.00000 +Comp12StartTime:2011-06-23 15:13:00 +Comp12PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp12ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp12RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp13UUID:1859e280-9d15-11e0-85be-406186cbf87c +Comp13Name:von Nerée +Comp13NameShort:GER8522 +Comp13Color:00FF00 +Comp13Nationality:GER +Comp13Description: +Comp13Handicap:1.0000000000 +Comp13HandicapDistance:0.00000 +Comp13StartTime:2011-06-23 15:13:00 +Comp13PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp13ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp13RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp14UUID:1cd7dcc2-9d15-11e0-85be-406186cbf87c +Comp14Name:Goedeking +Comp14NameShort:GER8622 +Comp14Color:FF0000 +Comp14Nationality:GER +Comp14Description: +Comp14Handicap:1.0000000000 +Comp14HandicapDistance:0.00000 +Comp14StartTime:2011-06-23 15:13:00 +Comp14PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp14ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp14RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp15UUID:21584926-9d15-11e0-85be-406186cbf87c +Comp15Name:Kellner +Comp15NameShort:GER8651 +Comp15Color:808000 +Comp15Nationality:GER +Comp15Description: +Comp15Handicap:1.0000000000 +Comp15HandicapDistance:0.00000 +Comp15StartTime:2011-06-23 15:13:00 +Comp15PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp15ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp15RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp16UUID:25ea8cce-9d15-11e0-85be-406186cbf87c +Comp16Name:Reincke +Comp16NameShort:GER8656 +Comp16Color:FFFFFF +Comp16Nationality:GER +Comp16Description: +Comp16Handicap:1.0000000000 +Comp16HandicapDistance:0.00000 +Comp16StartTime:2011-06-23 15:13:00 +Comp16PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp16ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp16RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp17UUID:2a8fbab0-9d15-11e0-85be-406186cbf87c +Comp17Name:Neulen +Comp17NameShort:GER8657 +Comp17Color:FFFF00 +Comp17Nationality:GER +Comp17Description: +Comp17Handicap:1.0000000000 +Comp17HandicapDistance:0.00000 +Comp17StartTime:2011-06-23 15:13:00 +Comp17PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp17ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp17RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp18UUID:37b2223c-9d15-11e0-85be-406186cbf87c +Comp18Name:Lietz +Comp18NameShort:GER8721 +Comp18Color:800000 +Comp18Nationality:GER +Comp18Description: +Comp18Handicap:1.0000000000 +Comp18HandicapDistance:0.00000 +Comp18StartTime:2011-06-23 15:13:00 +Comp18PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp18ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp18RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp19UUID:3c1fb294-9d15-11e0-85be-406186cbf87c +Comp19Name:Feldmann +Comp19NameShort:GER8730 +Comp19Color:000080 +Comp19Nationality:GER +Comp19Description: +Comp19Handicap:1.0000000000 +Comp19HandicapDistance:0.00000 +Comp19StartTime:2011-06-23 15:13:00 +Comp19PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp19ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp19RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp20UUID:40bd6314-9d15-11e0-85be-406186cbf87c +Comp20Name:Anton +Comp20NameShort:GER8741 +Comp20Color:00FFFF +Comp20Nationality:GER +Comp20Description: +Comp20Handicap:1.0000000000 +Comp20HandicapDistance:0.00000 +Comp20StartTime:2011-06-23 15:13:00 +Comp20PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp20ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp20RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp21UUID:450c5a92-9d15-11e0-85be-406186cbf87c +Comp21Name:Kraft +Comp21NameShort:GER8843 +Comp21Color:000000 +Comp21Nationality:GER +Comp21Description: +Comp21Handicap:1.0000000000 +Comp21HandicapDistance:0.00000 +Comp21StartTime:2011-06-23 15:13:00 +Comp21PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp21ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp21RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp22UUID:498b40ec-9d15-11e0-85be-406186cbf87c +Comp22Name:Brill +Comp22NameShort:GER8874 +Comp22Color:0000FF +Comp22Nationality:GER +Comp22Description: +Comp22Handicap:1.0000000000 +Comp22HandicapDistance:0.00000 +Comp22StartTime:2011-06-23 15:13:00 +Comp22PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp22ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp22RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp23UUID:4e00eaa0-9d15-11e0-85be-406186cbf87c +Comp23Name:Findel +Comp23NameShort:GER8875 +Comp23Color:FF00FF +Comp23Nationality:GER +Comp23Description: +Comp23Handicap:1.0000000000 +Comp23HandicapDistance:0.00000 +Comp23StartTime:2011-06-23 15:13:00 +Comp23PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp23ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp23RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp24UUID:56b22d94-9d15-11e0-85be-406186cbf87c +Comp24Name:Pleßmann +Comp24NameShort:GER8927 +Comp24Color:00FF00 +Comp24Nationality:GER +Comp24Description: +Comp24Handicap:1.0000000000 +Comp24HandicapDistance:0.00000 +Comp24StartTime:2011-06-23 15:13:00 +Comp24PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp24ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp24RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp25UUID:5b14f704-9d15-11e0-85be-406186cbf87c +Comp25Name:Gosch +Comp25NameShort:GER8929 +Comp25Color:FF0000 +Comp25Nationality:GER +Comp25Description: +Comp25Handicap:1.0000000000 +Comp25HandicapDistance:0.00000 +Comp25StartTime:2011-06-23 15:13:00 +Comp25PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp25ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp25RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp26UUID:5f520bea-9d15-11e0-85be-406186cbf87c +Comp26Name:Henge +Comp26NameShort:GER8932 +Comp26Color:808000 +Comp26Nationality:GER +Comp26Description: +Comp26Handicap:1.0000000000 +Comp26HandicapDistance:0.00000 +Comp26StartTime:2011-06-23 15:13:00 +Comp26PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp26ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp26RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp27UUID:63855546-9d15-11e0-85be-406186cbf87c +Comp27Name:Rasenack +Comp27NameShort:GER8956 +Comp27Color:FFFFFF +Comp27Nationality:GER +Comp27Description: +Comp27Handicap:1.0000000000 +Comp27HandicapDistance:0.00000 +Comp27StartTime:2011-06-23 15:13:00 +Comp27PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp27ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp27RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp28UUID:68315036-9d15-11e0-85be-406186cbf87c +Comp28Name:Roos +Comp28NameShort:GER8972 +Comp28Color:FFFF00 +Comp28Nationality:GER +Comp28Description: +Comp28Handicap:1.0000000000 +Comp28HandicapDistance:0.00000 +Comp28StartTime:2011-06-23 15:13:00 +Comp28PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp28ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp28RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp29UUID:70eb542e-9d15-11e0-85be-406186cbf87c +Comp29Name:Achterberg +Comp29NameShort:GER8990 +Comp29Color:008080 +Comp29Nationality:GER +Comp29Description: +Comp29Handicap:1.0000000000 +Comp29HandicapDistance:0.00000 +Comp29StartTime:2011-06-23 15:13:00 +Comp29PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp29ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp29RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp30UUID:75325a1e-9d15-11e0-85be-406186cbf87c +Comp30Name:Lehmann +Comp30NameShort:GER8992 +Comp30Color:800000 +Comp30Nationality:GER +Comp30Description: +Comp30Handicap:1.0000000000 +Comp30HandicapDistance:0.00000 +Comp30StartTime:2011-06-23 15:13:00 +Comp30PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp30ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp30RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp31UUID:7e051528-9d15-11e0-85be-406186cbf87c +Comp31Name:Böger +Comp31NameShort:GER902 +Comp31Color:00FFFF +Comp31Nationality:GER +Comp31Description: +Comp31Handicap:1.0000000000 +Comp31HandicapDistance:0.00000 +Comp31StartTime:2011-06-23 15:13:00 +Comp31PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp31ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp31RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp32UUID:826bdcb4-9d15-11e0-85be-406186cbf87c +Comp32Name:Dr.Plattner +Comp32NameShort:GER9026 +Comp32Color:000000 +Comp32Nationality:GER +Comp32Description: +Comp32Handicap:1.0000000000 +Comp32HandicapDistance:0.00000 +Comp32StartTime:2011-06-23 15:13:00 +Comp32PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp32ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp32RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp33UUID:86d2fb5c-9d15-11e0-85be-406186cbf87c +Comp33Name:Hunger +Comp33NameShort:GER9027 +Comp33Color:0000FF +Comp33Nationality:GER +Comp33Description: +Comp33Handicap:1.0000000000 +Comp33HandicapDistance:0.00000 +Comp33StartTime:2011-06-23 15:13:00 +Comp33PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp33ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp33RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp34UUID:8b618332-9d15-11e0-85be-406186cbf87c +Comp34Name:Köchlin +Comp34NameShort:GER9028 +Comp34Color:FF00FF +Comp34Nationality:GER +Comp34Description: +Comp34Handicap:1.0000000000 +Comp34HandicapDistance:0.00000 +Comp34StartTime:2011-06-23 15:13:00 +Comp34PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp34ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp34RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp35UUID:949b11b6-9d15-11e0-85be-406186cbf87c +Comp35Name:Böhm +Comp35NameShort:GER9035 +Comp35Color:00FF00 +Comp35Nationality:GER +Comp35Description: +Comp35Handicap:1.0000000000 +Comp35HandicapDistance:0.00000 +Comp35StartTime:2011-06-23 15:13:00 +Comp35PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp35ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp35RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp36UUID:991ab354-9d15-11e0-85be-406186cbf87c +Comp36Name:Dasenbrook +Comp36NameShort:GER9040 +Comp36Color:FF0000 +Comp36Nationality:GER +Comp36Description: +Comp36Handicap:1.0000000000 +Comp36HandicapDistance:0.00000 +Comp36StartTime:2011-06-23 15:13:00 +Comp36PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp36ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp36RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp37UUID:9d4e23d4-9d15-11e0-85be-406186cbf87c +Comp37Name:Birkner +Comp37NameShort:GER9043 +Comp37Color:808000 +Comp37Nationality:GER +Comp37Description: +Comp37Handicap:1.0000000000 +Comp37HandicapDistance:0.00000 +Comp37StartTime:2011-06-23 15:13:00 +Comp37PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp37ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp37RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp38UUID:a1f9ca46-9d15-11e0-85be-406186cbf87c +Comp38Name:Fischer +Comp38NameShort:GER9054 +Comp38Color:FFFFFF +Comp38Nationality:GER +Comp38Description: +Comp38Handicap:1.0000000000 +Comp38HandicapDistance:0.00000 +Comp38StartTime:2011-06-23 15:13:00 +Comp38PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp38ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp38RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp39UUID:aa852246-9d15-11e0-85be-406186cbf87c +Comp39Name:Schomäker +Comp39NameShort:GER9070 +Comp39Color:800080 +Comp39Nationality:GER +Comp39Description: +Comp39Handicap:1.0000000000 +Comp39HandicapDistance:0.00000 +Comp39StartTime:2011-06-23 15:13:00 +Comp39PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp39ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp39RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +Comp40UUID:aec14cd6-9d15-11e0-85be-406186cbf87c +Comp40Name:Hastenpflug +Comp40NameShort:SWE8912 +Comp40Color:008080 +Comp40Nationality:SWE +Comp40Description: +Comp40Handicap:1.0000000000 +Comp40HandicapDistance:0.00000 +Comp40StartTime:2011-06-23 15:13:00 +Comp40PictureUUID:ebb4c5da-9934-11e0-85be-406186cbf87c +Comp40ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp40RouteUUID:ab327b10-9da8-11e0-85be-406186cbf87c + +ControlPoint1UUID:07d84022-9951-11e0-85be-406186cbf87c +ControlPoint1Name:D Mark4 +ControlPoint1HasTwoPoints:1 +ControlPoint1ShortName:4 +ControlPoint1Mark1Lon:10.169383 +ControlPoint1Mark1Lat:54.428738 +ControlPoint1Mark2Lon:10.169408 +ControlPoint1Mark2Lat:54.428738 + +ControlPoint2UUID:0807af7c-9b42-11e0-85be-406186cbf87c +ControlPoint2Name:Star-R6-1 +ControlPoint2HasTwoPoints:0 +ControlPoint2ShortName:1 +ControlPoint2Mark1Lon:10.235563 +ControlPoint2Mark1Lat:54.504244 + +ControlPoint3UUID:0beb273c-992f-11e0-85be-406186cbf87c +ControlPoint3Name:Finish Silbernes Band +ControlPoint3HasTwoPoints:1 +ControlPoint3ShortName:F +ControlPoint3Mark1Lon:10.000465 +ControlPoint3Mark1Lat:54.273018 +ControlPoint3Mark2Lon:10.273137 +ControlPoint3Mark2Lat:54.500737 + +ControlPoint4UUID:144f44f4-9dac-11e0-85be-406186cbf87c +ControlPoint4Name:SB-Mark H5 (y) (WP 33) +ControlPoint4HasTwoPoints:0 +ControlPoint4ShortName:H5 +ControlPoint4Mark1Lon:10.666667 +ControlPoint4Mark1Lat:54.548333 + +ControlPoint5UUID:18e98784-9930-11e0-85be-406186cbf87c +ControlPoint5Name:Start Silbernes Band +ControlPoint5HasTwoPoints:1 +ControlPoint5ShortName:S +ControlPoint5Mark1Lon:10.172258 +ControlPoint5Mark1Lat:54.436310 +ControlPoint5Mark2Lon:10.172103 +ControlPoint5Mark2Lat:54.436035 + +ControlPoint6UUID:1d8536e6-9a91-11e0-85be-406186cbf87c +ControlPoint6Name:Star1-4 +ControlPoint6HasTwoPoints:1 +ControlPoint6ShortName:4 +ControlPoint6Mark1Lon:10.219525 +ControlPoint6Mark1Lat:54.500618 +ControlPoint6Mark2Lon:10.220421 +ControlPoint6Mark2Lat:54.500744 + +ControlPoint7UUID:22475d30-9951-11e0-85be-406186cbf87c +ControlPoint7Name:Audi Start +ControlPoint7HasTwoPoints:1 +ControlPoint7ShortName:S +ControlPoint7Mark1Lon:10.169497 +ControlPoint7Mark1Lat:54.428780 +ControlPoint7Mark2Lon:10.168688 +ControlPoint7Mark2Lat:54.346428 + +ControlPoint8UUID:2307bec6-992f-11e0-85be-406186cbf87c +ControlPoint8Name:Mark KO2 red/white +ControlPoint8HasTwoPoints:0 +ControlPoint8ShortName:KO +ControlPoint8Mark1Lon:10.450000 +ControlPoint8Mark1Lat:54.533333 + +ControlPoint9UUID:2497f822-9ab1-11e0-85be-406186cbf87c +ControlPoint9Name:49Y-R7-1 +ControlPoint9HasTwoPoints:0 +ControlPoint9ShortName:1 +ControlPoint9Mark1Lon:10.207426 +ControlPoint9Mark1Lat:54.435751 + +ControlPoint10UUID:27c13096-9a8d-11e0-85be-406186cbf87c +ControlPoint10Name:49b4-4 +ControlPoint10HasTwoPoints:1 +ControlPoint10ShortName:4 +ControlPoint10Mark1Lon:10.208914 +ControlPoint10Mark1Lat:54.445496 +ControlPoint10Mark2Lon:10.209630 +ControlPoint10Mark2Lat:54.444822 + +ControlPoint11UUID:2c8584ca-9dac-11e0-85be-406186cbf87c +ControlPoint11Name:SB-Finish (Ziel) at Kiel Lighthouse +ControlPoint11HasTwoPoints:0 +ControlPoint11ShortName:KL +ControlPoint11Mark1Lon:10.278333 +ControlPoint11Mark1Lat:54.498333 + +ControlPoint12UUID:32ad8a14-992e-11e0-85be-406186cbf87c +ControlPoint12Name:Mark 14 red (Fahrwassertonne 14) +ControlPoint12HasTwoPoints:0 +ControlPoint12ShortName:14 +ControlPoint12Mark1Lon:10.185000 +ControlPoint12Mark1Lat:54.371667 + +ControlPoint13UUID:32fb2850-9951-11e0-85be-406186cbf87c +ControlPoint13Name:Audi Mark1 +ControlPoint13HasTwoPoints:0 +ControlPoint13ShortName:1 +ControlPoint13Mark1Lon:10.169377 +ControlPoint13Mark1Lat:54.428920 + +ControlPoint14UUID:34feeaea-9c32-11e0-85be-406186cbf87c +ControlPoint14Name:Star7-1a +ControlPoint14HasTwoPoints:0 +ControlPoint14ShortName:1a +ControlPoint14Mark1Lon:10.230608 +ControlPoint14Mark1Lat:54.508407 + +ControlPoint15UUID:3ecf9ade-992f-11e0-85be-406186cbf87c +ControlPoint15Name:Schlei Safe Water Mark red/white +ControlPoint15HasTwoPoints:0 +ControlPoint15ShortName:SS +ControlPoint15Mark1Lon:10.055000 +ControlPoint15Mark1Lat:54.668333 + +ControlPoint16UUID:405f346c-99e9-11e0-85be-406186cbf87c +ControlPoint16Name:49erYR2-1 +ControlPoint16HasTwoPoints:0 +ControlPoint16ShortName:1 +ControlPoint16Mark1Lon:10.200182 +ControlPoint16Mark1Lat:54.427670 + +ControlPoint17UUID:4123b6ea-9951-11e0-85be-406186cbf87c +ControlPoint17Name:Audi Mark2 +ControlPoint17HasTwoPoints:0 +ControlPoint17ShortName:2 +ControlPoint17Mark1Lon:10.169438 +ControlPoint17Mark1Lat:54.428952 + +ControlPoint18UUID:4bac3eca-992e-11e0-85be-406186cbf87c +ControlPoint18Name:Three yellow marks* (3 gelbe Tonnen) +ControlPoint18HasTwoPoints:0 +ControlPoint18ShortName:3y +ControlPoint18Mark1Lon:10.198333 +ControlPoint18Mark1Lat:54.386667 + +ControlPoint19UUID:535fb3f4-9951-11e0-85be-406186cbf87c +ControlPoint19Name:Audi Finish +ControlPoint19HasTwoPoints:1 +ControlPoint19ShortName:F +ControlPoint19Mark1Lon:10.159173 +ControlPoint19Mark1Lat:54.341737 +ControlPoint19Mark2Lon:10.169527 +ControlPoint19Mark2Lat:54.429047 + +ControlPoint20UUID:56f63cf8-99e8-11e0-85be-406186cbf87c +ControlPoint20Name:49erYR1-T +ControlPoint20HasTwoPoints:0 +ControlPoint20ShortName:T +ControlPoint20Mark1Lon:10.199148 +ControlPoint20Mark1Lat:54.429370 + +ControlPoint21UUID:5933cdca-9950-11e0-85be-406186cbf87c +ControlPoint21Name:H Start +ControlPoint21HasTwoPoints:1 +ControlPoint21ShortName:S +ControlPoint21Mark1Lon:10.169343 +ControlPoint21Mark1Lat:54.428722 +ControlPoint21Mark2Lon:10.169463 +ControlPoint21Mark2Lat:54.428802 + +ControlPoint22UUID:65b2dfbc-9b64-11e0-85be-406186cbf87c +ControlPoint22Name:K Start +ControlPoint22HasTwoPoints:1 +ControlPoint22ShortName:S +ControlPoint22Mark1Lon:10.169233 +ControlPoint22Mark1Lat:54.429363 +ControlPoint22Mark2Lon:10.169218 +ControlPoint22Mark2Lat:54.429263 + +ControlPoint23UUID:65c3a9ec-992e-11e0-85be-406186cbf87c +ControlPoint23Name:Mark 4 red (Fahrwassertonne 4) +ControlPoint23HasTwoPoints:0 +ControlPoint23ShortName:4 +ControlPoint23Mark1Lon:10.233333 +ControlPoint23Mark1Lat:54.428333 + +ControlPoint24UUID:69a347b2-9950-11e0-85be-406186cbf87c +ControlPoint24Name:H Mark1 +ControlPoint24HasTwoPoints:0 +ControlPoint24ShortName:1 +ControlPoint24Mark1Lon:10.169395 +ControlPoint24Mark1Lat:54.428688 + +ControlPoint25UUID:6c30e118-9a8d-11e0-85be-406186cbf87c +ControlPoint25Name:49b4-F +ControlPoint25HasTwoPoints:1 +ControlPoint25ShortName:F +ControlPoint25Mark1Lon:10.209712 +ControlPoint25Mark1Lat:54.445952 +ControlPoint25Mark2Lon:10.210658 +ControlPoint25Mark2Lat:54.445241 + +ControlPoint26UUID:7634bbfe-9dac-11e0-85be-406186cbf87c +ControlPoint26Name:SB-Mark Red (WP 124) +ControlPoint26HasTwoPoints:0 +ControlPoint26ShortName:WP +ControlPoint26Mark1Lon:10.236667 +ControlPoint26Mark1Lat:55.045000 + +ControlPoint27UUID:79dab2ea-9aaf-11e0-85be-406186cbf87c +ControlPoint27Name:49erB5-4 +ControlPoint27HasTwoPoints:1 +ControlPoint27ShortName:4 +ControlPoint27Mark1Lon:10.201355 +ControlPoint27Mark1Lat:54.446073 +ControlPoint27Mark2Lon:10.197830 +ControlPoint27Mark2Lat:54.446886 + +ControlPoint28UUID:7a218886-9b64-11e0-85be-406186cbf87c +ControlPoint28Name:K Mark1 +ControlPoint28HasTwoPoints:0 +ControlPoint28ShortName:1 +ControlPoint28Mark1Lon:10.169215 +ControlPoint28Mark1Lat:54.429115 + +ControlPoint29UUID:7c639ea8-9da9-11e0-85be-406186cbf87c +ControlPoint29Name:SB Mark1 (Schleimünde Approach (r/w) ) +ControlPoint29HasTwoPoints:0 +ControlPoint29ShortName:1 +ControlPoint29Mark1Lon:10.060000 +ControlPoint29Mark1Lat:54.665000 + +ControlPoint30UUID:8145342e-992e-11e0-85be-406186cbf87c +ControlPoint30Name:Mark 2 red (Fahrwassertonne 2) +ControlPoint30HasTwoPoints:0 +ControlPoint30ShortName:2 +ControlPoint30Mark1Lon:10.283333 +ControlPoint30Mark1Lat:54.465000 + +ControlPoint31UUID:84009c94-98e3-11e0-85be-406186cbf87c +ControlPoint31Name:Test - Top Mark +ControlPoint31HasTwoPoints:0 +ControlPoint31ShortName:1 +ControlPoint31Mark1Lon:10.169028 +ControlPoint31Mark1Lat:54.428993 + +ControlPoint32UUID:86c90a6e-9a9c-11e0-85be-406186cbf87c +ControlPoint32Name:S3-4 +ControlPoint32HasTwoPoints:1 +ControlPoint32ShortName:4 +ControlPoint32Mark1Lon:10.218663 +ControlPoint32Mark1Lat:54.515525 +ControlPoint32Mark2Lon:10.218214 +ControlPoint32Mark2Lat:54.515649 + +ControlPoint33UUID:8d1c4750-9b64-11e0-85be-406186cbf87c +ControlPoint33Name:K Mark2 +ControlPoint33HasTwoPoints:0 +ControlPoint33ShortName:2 +ControlPoint33Mark1Lon:10.170753 +ControlPoint33Mark1Lat:54.429023 + +ControlPoint34UUID:99cae4d0-992e-11e0-85be-406186cbf87c +ControlPoint34Name:Mark 1 green (Fahrwassertonne 1) +ControlPoint34HasTwoPoints:0 +ControlPoint34ShortName:1 +ControlPoint34Mark1Lon:10.251667 +ControlPoint34Mark1Lat:54.475000 + +ControlPoint35UUID:9beca160-9a8f-11e0-85be-406186cbf87c +ControlPoint35Name:49erb1-1 +ControlPoint35HasTwoPoints:0 +ControlPoint35ShortName:T +ControlPoint35Mark1Lon:10.196778 +ControlPoint35Mark1Lat:54.439621 + +ControlPoint36UUID:9c4e4984-9a93-11e0-85be-406186cbf87c +ControlPoint36Name:Star2-4 +ControlPoint36HasTwoPoints:1 +ControlPoint36ShortName:4 +ControlPoint36Mark1Lon:10.230194 +ControlPoint36Mark1Lat:54.504793 +ControlPoint36Mark2Lon:10.229448 +ControlPoint36Mark2Lat:54.505033 + +ControlPoint37UUID:9caa2f3a-98e3-11e0-85be-406186cbf87c +ControlPoint37Name:Test - start +ControlPoint37HasTwoPoints:1 +ControlPoint37ShortName:S +ControlPoint37Mark1Lon:10.169440 +ControlPoint37Mark1Lat:54.428712 +ControlPoint37Mark2Lon:10.169403 +ControlPoint37Mark2Lat:54.428872 + +ControlPoint38UUID:9da911ea-9950-11e0-85be-406186cbf87c +ControlPoint38Name:H Mark4 +ControlPoint38HasTwoPoints:1 +ControlPoint38ShortName:4 +ControlPoint38Mark1Lon:10.199247 +ControlPoint38Mark1Lat:54.426952 +ControlPoint38Mark2Lon:10.169460 +ControlPoint38Mark2Lat:54.428810 + +ControlPoint39UUID:a0cbd40c-9dab-11e0-85be-406186cbf87c +ControlPoint39Name:SB-Mark Schleimünde Approach (r/w) +ControlPoint39HasTwoPoints:0 +ControlPoint39ShortName:SA +ControlPoint39Mark1Lon:10.060000 +ControlPoint39Mark1Lat:54.665000 + +ControlPoint40UUID:a68cc03e-9b64-11e0-85be-406186cbf87c +ControlPoint40Name:K Mark3 +ControlPoint40HasTwoPoints:1 +ControlPoint40ShortName:3 +ControlPoint40Mark1Lon:10.169493 +ControlPoint40Mark1Lat:54.428673 +ControlPoint40Mark2Lon:10.242970 +ControlPoint40Mark2Lat:54.475930 + +ControlPoint41UUID:a8c75c3e-9a8c-11e0-85be-406186cbf87c +ControlPoint41Name:49b4-Start +ControlPoint41HasTwoPoints:1 +ControlPoint41ShortName:S +ControlPoint41Mark1Lon:10.209545 +ControlPoint41Mark1Lat:54.446065 +ControlPoint41Mark2Lon:10.211504 +ControlPoint41Mark2Lat:54.444520 + +ControlPoint42UUID:a91da4ea-9dac-11e0-85be-406186cbf87c +ControlPoint42Name:SB-Mark Thurö Rev (Y/B) (WP 277) +ControlPoint42HasTwoPoints:0 +ControlPoint42ShortName:Th +ControlPoint42Mark1Lon:10.735000 +ControlPoint42Mark1Lat:55.020000 + +ControlPoint43UUID:b2ad1adc-9950-11e0-85be-406186cbf87c +ControlPoint43Name:H Finish +ControlPoint43HasTwoPoints:1 +ControlPoint43ShortName:F +ControlPoint43Mark1Lon:10.169410 +ControlPoint43Mark1Lat:54.428802 +ControlPoint43Mark2Lon:10.169568 +ControlPoint43Mark2Lat:54.428810 + +ControlPoint44UUID:b31eaad0-9dab-11e0-85be-406186cbf87c +ControlPoint44Name:SB-Mark Spodsbjerg-SE +ControlPoint44HasTwoPoints:0 +ControlPoint44ShortName:Sp +ControlPoint44Mark1Lon:10.845000 +ControlPoint44Mark1Lat:54.918333 + +ControlPoint45UUID:b3af1998-992e-11e0-85be-406186cbf87c +ControlPoint45Name:Mark K yellow (Kabeltonne) +ControlPoint45HasTwoPoints:0 +ControlPoint45ShortName:K +ControlPoint45Mark1Lon:10.255000 +ControlPoint45Mark1Lat:54.488333 + +ControlPoint46UUID:bfe4dc42-9b64-11e0-85be-406186cbf87c +ControlPoint46Name:K Mark4 +ControlPoint46HasTwoPoints:1 +ControlPoint46ShortName:4 +ControlPoint46Mark1Lon:10.169245 +ControlPoint46Mark1Lat:54.429253 +ControlPoint46Mark2Lon:10.169258 +ControlPoint46Mark2Lat:54.429408 + +ControlPoint47UUID:c2199936-9dac-11e0-85be-406186cbf87c +ControlPoint47Name:SB-Mark Black Yellow (WP 253) +ControlPoint47HasTwoPoints:0 +ControlPoint47ShortName:BY +ControlPoint47Mark1Lon:10.936667 +ControlPoint47Mark1Lat:55.185000 + +ControlPoint48UUID:c583e438-9950-11e0-85be-406186cbf87c +ControlPoint48Name:D Start +ControlPoint48HasTwoPoints:1 +ControlPoint48ShortName:S +ControlPoint48Mark1Lon:10.169380 +ControlPoint48Mark1Lat:54.428668 +ControlPoint48Mark2Lon:10.169187 +ControlPoint48Mark2Lat:54.428523 + +ControlPoint49UUID:cd57b5f8-992e-11e0-85be-406186cbf87c +ControlPoint49Name:Stollergrund-N (black/yellow) +ControlPoint49HasTwoPoints:0 +ControlPoint49ShortName:SN +ControlPoint49Mark1Lon:10.200000 +ControlPoint49Mark1Lat:54.536667 + +ControlPoint50UUID:d2b4c5d2-9950-11e0-85be-406186cbf87c +ControlPoint50Name:D Mark1 +ControlPoint50HasTwoPoints:0 +ControlPoint50ShortName:1 +ControlPoint50Mark1Lon:10.166928 +ControlPoint50Mark1Lat:54.345997 + +ControlPoint51UUID:de21cff2-9ab6-11e0-85be-406186cbf87c +ControlPoint51Name:49Y-R8-1a +ControlPoint51HasTwoPoints:0 +ControlPoint51ShortName:1 +ControlPoint51Mark1Lon:10.207476 +ControlPoint51Mark1Lat:54.435762 + +ControlPoint52UUID:e299f688-9dac-11e0-85be-406186cbf87c +ControlPoint52Name:SB-Gate DW 59 green and DW 56 red +ControlPoint52HasTwoPoints:0 +ControlPoint52ShortName:59 +ControlPoint52Mark1Lon:10.780000 +ControlPoint52Mark1Lat:54.736667 + +ControlPoint53UUID:e59815c6-9b64-11e0-85be-406186cbf87c +ControlPoint53Name:K Finish +ControlPoint53HasTwoPoints:1 +ControlPoint53ShortName:F +ControlPoint53Mark1Lon:10.170700 +ControlPoint53Mark1Lat:54.429200 +ControlPoint53Mark2Lon:10.170648 +ControlPoint53Mark2Lat:54.429165 + +ControlPoint54UUID:e663db6c-9a8c-11e0-85be-406186cbf87c +ControlPoint54Name:49b4-1 +ControlPoint54HasTwoPoints:0 +ControlPoint54ShortName:1 +ControlPoint54Mark1Lon:10.196146 +ControlPoint54Mark1Lat:54.441407 + +ControlPoint55UUID:f214ea50-992e-11e0-85be-406186cbf87c +ControlPoint55Name:Gate between Mittelgrund-N +ControlPoint55HasTwoPoints:0 +ControlPoint55ShortName:MN +ControlPoint55Mark1Lon:10.055000 +ControlPoint55Mark1Lat:54.513333 + +ControlPoint56UUID:f641d92e-9ab6-11e0-85be-406186cbf87c +ControlPoint56Name:49Y-R8-1b +ControlPoint56HasTwoPoints:0 +ControlPoint56ShortName:1 +ControlPoint56Mark1Lon:10.203712 +ControlPoint56Mark1Lat:54.434916 + +ControlPoint57UUID:f76bea2c-9a95-11e0-85be-406186cbf87c +ControlPoint57Name:DIM1-F +ControlPoint57HasTwoPoints:1 +ControlPoint57ShortName:F +ControlPoint57Mark1Lon:9.850912 +ControlPoint57Mark1Lat:54.474097 +ControlPoint57Mark2Lon:9.849851 +ControlPoint57Mark2Lat:54.472319 + + +SegmentFile:segments.php +Route1UUID:ab327b10-9da8-11e0-85be-406186cbf87c +Route1Description:5o5 Race 3 +Route1Length:0 +Route1ControlPoint1UUID:65b2dfbc-9b64-11e0-85be-406186cbf87c +Route1ControlPoint2UUID:7a218886-9b64-11e0-85be-406186cbf87c +Route1ControlPoint3UUID:bfe4dc42-9b64-11e0-85be-406186cbf87c +Route1ControlPoint4UUID:7a218886-9b64-11e0-85be-406186cbf87c +Route1ControlPoint5UUID:bfe4dc42-9b64-11e0-85be-406186cbf87c +Route1ControlPoint6UUID:e59815c6-9b64-11e0-85be-406186cbf87c + +//-------- AUTO GENERATED PARAMETERS END ------------------ diff --git a/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_race_4.mtb b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_race_4.mtb new file mode 100644 index 00000000000..ac73897c272 Binary files /dev/null and b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_race_4.mtb differ diff --git a/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_race_4.txt b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_race_4.txt new file mode 100644 index 00000000000..d21f271f239 --- /dev/null +++ b/java/com.sap.sailing.datamining.test/resources/event_20110609_KielerWoch-505_race_4.txt @@ -0,0 +1,1547 @@ +stored-uri:datafiles/event_20110609_KielerWoch-505_race_4.mtb +StartReplay:1 + +// Input from params_static: + +// Input from event_parameters: + +CompMarkerUUID:1 +CodanIsSponsor:0 +EnablePrint:1 +DefaultTailLength:60 +APzoomChangeTime:2500 +disableAutoProduce:0 +autoProduce:0 +APstartLineShowOfLeg:0.25 +APsideOfStartLine:0.30 +APstartSwitch:0.8 +APwholeLegBehindMarks:0.15 +APmarkSwitch:0.13 +APmarkZoomBehindMarks:0.10 +APmarkZoomInFrontOfMarks:0.20 +PopupMarkerUUID:2 +ManualUrl:http://www.tractrac.com/files/userguide_sailing.pdf +WeatherLat1:56 +WeatherLat2:54 +Marker1UUID:1 +Marker1Type:RGBMarkerFactory +Marker1Directional:1 +Marker1Image:markers/boat_FF0000_big.png +Marker1MetersPerPixel:0.0617 +Marker1MinScale:0.396 +Startlocation:10.197659,54.456129 +MaxDiffTime:600 +MaxMetersPerSecond:20 +PrecisionMeters:20 +ShortAvgTime:180 +LongAvgTime:900 +TimeZone:2 +CompMarkerTimeout:60 +FramesPerSecond:8 +replayspeedup:5 +MatchRaceClock:0 +MatchRaceClockNo:3 +MatchRaceClockSpacing:300 +Minimap:1 +MinimapUseLayers:1 +Minimapgeorect:9.840775,54.516538,10.3022,54.309554 +MinimapMarkerUUID:2 +Marker4UUID:2 +Marker4Type:RGBmarkerFactory +Marker4Directional:1 +Marker4Image:markers/boat_FF0000_small.png +MetersPerPixel:25 +MetersPerPixelMax:200 +MetersPerPixelMin:0.2 +isMatchRace:0 +weatherEnabled:0 +showRaceClock:1 +BackGroundImage:graphics/background.jpg +DisableRotation:0 +ControlPointMarkerRadius:13 +disableselection:0 +disableleaderline:0 +WeatherLon1:9 +WeatherLon2:12 +DisableChangeRace:0 +PopUpRow1Name: +PopUpRow1Type:Name +PopUpRow2Name:Knots +PopUpRow2Type:BoatSpeed +PopUpRow3Name:Ranking +PopUpRow3Type:RowNumber +PopUpRow4Name:Sail +PopUpRow4Type:Ini +PopUpRow5Name:After +PopUpRow5Type:BoatAfter +ResultColumn1Name:# +ResultColumn1Size:25 +ResultColumn1Type:RowNumber +ResultColumn2Size:20 +ResultColumn2Type:ColorMarker +ResultColumn3Name:sail +ResultColumn3Size:60 +ResultColumn3Type:Ini +ResultColumn4Name:name +ResultColumn4Size:110 +ResultColumn4Type:Name +ResultColumn5Name:after +ResultColumn5Size:45 +ResultColumn5Type:BoatAfter +ResultColumn6Name:kts +ResultColumn6Size:40 +ResultColumn6Type:BoatSpeed +DisableLeaderboard:0 +DisableAnalysis:0 +TableFontSize:11 +//live-uri:tcp://germanmaster.traclive.dk:4400 +//stored-uri:tcp://germanmaster.traclive.dk:4401 +compInitialsFontSize:11 +AutoRotate:0 +MassStart:0 +SegmentFile:segments.php +StartType:Mass +ReCalcDirAndSpeed:0 +RaceHandicapSystem:NONE +TeamCompetitionType:NONE +LiveDelaySecs: 180 + +//-------- AUTO GENERATED PARAMETERS START ---------------- + +EventID:f34b232a-934e-11e0-b3bb-406186cbf87c +EventName:Kieler Woche +EventDB:event_20110609_KielerWoch +EventStartTime:2011-06-15 09:00:00 +EventEndTime:2011-06-26 23:59:00 + +RaceID:7c666e50-9dde-11e0-85be-406186cbf87c +RaceName:505 race 4 +RaceStartTime:2011-06-24 09:15:00 +RaceEndTime: +RaceTrackingStartTime:2011-06-24 08:39:54 +RaceTrackingEndTime:2011-06-24 10:47:32 +RaceDefaultRouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c +RaceHandicapSystem:NONE + +Image1UUID:0ba089bc-996f-11e0-85be-406186cbf87c +Image1Type:Logo +Image1Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/URU.gif +Image1Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/URU.gif + +Image2UUID:1d548b00-996e-11e0-85be-406186cbf87c +Image2Type:Logo +Image2Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUT.gif +Image2Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUT.gif + +Image3UUID:1ece41fa-9c49-11e0-85be-406186cbf87c +Image3Type:Logo +Image3Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NZL.gif +Image3Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NZL.gif + +Image4UUID:22b1a988-98e3-11e0-85be-406186cbf87c +Image4Type:Logo +Image4Description:Veolia +Image4Image: + +Image5UUID:22ba0304-98d8-11e0-85be-406186cbf87c +Image5Type:Logo +Image5Description:Kieler Woche +Image5Image: + +Image6UUID:2767b7e8-996e-11e0-85be-406186cbf87c +Image6Type:Logo +Image6Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BEL.gif +Image6Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BEL.gif + +Image7UUID:2cda6f4a-996e-11e0-85be-406186cbf87c +Image7Type:Logo +Image7Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BRA.gif +Image7Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/BRA.gif + +Image8UUID:3313b588-98d8-11e0-85be-406186cbf87c +Image8Type:Logo +Image8Description:Audi +Image8Image: + +Image9UUID:33a26700-98e3-11e0-85be-406186cbf87c +Image9Type:Logo +Image9Description:HSH NORDBANK +Image9Image: + +Image10UUID:373009a0-996e-11e0-85be-406186cbf87c +Image10Type:Logo +Image10Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CHI.gif +Image10Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CHI.gif + +Image11UUID:4cc5360a-996e-11e0-85be-406186cbf87c +Image11Type:Logo +Image11Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/EST.gif +Image11Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/EST.gif + +Image12UUID:514008f8-98e3-11e0-85be-406186cbf87c +Image12Type:Logo +Image12Description:ISAF SAILING WORLDCUP +Image12Image: + +Image13UUID:5222c1c6-996e-11e0-85be-406186cbf87c +Image13Type:Logo +Image13Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/FRA.gif +Image13Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/FRA.gif + +Image14UUID:574e0d40-98d8-11e0-85be-406186cbf87c +Image14Type:Logo +Image14Description:SAP +Image14Image: + +Image15UUID:617e8236-996e-11e0-85be-406186cbf87c +Image15Type:Logo +Image15Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GBR.gif +Image15Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GBR.gif + +Image16UUID:6d332670-9934-11e0-85be-406186cbf87c +Image16Type:Logo +Image16Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUS.gif +Image16Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/AUS.gif + +Image17UUID:6de07500-9e2a-11e0-85be-406186cbf87c +Image17Type:Logo +Image17Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SIN.gif +Image17Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SIN.gif + +Image18UUID:7252c142-9934-11e0-85be-406186cbf87c +Image18Type:Logo +Image18Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CAN.gif +Image18Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CAN.gif + +Image19UUID:77555f2e-9934-11e0-85be-406186cbf87c +Image19Type:Logo +Image19Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CRO.gif +Image19Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/CRO.gif + +Image20UUID:7c87105a-9934-11e0-85be-406186cbf87c +Image20Type:Logo +Image20Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/DEN.gif +Image20Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/DEN.gif + +Image21UUID:7deb67ce-9930-11e0-85be-406186cbf87c +Image21Type:Logo +Image21Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/RUS.gif +Image21Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/RUS.gif + +Image22UUID:81fea498-9930-11e0-85be-406186cbf87c +Image22Type:Logo +Image22Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GER.gif +Image22Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GER.gif + +Image23UUID:93a58cc0-9930-11e0-85be-406186cbf87c +Image23Type:Logo +Image23Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/USA.gif +Image23Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/USA.gif + +Image24UUID:bc6068c4-9d77-11e0-85be-406186cbf87c +Image24Type:Logo +Image24Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UAE.gif +Image24Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UAE.gif + +Image25UUID:be8c642a-996e-11e0-85be-406186cbf87c +Image25Type:Logo +Image25Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GRE.gif +Image25Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/GRE.gif + +Image26UUID:c2fdb14c-9934-11e0-85be-406186cbf87c +Image26Type:Logo +Image26Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/HUN.gif +Image26Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/HUN.gif + +Image27UUID:c3a2eaa6-996e-11e0-85be-406186cbf87c +Image27Type:Logo +Image27Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/IRL.gif +Image27Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/IRL.gif + +Image28UUID:c85b16fc-9934-11e0-85be-406186cbf87c +Image28Type:Logo +Image28Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ISV.gif +Image28Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ISV.gif + +Image29UUID:c8eaf36e-996e-11e0-85be-406186cbf87c +Image29Type:Logo +Image29Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/MEX.gif +Image29Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/MEX.gif + +Image30UUID:cd74b15c-9934-11e0-85be-406186cbf87c +Image30Type:Logo +Image30Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ITA.gif +Image30Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/ITA.gif + +Image31UUID:cdf05d40-996e-11e0-85be-406186cbf87c +Image31Type:Logo +Image31Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NED.gif +Image31Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NED.gif + +Image32UUID:d3764b44-996e-11e0-85be-406186cbf87c +Image32Type:Logo +Image32Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/POL.gif +Image32Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/POL.gif + +Image33UUID:d77c220c-9934-11e0-85be-406186cbf87c +Image33Type:Logo +Image33Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/JPN.gif +Image33Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/JPN.gif + +Image34UUID:dcb92152-9934-11e0-85be-406186cbf87c +Image34Type:Logo +Image34Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NOR.gif +Image34Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/NOR.gif + +Image35UUID:dff55d64-9e29-11e0-85be-406186cbf87c +Image35Type:Logo +Image35Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/FIN.gif +Image35Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/FIN.gif + +Image36UUID:e69d47f2-9934-11e0-85be-406186cbf87c +Image36Type:Logo +Image36Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SUI.gif +Image36Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SUI.gif + +Image37UUID:ebb4c5da-9934-11e0-85be-406186cbf87c +Image37Type:Logo +Image37Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SWE.gif +Image37Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/SWE.gif + +Image38UUID:f5cab6b0-9934-11e0-85be-406186cbf87c +Image38Type:Logo +Image38Description:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UKR.gif +Image38Image:http://germanmaster.traclive.dk/events/event_20100806_SailforGol/images/UKR.gif + +Class1UUID:da553a2a-9d14-11e0-85be-406186cbf87c +Class1Name:5o5 + +Team1UUID:6cf050ac-9934-11e0-85be-406186cbf87c +Team1Name:AUS +Team1Comp1UUID:de7d2ba8-9d14-11e0-85be-406186cbf87c + +Team2UUID:1d07e516-996e-11e0-85be-406186cbf87c +Team2Name:AUT + +Team3UUID:271ac230-996e-11e0-85be-406186cbf87c +Team3Name:BEL + +Team4UUID:2c8e2630-996e-11e0-85be-406186cbf87c +Team4Name:BRA + +Team5UUID:7210a622-9934-11e0-85be-406186cbf87c +Team5Name:CAN + +Team6UUID:36ebe888-996e-11e0-85be-406186cbf87c +Team6Name:CHI + +Team7UUID:77133b08-9934-11e0-85be-406186cbf87c +Team7Name:CRO + +Team8UUID:7c3a4770-9934-11e0-85be-406186cbf87c +Team8Name:DEN +Team8Comp1UUID:e7bc96f4-9d14-11e0-85be-406186cbf87c +Team8Comp2UUID:f0c9604c-9d14-11e0-85be-406186cbf87c +Team8Comp3UUID:ec336744-9d14-11e0-85be-406186cbf87c +Team8Comp4UUID:e3587876-9d14-11e0-85be-406186cbf87c + +Team9UUID:4c650fc8-996e-11e0-85be-406186cbf87c +Team9Name:EST + +Team10UUID:dfacd47c-9e29-11e0-85be-406186cbf87c +Team10Name:FIN + +Team11UUID:51d56ce6-996e-11e0-85be-406186cbf87c +Team11Name:FRA +Team11Comp1UUID:f969da74-9d14-11e0-85be-406186cbf87c +Team11Comp2UUID:f50675be-9d14-11e0-85be-406186cbf87c +Team11Comp3UUID:fda897ba-9d14-11e0-85be-406186cbf87c + +Team12UUID:613a12ea-996e-11e0-85be-406186cbf87c +Team12Name:GBR + +Team13UUID:81b951d6-9930-11e0-85be-406186cbf87c +Team13Name:GER +Team13Comp1UUID:70eb542e-9d15-11e0-85be-406186cbf87c +Team13Comp2UUID:40bd6314-9d15-11e0-85be-406186cbf87c +Team13Comp3UUID:0a917a14-9d15-11e0-85be-406186cbf87c +Team13Comp4UUID:9d4e23d4-9d15-11e0-85be-406186cbf87c +Team13Comp5UUID:498b40ec-9d15-11e0-85be-406186cbf87c +Team13Comp6UUID:7e051528-9d15-11e0-85be-406186cbf87c +Team13Comp7UUID:949b11b6-9d15-11e0-85be-406186cbf87c +Team13Comp8UUID:991ab354-9d15-11e0-85be-406186cbf87c +Team13Comp9UUID:826bdcb4-9d15-11e0-85be-406186cbf87c +Team13Comp10UUID:3c1fb294-9d15-11e0-85be-406186cbf87c +Team13Comp11UUID:4e00eaa0-9d15-11e0-85be-406186cbf87c +Team13Comp12UUID:a1f9ca46-9d15-11e0-85be-406186cbf87c +Team13Comp13UUID:1cd7dcc2-9d15-11e0-85be-406186cbf87c +Team13Comp14UUID:5b14f704-9d15-11e0-85be-406186cbf87c +Team13Comp15UUID:5f520bea-9d15-11e0-85be-406186cbf87c +Team13Comp16UUID:86d2fb5c-9d15-11e0-85be-406186cbf87c +Team13Comp17UUID:6c9514c8-9d15-11e0-85be-406186cbf87c +Team13Comp18UUID:13e98db8-9d15-11e0-85be-406186cbf87c +Team13Comp19UUID:21584926-9d15-11e0-85be-406186cbf87c +Team13Comp20UUID:2f1009e6-9d15-11e0-85be-406186cbf87c +Team13Comp21UUID:450c5a92-9d15-11e0-85be-406186cbf87c +Team13Comp22UUID:8b618332-9d15-11e0-85be-406186cbf87c +Team13Comp23UUID:75325a1e-9d15-11e0-85be-406186cbf87c +Team13Comp24UUID:37b2223c-9d15-11e0-85be-406186cbf87c +Team13Comp25UUID:062ea47e-9d15-11e0-85be-406186cbf87c +Team13Comp26UUID:525a0dc0-9d15-11e0-85be-406186cbf87c +Team13Comp27UUID:2a8fbab0-9d15-11e0-85be-406186cbf87c +Team13Comp28UUID:56b22d94-9d15-11e0-85be-406186cbf87c +Team13Comp29UUID:63855546-9d15-11e0-85be-406186cbf87c +Team13Comp30UUID:25ea8cce-9d15-11e0-85be-406186cbf87c +Team13Comp31UUID:68315036-9d15-11e0-85be-406186cbf87c +Team13Comp32UUID:a65d72a4-9d15-11e0-85be-406186cbf87c +Team13Comp33UUID:01f09174-9d15-11e0-85be-406186cbf87c +Team13Comp34UUID:aa852246-9d15-11e0-85be-406186cbf87c +Team13Comp35UUID:0f4448e8-9d15-11e0-85be-406186cbf87c +Team13Comp36UUID:7980a4cc-9d15-11e0-85be-406186cbf87c +Team13Comp37UUID:33500f24-9d15-11e0-85be-406186cbf87c +Team13Comp38UUID:1859e280-9d15-11e0-85be-406186cbf87c +Team13Comp39UUID:9006c3d4-9d15-11e0-85be-406186cbf87c + +Team14UUID:be35f1ee-996e-11e0-85be-406186cbf87c +Team14Name:GRE + +Team15UUID:c2b1d6a0-9934-11e0-85be-406186cbf87c +Team15Name:HUN + +Team16UUID:c3601ba4-996e-11e0-85be-406186cbf87c +Team16Name:IRL + +Team17UUID:c818eb6a-9934-11e0-85be-406186cbf87c +Team17Name:ISV + +Team18UUID:cd2435f6-9934-11e0-85be-406186cbf87c +Team18Name:ITA + +Team19UUID:d737d124-9934-11e0-85be-406186cbf87c +Team19Name:JPN + +Team20UUID:c8a808d8-996e-11e0-85be-406186cbf87c +Team20Name:MEX + +Team21UUID:cdaadaae-996e-11e0-85be-406186cbf87c +Team21Name:NED + +Team22UUID:dc76ea44-9934-11e0-85be-406186cbf87c +Team22Name:NOR + +Team23UUID:1e8f7452-9c49-11e0-85be-406186cbf87c +Team23Name:NZL + +Team24UUID:d3297b7a-996e-11e0-85be-406186cbf87c +Team24Name:POL + +Team25UUID:7d9ca8fa-9930-11e0-85be-406186cbf87c +Team25Name:RUS + +Team26UUID:6d98ab8a-9e2a-11e0-85be-406186cbf87c +Team26Name:SIN + +Team27UUID:e6510b62-9934-11e0-85be-406186cbf87c +Team27Name:SUI + +Team28UUID:eb727d9c-9934-11e0-85be-406186cbf87c +Team28Name:SWE +Team28Comp1UUID:aec14cd6-9d15-11e0-85be-406186cbf87c + +Team29UUID:ffb184b0-98e4-11e0-85be-406186cbf87c +Team29Name:Test + +Team30UUID:bc22780c-9d77-11e0-85be-406186cbf87c +Team30Name:UAE + +Team31UUID:f57e7ea8-9934-11e0-85be-406186cbf87c +Team31Name:UKR + +Team32UUID:0b5469f6-996f-11e0-85be-406186cbf87c +Team32Name:URU + +Team33UUID:9361c468-9930-11e0-85be-406186cbf87c +Team33Name:USA +SELECT Competitors.UUID,FirstName,LastName,Initials,Color,Nationality,Description,Icon,Picture,ClassId,Handicap,HandicapDistance,StartTime FROM event_20110609_KielerWoch.RaceObject INNER JOIN event_20110609_KielerWoch.Competitors ON event_20110609_KielerWoch.RaceObject.TrackedObjectId = event_20110609_KielerWoch.Competitors.UUID WHERE RaceId='7c666e50-9dde-11e0-85be-406186cbf87c' ORDER BY LID,StartTime,Competitors.UUID + + +Comp1UUID:de7d2ba8-9d14-11e0-85be-406186cbf87c +Comp1Name:Kevin +Comp1NameShort:AUS9061 +Comp1Color:FF0000 +Comp1Nationality:AUS +Comp1Description: +Comp1Handicap:1.0000000000 +Comp1HandicapDistance:0.00000 +Comp1StartTime:2011-06-24 09:15:00 +Comp1PictureUUID:6d332670-9934-11e0-85be-406186cbf87c +Comp1ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp1RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp2UUID:e3587876-9d14-11e0-85be-406186cbf87c +Comp2Name:van Wonterghem +Comp2NameShort:DEN8828 +Comp2Color:808000 +Comp2Nationality:DEN +Comp2Description: +Comp2Handicap:1.0000000000 +Comp2HandicapDistance:0.00000 +Comp2StartTime:2011-06-24 09:15:00 +Comp2PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp2ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp2RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp3UUID:e7bc96f4-9d14-11e0-85be-406186cbf87c +Comp3Name:Buhl +Comp3NameShort:DEN8958 +Comp3Color:FFFFFF +Comp3Nationality:DEN +Comp3Description: +Comp3Handicap:1.0000000000 +Comp3HandicapDistance:0.00000 +Comp3StartTime:2011-06-24 09:15:00 +Comp3PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp3ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp3RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp4UUID:ec336744-9d14-11e0-85be-406186cbf87c +Comp4Name:Saugmann +Comp4NameShort:DEN8964 +Comp4Color:FFFF00 +Comp4Nationality:DEN +Comp4Description: +Comp4Handicap:1.0000000000 +Comp4HandicapDistance:0.00000 +Comp4StartTime:2011-06-24 09:15:00 +Comp4PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp4ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp4RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp5UUID:f0c9604c-9d14-11e0-85be-406186cbf87c +Comp5Name:Bøjland +Comp5NameShort:DEN9023 +Comp5Color:800080 +Comp5Nationality:DEN +Comp5Description: +Comp5Handicap:1.0000000000 +Comp5HandicapDistance:0.00000 +Comp5StartTime:2011-06-24 09:15:00 +Comp5PictureUUID:7c87105a-9934-11e0-85be-406186cbf87c +Comp5ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp5RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp6UUID:f50675be-9d14-11e0-85be-406186cbf87c +Comp6Name:Broise +Comp6NameShort:FRA8844 +Comp6Color:008080 +Comp6Nationality:FRA +Comp6Description: +Comp6Handicap:1.0000000000 +Comp6HandicapDistance:0.00000 +Comp6StartTime:2011-06-24 09:15:00 +Comp6PictureUUID:5222c1c6-996e-11e0-85be-406186cbf87c +Comp6ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp6RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp7UUID:f969da74-9d14-11e0-85be-406186cbf87c +Comp7Name:boite +Comp7NameShort:FRA8902 +Comp7Color:800000 +Comp7Nationality:FRA +Comp7Description: +Comp7Handicap:1.0000000000 +Comp7HandicapDistance:0.00000 +Comp7StartTime:2011-06-24 09:15:00 +Comp7PictureUUID:5222c1c6-996e-11e0-85be-406186cbf87c +Comp7ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp7RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp8UUID:fda897ba-9d14-11e0-85be-406186cbf87c +Comp8Name:de Lisle +Comp8NameShort:FRA9068 +Comp8Color:000080 +Comp8Nationality:FRA +Comp8Description: +Comp8Handicap:1.0000000000 +Comp8HandicapDistance:0.00000 +Comp8StartTime:2011-06-24 09:15:00 +Comp8PictureUUID:5222c1c6-996e-11e0-85be-406186cbf87c +Comp8ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp8RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp9UUID:01f09174-9d15-11e0-85be-406186cbf87c +Comp9Name:Schneidewind +Comp9NameShort:GER6817 +Comp9Color:00FFFF +Comp9Nationality:GER +Comp9Description: +Comp9Handicap:1.0000000000 +Comp9HandicapDistance:0.00000 +Comp9StartTime:2011-06-24 09:15:00 +Comp9PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp9ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp9RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp10UUID:062ea47e-9d15-11e0-85be-406186cbf87c +Comp10Name:Menge +Comp10NameShort:GER7861 +Comp10Color:000000 +Comp10Nationality:GER +Comp10Description: +Comp10Handicap:1.0000000000 +Comp10HandicapDistance:0.00000 +Comp10StartTime:2011-06-24 09:15:00 +Comp10PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp10ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp10RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp11UUID:0a917a14-9d15-11e0-85be-406186cbf87c +Comp11Name:Barop +Comp11NameShort:GER8392 +Comp11Color:0000FF +Comp11Nationality:GER +Comp11Description: +Comp11Handicap:1.0000000000 +Comp11HandicapDistance:0.00000 +Comp11StartTime:2011-06-24 09:15:00 +Comp11PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp11ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp11RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp12UUID:0f4448e8-9d15-11e0-85be-406186cbf87c +Comp12Name:Steffen +Comp12NameShort:GER8437 +Comp12Color:FF00FF +Comp12Nationality:GER +Comp12Description: +Comp12Handicap:1.0000000000 +Comp12HandicapDistance:0.00000 +Comp12StartTime:2011-06-24 09:15:00 +Comp12PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp12ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp12RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp13UUID:13e98db8-9d15-11e0-85be-406186cbf87c +Comp13Name:Katja +Comp13NameShort:GER8500 +Comp13Color:008000 +Comp13Nationality:GER +Comp13Description: +Comp13Handicap:1.0000000000 +Comp13HandicapDistance:0.00000 +Comp13StartTime:2011-06-24 09:15:00 +Comp13PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp13ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp13RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp14UUID:1859e280-9d15-11e0-85be-406186cbf87c +Comp14Name:von Nerée +Comp14NameShort:GER8522 +Comp14Color:00FF00 +Comp14Nationality:GER +Comp14Description: +Comp14Handicap:1.0000000000 +Comp14HandicapDistance:0.00000 +Comp14StartTime:2011-06-24 09:15:00 +Comp14PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp14ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp14RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp15UUID:1cd7dcc2-9d15-11e0-85be-406186cbf87c +Comp15Name:Goedeking +Comp15NameShort:GER8622 +Comp15Color:FF0000 +Comp15Nationality:GER +Comp15Description: +Comp15Handicap:1.0000000000 +Comp15HandicapDistance:0.00000 +Comp15StartTime:2011-06-24 09:15:00 +Comp15PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp15ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp15RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp16UUID:21584926-9d15-11e0-85be-406186cbf87c +Comp16Name:Kellner +Comp16NameShort:GER8651 +Comp16Color:808000 +Comp16Nationality:GER +Comp16Description: +Comp16Handicap:1.0000000000 +Comp16HandicapDistance:0.00000 +Comp16StartTime:2011-06-24 09:15:00 +Comp16PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp16ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp16RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp17UUID:25ea8cce-9d15-11e0-85be-406186cbf87c +Comp17Name:Reincke +Comp17NameShort:GER8656 +Comp17Color:FFFFFF +Comp17Nationality:GER +Comp17Description: +Comp17Handicap:1.0000000000 +Comp17HandicapDistance:0.00000 +Comp17StartTime:2011-06-24 09:15:00 +Comp17PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp17ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp17RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp18UUID:2a8fbab0-9d15-11e0-85be-406186cbf87c +Comp18Name:Neulen +Comp18NameShort:GER8657 +Comp18Color:FFFF00 +Comp18Nationality:GER +Comp18Description: +Comp18Handicap:1.0000000000 +Comp18HandicapDistance:0.00000 +Comp18StartTime:2011-06-24 09:15:00 +Comp18PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp18ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp18RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp19UUID:2f1009e6-9d15-11e0-85be-406186cbf87c +Comp19Name:Kohl +Comp19NameShort:GER8670 +Comp19Color:800080 +Comp19Nationality:GER +Comp19Description: +Comp19Handicap:1.0000000000 +Comp19HandicapDistance:0.00000 +Comp19StartTime:2011-06-24 09:15:00 +Comp19PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp19ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp19RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp20UUID:33500f24-9d15-11e0-85be-406186cbf87c +Comp20Name:Tasche +Comp20NameShort:GER8720 +Comp20Color:008080 +Comp20Nationality:GER +Comp20Description: +Comp20Handicap:1.0000000000 +Comp20HandicapDistance:0.00000 +Comp20StartTime:2011-06-24 09:15:00 +Comp20PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp20ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp20RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp21UUID:37b2223c-9d15-11e0-85be-406186cbf87c +Comp21Name:Lietz +Comp21NameShort:GER8721 +Comp21Color:800000 +Comp21Nationality:GER +Comp21Description: +Comp21Handicap:1.0000000000 +Comp21HandicapDistance:0.00000 +Comp21StartTime:2011-06-24 09:15:00 +Comp21PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp21ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp21RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp22UUID:3c1fb294-9d15-11e0-85be-406186cbf87c +Comp22Name:Feldmann +Comp22NameShort:GER8730 +Comp22Color:000080 +Comp22Nationality:GER +Comp22Description: +Comp22Handicap:1.0000000000 +Comp22HandicapDistance:0.00000 +Comp22StartTime:2011-06-24 09:15:00 +Comp22PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp22ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp22RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp23UUID:40bd6314-9d15-11e0-85be-406186cbf87c +Comp23Name:Anton +Comp23NameShort:GER8741 +Comp23Color:00FFFF +Comp23Nationality:GER +Comp23Description: +Comp23Handicap:1.0000000000 +Comp23HandicapDistance:0.00000 +Comp23StartTime:2011-06-24 09:15:00 +Comp23PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp23ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp23RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp24UUID:450c5a92-9d15-11e0-85be-406186cbf87c +Comp24Name:Kraft +Comp24NameShort:GER8843 +Comp24Color:000000 +Comp24Nationality:GER +Comp24Description: +Comp24Handicap:1.0000000000 +Comp24HandicapDistance:0.00000 +Comp24StartTime:2011-06-24 09:15:00 +Comp24PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp24ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp24RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp25UUID:498b40ec-9d15-11e0-85be-406186cbf87c +Comp25Name:Brill +Comp25NameShort:GER8874 +Comp25Color:0000FF +Comp25Nationality:GER +Comp25Description: +Comp25Handicap:1.0000000000 +Comp25HandicapDistance:0.00000 +Comp25StartTime:2011-06-24 09:15:00 +Comp25PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp25ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp25RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp26UUID:4e00eaa0-9d15-11e0-85be-406186cbf87c +Comp26Name:Findel +Comp26NameShort:GER8875 +Comp26Color:FF00FF +Comp26Nationality:GER +Comp26Description: +Comp26Handicap:1.0000000000 +Comp26HandicapDistance:0.00000 +Comp26StartTime:2011-06-24 09:15:00 +Comp26PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp26ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp26RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp27UUID:525a0dc0-9d15-11e0-85be-406186cbf87c +Comp27Name:Mäge +Comp27NameShort:GER8901 +Comp27Color:008000 +Comp27Nationality:GER +Comp27Description: +Comp27Handicap:1.0000000000 +Comp27HandicapDistance:0.00000 +Comp27StartTime:2011-06-24 09:15:00 +Comp27PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp27ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp27RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp28UUID:56b22d94-9d15-11e0-85be-406186cbf87c +Comp28Name:Pleßmann +Comp28NameShort:GER8927 +Comp28Color:00FF00 +Comp28Nationality:GER +Comp28Description: +Comp28Handicap:1.0000000000 +Comp28HandicapDistance:0.00000 +Comp28StartTime:2011-06-24 09:15:00 +Comp28PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp28ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp28RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp29UUID:5b14f704-9d15-11e0-85be-406186cbf87c +Comp29Name:Gosch +Comp29NameShort:GER8929 +Comp29Color:FF0000 +Comp29Nationality:GER +Comp29Description: +Comp29Handicap:1.0000000000 +Comp29HandicapDistance:0.00000 +Comp29StartTime:2011-06-24 09:15:00 +Comp29PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp29ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp29RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp30UUID:5f520bea-9d15-11e0-85be-406186cbf87c +Comp30Name:Henge +Comp30NameShort:GER8932 +Comp30Color:808000 +Comp30Nationality:GER +Comp30Description: +Comp30Handicap:1.0000000000 +Comp30HandicapDistance:0.00000 +Comp30StartTime:2011-06-24 09:15:00 +Comp30PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp30ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp30RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp31UUID:63855546-9d15-11e0-85be-406186cbf87c +Comp31Name:Rasenack +Comp31NameShort:GER8956 +Comp31Color:FFFFFF +Comp31Nationality:GER +Comp31Description: +Comp31Handicap:1.0000000000 +Comp31HandicapDistance:0.00000 +Comp31StartTime:2011-06-24 09:15:00 +Comp31PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp31ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp31RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp32UUID:68315036-9d15-11e0-85be-406186cbf87c +Comp32Name:Roos +Comp32NameShort:GER8972 +Comp32Color:FFFF00 +Comp32Nationality:GER +Comp32Description: +Comp32Handicap:1.0000000000 +Comp32HandicapDistance:0.00000 +Comp32StartTime:2011-06-24 09:15:00 +Comp32PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp32ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp32RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp33UUID:6c9514c8-9d15-11e0-85be-406186cbf87c +Comp33Name:Jungclaus +Comp33NameShort:GER8989 +Comp33Color:800080 +Comp33Nationality:GER +Comp33Description: +Comp33Handicap:1.0000000000 +Comp33HandicapDistance:0.00000 +Comp33StartTime:2011-06-24 09:15:00 +Comp33PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp33ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp33RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp34UUID:70eb542e-9d15-11e0-85be-406186cbf87c +Comp34Name:Achterberg +Comp34NameShort:GER8990 +Comp34Color:008080 +Comp34Nationality:GER +Comp34Description: +Comp34Handicap:1.0000000000 +Comp34HandicapDistance:0.00000 +Comp34StartTime:2011-06-24 09:15:00 +Comp34PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp34ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp34RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp35UUID:75325a1e-9d15-11e0-85be-406186cbf87c +Comp35Name:Lehmann +Comp35NameShort:GER8992 +Comp35Color:800000 +Comp35Nationality:GER +Comp35Description: +Comp35Handicap:1.0000000000 +Comp35HandicapDistance:0.00000 +Comp35StartTime:2011-06-24 09:15:00 +Comp35PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp35ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp35RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp36UUID:7980a4cc-9d15-11e0-85be-406186cbf87c +Comp36Name:Stuempel +Comp36NameShort:GER8999 +Comp36Color:000080 +Comp36Nationality:GER +Comp36Description: +Comp36Handicap:1.0000000000 +Comp36HandicapDistance:0.00000 +Comp36StartTime:2011-06-24 09:15:00 +Comp36PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp36ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp36RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp37UUID:7e051528-9d15-11e0-85be-406186cbf87c +Comp37Name:Böger +Comp37NameShort:GER902 +Comp37Color:00FFFF +Comp37Nationality:GER +Comp37Description: +Comp37Handicap:1.0000000000 +Comp37HandicapDistance:0.00000 +Comp37StartTime:2011-06-24 09:15:00 +Comp37PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp37ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp37RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp38UUID:826bdcb4-9d15-11e0-85be-406186cbf87c +Comp38Name:Dr.Plattner +Comp38NameShort:GER9026 +Comp38Color:000000 +Comp38Nationality:GER +Comp38Description: +Comp38Handicap:1.0000000000 +Comp38HandicapDistance:0.00000 +Comp38StartTime:2011-06-24 09:15:00 +Comp38PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp38ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp38RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp39UUID:86d2fb5c-9d15-11e0-85be-406186cbf87c +Comp39Name:Hunger +Comp39NameShort:GER9027 +Comp39Color:0000FF +Comp39Nationality:GER +Comp39Description: +Comp39Handicap:1.0000000000 +Comp39HandicapDistance:0.00000 +Comp39StartTime:2011-06-24 09:15:00 +Comp39PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp39ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp39RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp40UUID:8b618332-9d15-11e0-85be-406186cbf87c +Comp40Name:Köchlin +Comp40NameShort:GER9028 +Comp40Color:FF00FF +Comp40Nationality:GER +Comp40Description: +Comp40Handicap:1.0000000000 +Comp40HandicapDistance:0.00000 +Comp40StartTime:2011-06-24 09:15:00 +Comp40PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp40ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp40RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp41UUID:9006c3d4-9d15-11e0-85be-406186cbf87c +Comp41Name:Waldheim +Comp41NameShort:GER9029 +Comp41Color:008000 +Comp41Nationality:GER +Comp41Description: +Comp41Handicap:1.0000000000 +Comp41HandicapDistance:0.00000 +Comp41StartTime:2011-06-24 09:15:00 +Comp41PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp41ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp41RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp42UUID:949b11b6-9d15-11e0-85be-406186cbf87c +Comp42Name:Böhm +Comp42NameShort:GER9035 +Comp42Color:00FF00 +Comp42Nationality:GER +Comp42Description: +Comp42Handicap:1.0000000000 +Comp42HandicapDistance:0.00000 +Comp42StartTime:2011-06-24 09:15:00 +Comp42PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp42ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp42RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp43UUID:991ab354-9d15-11e0-85be-406186cbf87c +Comp43Name:Dasenbrook +Comp43NameShort:GER9040 +Comp43Color:FF0000 +Comp43Nationality:GER +Comp43Description: +Comp43Handicap:1.0000000000 +Comp43HandicapDistance:0.00000 +Comp43StartTime:2011-06-24 09:15:00 +Comp43PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp43ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp43RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp44UUID:9d4e23d4-9d15-11e0-85be-406186cbf87c +Comp44Name:Birkner +Comp44NameShort:GER9043 +Comp44Color:808000 +Comp44Nationality:GER +Comp44Description: +Comp44Handicap:1.0000000000 +Comp44HandicapDistance:0.00000 +Comp44StartTime:2011-06-24 09:15:00 +Comp44PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp44ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp44RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp45UUID:a1f9ca46-9d15-11e0-85be-406186cbf87c +Comp45Name:Fischer +Comp45NameShort:GER9054 +Comp45Color:FFFFFF +Comp45Nationality:GER +Comp45Description: +Comp45Handicap:1.0000000000 +Comp45HandicapDistance:0.00000 +Comp45StartTime:2011-06-24 09:15:00 +Comp45PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp45ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp45RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp46UUID:a65d72a4-9d15-11e0-85be-406186cbf87c +Comp46Name:Salein +Comp46NameShort:GER9059 +Comp46Color:FFFF00 +Comp46Nationality:GER +Comp46Description: +Comp46Handicap:1.0000000000 +Comp46HandicapDistance:0.00000 +Comp46StartTime:2011-06-24 09:15:00 +Comp46PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp46ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp46RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp47UUID:aa852246-9d15-11e0-85be-406186cbf87c +Comp47Name:Schomäker +Comp47NameShort:GER9070 +Comp47Color:800080 +Comp47Nationality:GER +Comp47Description: +Comp47Handicap:1.0000000000 +Comp47HandicapDistance:0.00000 +Comp47StartTime:2011-06-24 09:15:00 +Comp47PictureUUID:81fea498-9930-11e0-85be-406186cbf87c +Comp47ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp47RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +Comp48UUID:aec14cd6-9d15-11e0-85be-406186cbf87c +Comp48Name:Hastenpflug +Comp48NameShort:SWE8912 +Comp48Color:008080 +Comp48Nationality:SWE +Comp48Description: +Comp48Handicap:1.0000000000 +Comp48HandicapDistance:0.00000 +Comp48StartTime:2011-06-24 09:15:00 +Comp48PictureUUID:ebb4c5da-9934-11e0-85be-406186cbf87c +Comp48ClassUUID:da553a2a-9d14-11e0-85be-406186cbf87c +Comp48RouteUUID:2a75ee72-9dde-11e0-85be-406186cbf87c + +ControlPoint1UUID:07d84022-9951-11e0-85be-406186cbf87c +ControlPoint1Name:D Mark4 +ControlPoint1HasTwoPoints:1 +ControlPoint1ShortName:4 +ControlPoint1Mark1Lon:10.169555 +ControlPoint1Mark1Lat:54.428753 +ControlPoint1Mark2Lon:10.169408 +ControlPoint1Mark2Lat:54.428653 + +ControlPoint2UUID:0807af7c-9b42-11e0-85be-406186cbf87c +ControlPoint2Name:Star-R6-1 +ControlPoint2HasTwoPoints:0 +ControlPoint2ShortName:1 +ControlPoint2Mark1Lon:10.235563 +ControlPoint2Mark1Lat:54.504244 + +ControlPoint3UUID:0beb273c-992f-11e0-85be-406186cbf87c +ControlPoint3Name:Finish Silbernes Band +ControlPoint3HasTwoPoints:1 +ControlPoint3ShortName:F +ControlPoint3Mark1Lon:10.273520 +ControlPoint3Mark1Lat:54.499905 +ControlPoint3Mark2Lon:10.273137 +ControlPoint3Mark2Lat:54.500737 + +ControlPoint4UUID:144f44f4-9dac-11e0-85be-406186cbf87c +ControlPoint4Name:SB-Mark H5 (y) (WP 33) +ControlPoint4HasTwoPoints:0 +ControlPoint4ShortName:H5 +ControlPoint4Mark1Lon:10.666667 +ControlPoint4Mark1Lat:54.548333 + +ControlPoint5UUID:18e98784-9930-11e0-85be-406186cbf87c +ControlPoint5Name:Start Silbernes Band +ControlPoint5HasTwoPoints:1 +ControlPoint5ShortName:S +ControlPoint5Mark1Lon:10.171855 +ControlPoint5Mark1Lat:54.428460 +ControlPoint5Mark2Lon:10.422222 +ControlPoint5Mark2Lat:54.564262 + +ControlPoint6UUID:1d8536e6-9a91-11e0-85be-406186cbf87c +ControlPoint6Name:Star1-4 +ControlPoint6HasTwoPoints:1 +ControlPoint6ShortName:4 +ControlPoint6Mark1Lon:10.219525 +ControlPoint6Mark1Lat:54.500618 +ControlPoint6Mark2Lon:10.220421 +ControlPoint6Mark2Lat:54.500744 + +ControlPoint7UUID:22475d30-9951-11e0-85be-406186cbf87c +ControlPoint7Name:Audi Start +ControlPoint7HasTwoPoints:1 +ControlPoint7ShortName:S +ControlPoint7Mark1Lon:10.170118 +ControlPoint7Mark1Lat:54.342563 +ControlPoint7Mark2Lon:10.170157 +ControlPoint7Mark2Lat:54.341457 + +ControlPoint8UUID:2307bec6-992f-11e0-85be-406186cbf87c +ControlPoint8Name:Mark KO2 red/white +ControlPoint8HasTwoPoints:0 +ControlPoint8ShortName:KO +ControlPoint8Mark1Lon:10.450000 +ControlPoint8Mark1Lat:54.533333 + +ControlPoint9UUID:2497f822-9ab1-11e0-85be-406186cbf87c +ControlPoint9Name:49Y-R7-1 +ControlPoint9HasTwoPoints:0 +ControlPoint9ShortName:1 +ControlPoint9Mark1Lon:10.207426 +ControlPoint9Mark1Lat:54.435751 + +ControlPoint10UUID:27c13096-9a8d-11e0-85be-406186cbf87c +ControlPoint10Name:49b4-4 +ControlPoint10HasTwoPoints:1 +ControlPoint10ShortName:4 +ControlPoint10Mark1Lon:10.208914 +ControlPoint10Mark1Lat:54.445496 +ControlPoint10Mark2Lon:10.209630 +ControlPoint10Mark2Lat:54.444822 + +ControlPoint11UUID:2c8584ca-9dac-11e0-85be-406186cbf87c +ControlPoint11Name:SB-Finish (Ziel) at Kiel Lighthouse +ControlPoint11HasTwoPoints:0 +ControlPoint11ShortName:KL +ControlPoint11Mark1Lon:10.278333 +ControlPoint11Mark1Lat:54.498333 + +ControlPoint12UUID:32ad8a14-992e-11e0-85be-406186cbf87c +ControlPoint12Name:Mark 14 red (Fahrwassertonne 14) +ControlPoint12HasTwoPoints:0 +ControlPoint12ShortName:14 +ControlPoint12Mark1Lon:10.185000 +ControlPoint12Mark1Lat:54.371667 + +ControlPoint13UUID:32fb2850-9951-11e0-85be-406186cbf87c +ControlPoint13Name:Audi Mark1 +ControlPoint13HasTwoPoints:0 +ControlPoint13ShortName:1 +ControlPoint13Mark1Lon:10.159550 +ControlPoint13Mark1Lat:54.341178 + +ControlPoint14UUID:34feeaea-9c32-11e0-85be-406186cbf87c +ControlPoint14Name:Star7-1a +ControlPoint14HasTwoPoints:0 +ControlPoint14ShortName:1a +ControlPoint14Mark1Lon:10.230608 +ControlPoint14Mark1Lat:54.508407 + +ControlPoint15UUID:3ecf9ade-992f-11e0-85be-406186cbf87c +ControlPoint15Name:Schlei Safe Water Mark red/white +ControlPoint15HasTwoPoints:0 +ControlPoint15ShortName:SS +ControlPoint15Mark1Lon:10.055000 +ControlPoint15Mark1Lat:54.668333 + +ControlPoint16UUID:405f346c-99e9-11e0-85be-406186cbf87c +ControlPoint16Name:49erYR2-1 +ControlPoint16HasTwoPoints:0 +ControlPoint16ShortName:1 +ControlPoint16Mark1Lon:10.200182 +ControlPoint16Mark1Lat:54.427670 + +ControlPoint17UUID:4123b6ea-9951-11e0-85be-406186cbf87c +ControlPoint17Name:Audi Mark2 +ControlPoint17HasTwoPoints:0 +ControlPoint17ShortName:2 +ControlPoint17Mark1Lon:10.170157 +ControlPoint17Mark1Lat:54.341457 + +ControlPoint18UUID:4bac3eca-992e-11e0-85be-406186cbf87c +ControlPoint18Name:Three yellow marks* (3 gelbe Tonnen) +ControlPoint18HasTwoPoints:0 +ControlPoint18ShortName:3y +ControlPoint18Mark1Lon:10.198333 +ControlPoint18Mark1Lat:54.386667 + +ControlPoint19UUID:535fb3f4-9951-11e0-85be-406186cbf87c +ControlPoint19Name:Audi Finish +ControlPoint19HasTwoPoints:1 +ControlPoint19ShortName:F +ControlPoint19Mark1Lon:10.159708 +ControlPoint19Mark1Lat:54.340965 +ControlPoint19Mark2Lon:10.159503 +ControlPoint19Mark2Lat:54.341232 + +ControlPoint20UUID:56f63cf8-99e8-11e0-85be-406186cbf87c +ControlPoint20Name:49erYR1-T +ControlPoint20HasTwoPoints:0 +ControlPoint20ShortName:T +ControlPoint20Mark1Lon:10.199148 +ControlPoint20Mark1Lat:54.429370 + +ControlPoint21UUID:5933cdca-9950-11e0-85be-406186cbf87c +ControlPoint21Name:H Start +ControlPoint21HasTwoPoints:1 +ControlPoint21ShortName:S +ControlPoint21Mark1Lon:10.169470 +ControlPoint21Mark1Lat:54.428662 +ControlPoint21Mark2Lon:10.169382 +ControlPoint21Mark2Lat:54.428875 + +ControlPoint22UUID:65b2dfbc-9b64-11e0-85be-406186cbf87c +ControlPoint22Name:K Start +ControlPoint22HasTwoPoints:1 +ControlPoint22ShortName:S +ControlPoint22Mark1Lon:10.200427 +ControlPoint22Mark1Lat:54.494328 +ControlPoint22Mark2Lon:10.198325 +ControlPoint22Mark2Lat:54.497162 + +ControlPoint23UUID:65c3a9ec-992e-11e0-85be-406186cbf87c +ControlPoint23Name:Mark 4 red (Fahrwassertonne 4) +ControlPoint23HasTwoPoints:0 +ControlPoint23ShortName:4 +ControlPoint23Mark1Lon:10.233333 +ControlPoint23Mark1Lat:54.428333 + +ControlPoint24UUID:69a347b2-9950-11e0-85be-406186cbf87c +ControlPoint24Name:H Mark1 +ControlPoint24HasTwoPoints:0 +ControlPoint24ShortName:1 +ControlPoint24Mark1Lon:10.169522 +ControlPoint24Mark1Lat:54.428727 + +ControlPoint25UUID:6c30e118-9a8d-11e0-85be-406186cbf87c +ControlPoint25Name:49b4-F +ControlPoint25HasTwoPoints:1 +ControlPoint25ShortName:F +ControlPoint25Mark1Lon:10.209712 +ControlPoint25Mark1Lat:54.445952 +ControlPoint25Mark2Lon:10.210658 +ControlPoint25Mark2Lat:54.445241 + +ControlPoint26UUID:7634bbfe-9dac-11e0-85be-406186cbf87c +ControlPoint26Name:SB-Mark Red (WP 124) +ControlPoint26HasTwoPoints:0 +ControlPoint26ShortName:WP +ControlPoint26Mark1Lon:10.236667 +ControlPoint26Mark1Lat:55.045000 + +ControlPoint27UUID:79dab2ea-9aaf-11e0-85be-406186cbf87c +ControlPoint27Name:49erB5-4 +ControlPoint27HasTwoPoints:1 +ControlPoint27ShortName:4 +ControlPoint27Mark1Lon:10.201355 +ControlPoint27Mark1Lat:54.446073 +ControlPoint27Mark2Lon:10.197830 +ControlPoint27Mark2Lat:54.446886 + +ControlPoint28UUID:7a218886-9b64-11e0-85be-406186cbf87c +ControlPoint28Name:K Mark1 +ControlPoint28HasTwoPoints:0 +ControlPoint28ShortName:1 +ControlPoint28Mark1Lon:10.165025 +ControlPoint28Mark1Lat:54.503712 + +ControlPoint29UUID:7c639ea8-9da9-11e0-85be-406186cbf87c +ControlPoint29Name:SB Mark1 (Schleimünde Approach (r/w) ) +ControlPoint29HasTwoPoints:0 +ControlPoint29ShortName:1 +ControlPoint29Mark1Lon:10.060000 +ControlPoint29Mark1Lat:54.665000 + +ControlPoint30UUID:8145342e-992e-11e0-85be-406186cbf87c +ControlPoint30Name:Mark 2 red (Fahrwassertonne 2) +ControlPoint30HasTwoPoints:0 +ControlPoint30ShortName:2 +ControlPoint30Mark1Lon:10.283333 +ControlPoint30Mark1Lat:54.465000 + +ControlPoint31UUID:84009c94-98e3-11e0-85be-406186cbf87c +ControlPoint31Name:Test - Top Mark +ControlPoint31HasTwoPoints:0 +ControlPoint31ShortName:1 +ControlPoint31Mark1Lon:10.169028 +ControlPoint31Mark1Lat:54.428993 + +ControlPoint32UUID:86c90a6e-9a9c-11e0-85be-406186cbf87c +ControlPoint32Name:S3-4 +ControlPoint32HasTwoPoints:1 +ControlPoint32ShortName:4 +ControlPoint32Mark1Lon:10.218663 +ControlPoint32Mark1Lat:54.515525 +ControlPoint32Mark2Lon:10.218214 +ControlPoint32Mark2Lat:54.515649 + +ControlPoint33UUID:8d1c4750-9b64-11e0-85be-406186cbf87c +ControlPoint33Name:K Mark2 +ControlPoint33HasTwoPoints:0 +ControlPoint33ShortName:2 +ControlPoint33Mark1Lon:10.169415 +ControlPoint33Mark1Lat:54.428730 + +ControlPoint34UUID:99cae4d0-992e-11e0-85be-406186cbf87c +ControlPoint34Name:Mark 1 green (Fahrwassertonne 1) +ControlPoint34HasTwoPoints:0 +ControlPoint34ShortName:1 +ControlPoint34Mark1Lon:10.251667 +ControlPoint34Mark1Lat:54.475000 + +ControlPoint35UUID:9beca160-9a8f-11e0-85be-406186cbf87c +ControlPoint35Name:49erb1-1 +ControlPoint35HasTwoPoints:0 +ControlPoint35ShortName:T +ControlPoint35Mark1Lon:10.196778 +ControlPoint35Mark1Lat:54.439621 + +ControlPoint36UUID:9c4e4984-9a93-11e0-85be-406186cbf87c +ControlPoint36Name:Star2-4 +ControlPoint36HasTwoPoints:1 +ControlPoint36ShortName:4 +ControlPoint36Mark1Lon:10.230194 +ControlPoint36Mark1Lat:54.504793 +ControlPoint36Mark2Lon:10.229448 +ControlPoint36Mark2Lat:54.505033 + +ControlPoint37UUID:9caa2f3a-98e3-11e0-85be-406186cbf87c +ControlPoint37Name:Test - start +ControlPoint37HasTwoPoints:1 +ControlPoint37ShortName:S +ControlPoint37Mark1Lon:10.169440 +ControlPoint37Mark1Lat:54.428712 +ControlPoint37Mark2Lon:10.169403 +ControlPoint37Mark2Lat:54.428872 + +ControlPoint38UUID:9da911ea-9950-11e0-85be-406186cbf87c +ControlPoint38Name:H Mark4 +ControlPoint38HasTwoPoints:1 +ControlPoint38ShortName:4 +ControlPoint38Mark1Lon:10.169477 +ControlPoint38Mark1Lat:54.428658 +ControlPoint38Mark2Lon:10.169432 +ControlPoint38Mark2Lat:54.428505 + +ControlPoint39UUID:a0cbd40c-9dab-11e0-85be-406186cbf87c +ControlPoint39Name:SB-Mark Schleimünde Approach (r/w) +ControlPoint39HasTwoPoints:0 +ControlPoint39ShortName:SA +ControlPoint39Mark1Lon:10.060000 +ControlPoint39Mark1Lat:54.665000 + +ControlPoint40UUID:a68cc03e-9b64-11e0-85be-406186cbf87c +ControlPoint40Name:K Mark3 +ControlPoint40HasTwoPoints:1 +ControlPoint40ShortName:3 +ControlPoint40Mark1Lon:10.169510 +ControlPoint40Mark1Lat:54.428703 +ControlPoint40Mark2Lon:10.237422 +ControlPoint40Mark2Lat:54.480728 + +ControlPoint41UUID:a8c75c3e-9a8c-11e0-85be-406186cbf87c +ControlPoint41Name:49b4-Start +ControlPoint41HasTwoPoints:1 +ControlPoint41ShortName:S +ControlPoint41Mark1Lon:10.209545 +ControlPoint41Mark1Lat:54.446065 +ControlPoint41Mark2Lon:10.211504 +ControlPoint41Mark2Lat:54.444520 + +ControlPoint42UUID:a91da4ea-9dac-11e0-85be-406186cbf87c +ControlPoint42Name:SB-Mark Thurö Rev (Y/B) (WP 277) +ControlPoint42HasTwoPoints:0 +ControlPoint42ShortName:Th +ControlPoint42Mark1Lon:10.735000 +ControlPoint42Mark1Lat:55.020000 + +ControlPoint43UUID:b2ad1adc-9950-11e0-85be-406186cbf87c +ControlPoint43Name:H Finish +ControlPoint43HasTwoPoints:1 +ControlPoint43ShortName:F +ControlPoint43Mark1Lon:10.169398 +ControlPoint43Mark1Lat:54.428765 +ControlPoint43Mark2Lon:10.169380 +ControlPoint43Mark2Lat:54.428638 + +ControlPoint44UUID:b31eaad0-9dab-11e0-85be-406186cbf87c +ControlPoint44Name:SB-Mark Spodsbjerg-SE +ControlPoint44HasTwoPoints:0 +ControlPoint44ShortName:Sp +ControlPoint44Mark1Lon:10.845000 +ControlPoint44Mark1Lat:54.918333 + +ControlPoint45UUID:b3af1998-992e-11e0-85be-406186cbf87c +ControlPoint45Name:Mark K yellow (Kabeltonne) +ControlPoint45HasTwoPoints:0 +ControlPoint45ShortName:K +ControlPoint45Mark1Lon:10.255000 +ControlPoint45Mark1Lat:54.488333 + +ControlPoint46UUID:bfe4dc42-9b64-11e0-85be-406186cbf87c +ControlPoint46Name:K Mark4 +ControlPoint46HasTwoPoints:1 +ControlPoint46ShortName:4 +ControlPoint46Mark1Lon:10.198390 +ControlPoint46Mark1Lat:54.497398 +ControlPoint46Mark2Lon:10.198355 +ControlPoint46Mark2Lat:54.497917 + +ControlPoint47UUID:c2199936-9dac-11e0-85be-406186cbf87c +ControlPoint47Name:SB-Mark Black Yellow (WP 253) +ControlPoint47HasTwoPoints:0 +ControlPoint47ShortName:BY +ControlPoint47Mark1Lon:10.936667 +ControlPoint47Mark1Lat:55.185000 + +ControlPoint48UUID:c583e438-9950-11e0-85be-406186cbf87c +ControlPoint48Name:D Start +ControlPoint48HasTwoPoints:1 +ControlPoint48ShortName:S +ControlPoint48Mark1Lon:10.169462 +ControlPoint48Mark1Lat:54.428848 +ControlPoint48Mark2Lon:10.169363 +ControlPoint48Mark2Lat:54.428722 + +ControlPoint49UUID:cd57b5f8-992e-11e0-85be-406186cbf87c +ControlPoint49Name:Stollergrund-N (black/yellow) +ControlPoint49HasTwoPoints:0 +ControlPoint49ShortName:SN +ControlPoint49Mark1Lon:10.200000 +ControlPoint49Mark1Lat:54.536667 + +ControlPoint50UUID:d2b4c5d2-9950-11e0-85be-406186cbf87c +ControlPoint50Name:D Mark1 +ControlPoint50HasTwoPoints:0 +ControlPoint50ShortName:1 +ControlPoint50Mark1Lon:10.166928 +ControlPoint50Mark1Lat:54.345997 + +ControlPoint51UUID:de21cff2-9ab6-11e0-85be-406186cbf87c +ControlPoint51Name:49Y-R8-1a +ControlPoint51HasTwoPoints:0 +ControlPoint51ShortName:1 +ControlPoint51Mark1Lon:10.207476 +ControlPoint51Mark1Lat:54.435762 + +ControlPoint52UUID:e299f688-9dac-11e0-85be-406186cbf87c +ControlPoint52Name:SB-Gate DW 59 green and DW 56 red +ControlPoint52HasTwoPoints:0 +ControlPoint52ShortName:59 +ControlPoint52Mark1Lon:10.780000 +ControlPoint52Mark1Lat:54.736667 + +ControlPoint53UUID:e59815c6-9b64-11e0-85be-406186cbf87c +ControlPoint53Name:K Finish +ControlPoint53HasTwoPoints:1 +ControlPoint53ShortName:F +ControlPoint53Mark1Lon:10.163997 +ControlPoint53Mark1Lat:54.499787 +ControlPoint53Mark2Lon:10.163545 +ControlPoint53Mark2Lat:54.500347 + +ControlPoint54UUID:e663db6c-9a8c-11e0-85be-406186cbf87c +ControlPoint54Name:49b4-1 +ControlPoint54HasTwoPoints:0 +ControlPoint54ShortName:1 +ControlPoint54Mark1Lon:10.196146 +ControlPoint54Mark1Lat:54.441407 + +ControlPoint55UUID:f214ea50-992e-11e0-85be-406186cbf87c +ControlPoint55Name:Gate between Mittelgrund-N +ControlPoint55HasTwoPoints:0 +ControlPoint55ShortName:MN +ControlPoint55Mark1Lon:10.055000 +ControlPoint55Mark1Lat:54.513333 + +ControlPoint56UUID:f641d92e-9ab6-11e0-85be-406186cbf87c +ControlPoint56Name:49Y-R8-1b +ControlPoint56HasTwoPoints:0 +ControlPoint56ShortName:1 +ControlPoint56Mark1Lon:10.203712 +ControlPoint56Mark1Lat:54.434916 + +ControlPoint57UUID:f76bea2c-9a95-11e0-85be-406186cbf87c +ControlPoint57Name:DIM1-F +ControlPoint57HasTwoPoints:1 +ControlPoint57ShortName:F +ControlPoint57Mark1Lon:9.850912 +ControlPoint57Mark1Lat:54.474097 +ControlPoint57Mark2Lon:9.849851 +ControlPoint57Mark2Lat:54.472319 + + +SegmentFile:segments.php +Route1UUID:2a75ee72-9dde-11e0-85be-406186cbf87c +Route1Description:505 Race 4 +Route1Length:0 +Route1ControlPoint1UUID:65b2dfbc-9b64-11e0-85be-406186cbf87c +Route1ControlPoint2UUID:7a218886-9b64-11e0-85be-406186cbf87c +Route1ControlPoint3UUID:bfe4dc42-9b64-11e0-85be-406186cbf87c +Route1ControlPoint4UUID:7a218886-9b64-11e0-85be-406186cbf87c +Route1ControlPoint5UUID:bfe4dc42-9b64-11e0-85be-406186cbf87c +Route1ControlPoint6UUID:e59815c6-9b64-11e0-85be-406186cbf87c + +//-------- AUTO GENERATED PARAMETERS END ------------------ diff --git a/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/impl/components/TestLeaderboardGroupFilteringRetrievalProcessor.java b/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/impl/components/TestLeaderboardGroupRetrievalProcessor.java similarity index 84% rename from java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/impl/components/TestLeaderboardGroupFilteringRetrievalProcessor.java rename to java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/impl/components/TestLeaderboardGroupRetrievalProcessor.java index 15ec5f0c560..c30e5543ff4 100644 --- a/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/impl/components/TestLeaderboardGroupFilteringRetrievalProcessor.java +++ b/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/impl/components/TestLeaderboardGroupRetrievalProcessor.java @@ -22,10 +22,9 @@ import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.impl.LeaderboardGroupImpl; import com.sap.sailing.server.RacingEventService; import com.sap.sse.datamining.AdditionalResultDataBuilder; -import com.sap.sse.datamining.components.FilterCriteria; import com.sap.sse.datamining.components.Processor; -public class TestLeaderboardGroupFilteringRetrievalProcessor { +public class TestLeaderboardGroupRetrievalProcessor { private RacingEventService service; private Processor retriever; @@ -36,13 +35,17 @@ public class TestLeaderboardGroupFilteringRetrievalProcessor { public void initializeComponents() { service = mock(RacingEventService.class); stub(service.getLeaderboardGroups()).toReturn(getGroupsInService()); - + + retrievedGroups = new HashSet<>(); Processor receiver = new Processor() { @Override - public void onElement(LeaderboardGroup element) { + public void processElement(LeaderboardGroup element) { retrievedGroups.add(element); } @Override + public void onFailure(Throwable failure) { + } + @Override public void finish() throws InterruptedException { } @Override @@ -54,14 +57,7 @@ public class TestLeaderboardGroupFilteringRetrievalProcessor { } }; - FilterCriteria criteria = new FilterCriteria() { - @Override - public boolean matches(LeaderboardGroup element) { - String name = element.getName(); - return name == "LG1" || name == "LG2" || name == "LG3"; - } - }; - retriever = new LeaderboardGroupFilteringRetrievalProcessor(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(receiver), criteria); + retriever = new LeaderboardGroupRetrievalProcessor(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(receiver)); } private Map getGroupsInService() { @@ -77,7 +73,7 @@ public class TestLeaderboardGroupFilteringRetrievalProcessor { @Ignore @Test public void testFilteringRetrieval() throws InterruptedException { - retriever.onElement(service); + retriever.processElement(service); retriever.finish(); Collection expectedGroups = getExpectedRetrievedGroups(); diff --git a/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/impl/functions/TestSailingFunctionsRegistration.java b/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/impl/functions/TestSailingFunctionsRegistration.java new file mode 100644 index 00000000000..761ecbc6a6a --- /dev/null +++ b/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/impl/functions/TestSailingFunctionsRegistration.java @@ -0,0 +1,103 @@ +package com.sap.sailing.datamining.impl.functions; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.sap.sailing.datamining.data.HasGPSFixContext; +import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; +import com.sap.sailing.datamining.data.HasTrackedRaceContext; +import com.sap.sailing.datamining.impl.data.SailingDataMiningClassesWithFunctionsService; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Moving; +import com.sap.sailing.domain.base.Nationality; +import com.sap.sailing.domain.base.Team; +import com.sap.sailing.domain.common.Speed; +import com.sap.sse.common.Named; +import com.sap.sse.datamining.factories.FunctionFactory; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.functions.FunctionRegistry; +import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry; + +public class TestSailingFunctionsRegistration { + + private static FunctionRegistry functionRegistry; + + @BeforeClass + public static void setUpFunctionRegistryAndProvider() { + SailingDataMiningClassesWithFunctionsService classesWithFunctionsService = new SailingDataMiningClassesWithFunctionsService(); + + functionRegistry = new SimpleFunctionRegistry(); + functionRegistry.registerAllWithInternalFunctionPolicy(classesWithFunctionsService.getInternalClassesWithMarkedMethods()); + } + + @Test + public void testImportantRegisteredDimensions() throws NoSuchMethodException, SecurityException { + Collection> expectedDimensions = createExpectedImportantRegisteredDimensions(); + Collection> providedDimensions = functionRegistry.getDimensions(); + for (Function dimension : expectedDimensions) { + assertThat("The expected dimension '" + dimension + "' wasn't provided.", + providedDimensions.contains(dimension), is(true)); + } + } + + private Collection> createExpectedImportantRegisteredDimensions() throws NoSuchMethodException, SecurityException { + Collection> expectedDimensions = new HashSet<>(); + + Method getRegattaMethod = HasTrackedRaceContext.class.getMethod("getRegatta", new Class[0]); + Function getRegatta = FunctionFactory.createMethodWrappingFunction(getRegattaMethod); + Method getNameMethod = Named.class.getMethod("getName", new Class[0]); + Function getName = FunctionFactory.createMethodWrappingFunction(getNameMethod); + expectedDimensions.add(FunctionFactory.createCompoundFunction(Arrays.asList(getRegatta, getName))); + + Method getYearMethod = HasTrackedRaceContext.class.getMethod("getYear", new Class[0]); + expectedDimensions.add(FunctionFactory.createMethodWrappingFunction(getYearMethod)); + + Method getCompetitorMethod = HasTrackedLegOfCompetitorContext.class.getMethod("getCompetitor", new Class[0]); + Function getCompetitor = FunctionFactory.createMethodWrappingFunction(getCompetitorMethod); + Method getTeamMethod = Competitor.class.getMethod("getTeam", new Class[0]); + Function getTeam = FunctionFactory.createMethodWrappingFunction(getTeamMethod); + Method getNationalityMethod = Team.class.getMethod("getNationality", new Class[0]); + Function getNationality = FunctionFactory.createMethodWrappingFunction(getNationalityMethod); + Method getAcronymMethod = Nationality.class.getMethod("getThreeLetterIOCAcronym", new Class[0]); + Function getAcronym = FunctionFactory.createMethodWrappingFunction(getAcronymMethod); + expectedDimensions.add(FunctionFactory.createCompoundFunction(Arrays.asList(getCompetitor, getTeam, getNationality, getAcronym))); + + return expectedDimensions; + } + + @Test + public void testImportantRegisteredStatistics() throws NoSuchMethodException, SecurityException { + Collection> expectedStatistics = createExpectedImportantRegisteredStatistics(); + Collection> providedStatistics = functionRegistry.getStatistics(); + for (Function statistic : expectedStatistics) { + assertThat("The expected statistic '" + statistic + "' wasn't provided.", + providedStatistics.contains(statistic), is(true)); + } + } + + private Collection> createExpectedImportantRegisteredStatistics() throws NoSuchMethodException, SecurityException { + Collection> expectedStatistics = new HashSet<>(); + + Method getDistanceTraveledMethod = HasTrackedLegOfCompetitorContext.class.getMethod("getDistanceTraveled", new Class[0]); + expectedStatistics.add(FunctionFactory.createMethodWrappingFunction(getDistanceTraveledMethod)); + + Method getGPSFixMethod = HasGPSFixContext.class.getMethod("getGPSFix", new Class[0]); + Function getGPSFix = FunctionFactory.createMethodWrappingFunction(getGPSFixMethod); + Method getSpeedMethod = Moving.class.getMethod("getSpeed", new Class[0]); + Function getSpeed = FunctionFactory.createMethodWrappingFunction(getSpeedMethod); + Method getKnotsMethod = Speed.class.getMethod("getKnots", new Class[0]); + Function getKnots = FunctionFactory.createMethodWrappingFunction(getKnotsMethod); + expectedStatistics.add(FunctionFactory.createCompoundFunction(Arrays.asList(getGPSFix, getSpeed, getKnots))); + + return expectedStatistics; + } + +} diff --git a/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/test/TestClusters.java b/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/test/TestClusters.java deleted file mode 100644 index da95ff3d53e..00000000000 --- a/java/com.sap.sailing.datamining.test/src/com/sap/sailing/datamining/test/TestClusters.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.sap.sailing.datamining.test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import org.junit.Test; - -import com.sap.sailing.datamining.Clusters; -import com.sap.sse.datamining.data.deprecated.ClusterOfComparable; -import com.sap.sse.datamining.impl.data.deprecated.ClusterOfComparableImpl; - -public class TestClusters { - - @Test - public void testClusterOfComparable() { - ClusterOfComparable cluster = new ClusterOfComparableImpl("Test", 3, 1); - - assertTrue(cluster.isInRange(1)); - assertTrue(cluster.isInRange(2)); - assertTrue(cluster.isInRange(3)); - - assertFalse(cluster.isInRange(null)); - assertFalse(cluster.isInRange(0)); - assertFalse(cluster.isInRange(4)); - } - - @Test - public void testWindStrengthClusters() { - assertNull(Clusters.WindStrength.getClusterFor(15, Clusters.WindStrength.StandardClusters)); - assertEquals(Clusters.WindStrength.VeryLight, Clusters.WindStrength.getClusterFor(1, Clusters.WindStrength.StandardClusters)); - } - -} diff --git a/java/com.sap.sailing.datamining/META-INF/MANIFEST.MF b/java/com.sap.sailing.datamining/META-INF/MANIFEST.MF index d49c040b52b..71bd7ce57b5 100644 --- a/java/com.sap.sailing.datamining/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.datamining/META-INF/MANIFEST.MF @@ -17,4 +17,5 @@ Require-Bundle: com.sap.sailing.domain;bundle-version="1.0.0", com.sap.sse.datamining.shared;bundle-version="1.0.0", com.sap.sse.common Bundle-ClassPath: . -Bundle-Activator: com.sap.sailing.datamining.impl.Activator +Bundle-Activator: com.sap.sailing.datamining.Activator +Bundle-ActivationPolicy: lazy diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java new file mode 100644 index 00000000000..1b03fd245e6 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java @@ -0,0 +1,38 @@ +package com.sap.sailing.datamining; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; + +import com.sap.sailing.datamining.impl.data.SailingDataMiningClassesWithFunctionsService; +import com.sap.sse.datamining.ClassesWithFunctionsService; + +public class Activator implements BundleActivator { + + public static final String dataRetrieverGroupName = "Sailing"; + + private static BundleContext context; + + private ServiceRegistration classesWithFunctionsServiceRegistration; + + @Override + public void start(BundleContext context) throws Exception { + Activator.context = context; + registerClassesWithFunctionsService(); + } + + @Override + public void stop(BundleContext context) throws Exception { + unregisterClassesWithFunctionsService(); + } + + private void unregisterClassesWithFunctionsService() { + context.ungetService(classesWithFunctionsServiceRegistration.getReference()); + } + + private void registerClassesWithFunctionsService() { + classesWithFunctionsServiceRegistration = context.registerService(ClassesWithFunctionsService.class, + new SailingDataMiningClassesWithFunctionsService(), null); + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Clusters.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Clusters.java deleted file mode 100644 index 6d216820d7b..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Clusters.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.sap.sailing.datamining; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import com.sap.sailing.datamining.impl.WindStrengthClusterImpl; - -public class Clusters { - - private Clusters() { } - - public static class WindStrength { - - public static WindStrengthCluster VeryLight = new WindStrengthClusterImpl("Very Light", 0.0, 2.5); - public static WindStrengthCluster Light = new WindStrengthClusterImpl("Very Light", 2.5, 5.0); - public static WindStrengthCluster Medium = new WindStrengthClusterImpl("Very Light", 5.0, 7.5); - public static WindStrengthCluster Strong = new WindStrengthClusterImpl("Very Light", 7.5, 10.0); - public static WindStrengthCluster VeryStrong = new WindStrengthClusterImpl("Very Light", 10.0, 12.0); - public static Collection StandardClusters = Arrays.asList(VeryLight, Light, Medium, Strong, VeryStrong); - - private WindStrength() { } - - public static WindStrengthCluster getClusterFor(double windStrengthInBeafort, Collection clusters) { - List sortedClusters = new ArrayList(clusters); - Collections.sort(sortedClusters, new Comparator() { - @Override - public int compare(WindStrengthCluster cluster1, WindStrengthCluster cluster2) { - return cluster1.getUpperRange().compareTo(cluster2.getUpperRange()); - } - }); - - for (WindStrengthCluster cluster : sortedClusters) { - if (cluster.isInRange(windStrengthInBeafort)) { - return cluster; - } - } - return null; - } - - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/WindStrengthCluster.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/WindStrengthCluster.java deleted file mode 100644 index 39d701d738f..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/WindStrengthCluster.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sap.sailing.datamining; - -import com.sap.sse.datamining.data.deprecated.ClusterOfComparable; - -public interface WindStrengthCluster extends ClusterOfComparable { - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/GPSFixWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/GPSFixWithContext.java deleted file mode 100644 index 9eff07bbd22..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/GPSFixWithContext.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.sap.sailing.datamining.data; - -import com.sap.sailing.datamining.WindStrengthCluster; -import com.sap.sailing.domain.common.LegType; -import com.sap.sailing.domain.tracking.GPSFixMoving; -import com.sap.sse.datamining.shared.annotations.Dimension; - -public interface GPSFixWithContext extends GPSFixMoving { - - @Dimension(messageKey="regatta") - public String getRegattaName(); - - @Dimension(messageKey="race") - public String getRaceName(); - - @Dimension(messageKey="legNumber") - public int getLegNumber(); - - @Dimension(messageKey="course") - public String getCourseAreaName(); - - @Dimension(messageKey="fleet") - public String getFleetName(); - - @Dimension(messageKey="boatClass") - public String getBoatClassName(); - - /** - * The year of the start of the race. - */ - @Dimension(messageKey="year") - public Integer getYear(); - - /** - * The leg type of the leg, which contains this gps fix. Can be null if there's no wind in the race. - */ - @Dimension(messageKey="legType") - public LegType getLegType(); - - @Dimension(messageKey="competitor") - public String getCompetitorName(); - - @Dimension(messageKey="sailID") - public String getCompetitorSailID(); - - @Dimension(messageKey="nationality") - public String getCompetitorNationality(); - - @Dimension(messageKey="windStrength") - public WindStrengthCluster getWindStrength(); - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixContext.java index 475a425bfda..ec26746969d 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasGPSFixContext.java @@ -1,5 +1,11 @@ package com.sap.sailing.datamining.data; +import com.sap.sailing.domain.tracking.GPSFixMoving; +import com.sap.sse.datamining.shared.annotations.Connector; + public interface HasGPSFixContext extends HasTrackedLegOfCompetitorContext { + + @Connector + public GPSFixMoving getGPSFix(); } \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasLeaderboardContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasLeaderboardContext.java deleted file mode 100644 index b2451294b7f..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasLeaderboardContext.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sailing.datamining.data; - -import com.sap.sailing.domain.leaderboard.Leaderboard; - -public interface HasLeaderboardContext extends HasLeaderboardGroupContext { - - public Leaderboard getLeaderboard(); - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasLeaderboardGroupContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasLeaderboardGroupContext.java deleted file mode 100644 index cbdbcd23ab8..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasLeaderboardGroupContext.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sailing.datamining.data; - -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; - -public interface HasLeaderboardGroupContext { - - public LeaderboardGroup getLeaderboardGroup(); - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegContext.java index c918082a020..0faf8011de4 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegContext.java @@ -2,11 +2,15 @@ package com.sap.sailing.datamining.data; import com.sap.sailing.domain.common.LegType; import com.sap.sailing.domain.tracking.TrackedLeg; +import com.sap.sse.datamining.shared.annotations.Dimension; public interface HasTrackedLegContext extends HasTrackedRaceContext { public TrackedLeg getTrackedLeg(); + + @Dimension(messageKey="LegType", ordinal=5) public LegType getLegType(); + @Dimension(messageKey="LegNumber", ordinal=6) public int getLegNumber(); } \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegOfCompetitorContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegOfCompetitorContext.java index e1f836f5d13..c7fca9e4bf8 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegOfCompetitorContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegOfCompetitorContext.java @@ -1,9 +1,19 @@ package com.sap.sailing.datamining.data; import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; +import com.sap.sse.datamining.shared.Unit; +import com.sap.sse.datamining.shared.annotations.Connector; +import com.sap.sse.datamining.shared.annotations.Statistic; public interface HasTrackedLegOfCompetitorContext extends HasTrackedLegContext { + + public TrackedLegOfCompetitor getTrackedLegOfCompetitor(); + @Connector(messageKey="Competitor") public Competitor getCompetitor(); + + @Statistic(messageKey="DistanceTraveled", resultUnit=Unit.Meters, resultDecimals=0, ordinal=0) + public Double getDistanceTraveled(); } \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java index b5301a27830..eb2226089ff 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java @@ -1,14 +1,34 @@ package com.sap.sailing.datamining.data; +import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.datamining.shared.annotations.Connector; +import com.sap.sse.datamining.shared.annotations.Dimension; -public interface HasTrackedRaceContext extends HasLeaderboardContext { - - public CourseArea getCourseArea(); - public Fleet getFleet(); +public interface HasTrackedRaceContext { + public TrackedRace getTrackedRace(); + + @Connector(messageKey="Regatta", ordinal=0) + public Regatta getRegatta(); + + @Connector(messageKey="CourseArea", ordinal=2) + public CourseArea getCourseArea(); + + @Connector(messageKey="BoatClass", ordinal=1) + public BoatClass getBoatClass(); + + @Connector(messageKey="Fleet", ordinal=3) + public Fleet getFleet(); + + @Connector(messageKey="Race", ordinal=4) + public RaceDefinition getRace(); + + @Dimension(messageKey="Year", ordinal=10) public Integer getYear(); } \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/TrackedLegOfCompetitorWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/TrackedLegOfCompetitorWithContext.java deleted file mode 100644 index 8499ce8d244..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/TrackedLegOfCompetitorWithContext.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.sap.sailing.datamining.data; - -import com.sap.sailing.datamining.WindStrengthCluster; -import com.sap.sailing.domain.common.Distance; -import com.sap.sailing.domain.common.LegType; -import com.sap.sse.datamining.shared.Unit; -import com.sap.sse.datamining.shared.annotations.Dimension; -import com.sap.sse.datamining.shared.annotations.SideEffectFreeValue; - -public interface TrackedLegOfCompetitorWithContext { - - @Dimension(messageKey="regatta") - public String getRegattaName(); - - @Dimension(messageKey="race") - public String getRaceName(); - - @Dimension(messageKey="legNumber") - public int getLegNumber(); - - @Dimension(messageKey="course") - public String getCourseAreaName(); - - @Dimension(messageKey="fleet") - public String getFleetName(); - - @Dimension(messageKey="boatClass") - public String getBoatClassName(); - - /** - * The year of the start of the race. - */ - @Dimension(messageKey="year") - public Integer getYear(); - - @Dimension(messageKey="legType") - public LegType getLegType(); - - @Dimension(messageKey="competitor") - public String getCompetitorName(); - - @Dimension(messageKey="sailID") - public String getCompetitorSailID(); - - @Dimension(messageKey="nationality") - public String getCompetitorNationality(); - - @Dimension(messageKey="windStrength") - public WindStrengthCluster getWindStrength(); - - @SideEffectFreeValue(messageKey="distanceTraveled", resultUnit=Unit.Meters) - public Distance getDistanceTraveled(); - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/DimensionManager.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/DimensionManager.java deleted file mode 100644 index b5fe6dbbb27..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/DimensionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sap.sailing.datamining.dimensions; - -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sse.datamining.data.deprecated.Dimension; - -public interface DimensionManager { - - public Dimension getDimensionFor(DimensionIdentifier sharedDimension); - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/DimensionManagerProvider.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/DimensionManagerProvider.java deleted file mode 100644 index cfce45cbf80..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/DimensionManagerProvider.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.datamining.dimensions; - -import com.sap.sailing.datamining.data.GPSFixWithContext; -import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext; -import com.sap.sailing.datamining.shared.DataTypes; - -public final class DimensionManagerProvider { - - private DimensionManagerProvider() { } - - private static final DimensionManager GPSFixDimensionManager = new GPSFixDimensionManager(); - private static final DimensionManager TrackedLegOfCompetitorDimensionManager = new TrackedLegOfCompetitorDimensionManager(); - - @SuppressWarnings("unchecked") - public static DimensionManager getDimensionManagerFor(DataTypes dataType) { - switch (dataType) { - case GPSFix: - return (DimensionManager) GPSFixDimensionManager; - case TrackedLegOfCompetitor: - return (DimensionManager) TrackedLegOfCompetitorDimensionManager; - } - throw new IllegalArgumentException("Not yet implemented for the given data type: " - + dataType.toString()); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/GPSFixDimensionManager.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/GPSFixDimensionManager.java deleted file mode 100644 index 25fdaa879ef..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/GPSFixDimensionManager.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.sap.sailing.datamining.dimensions; - -import com.sap.sailing.datamining.data.GPSFixWithContext; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.domain.common.LegType; -import com.sap.sse.datamining.data.deprecated.Dimension; -import com.sap.sse.datamining.impl.data.deprecated.AbstractDimension; - -public final class GPSFixDimensionManager implements DimensionManager { - - public GPSFixDimensionManager() { } - - /** - * @return The dimension for the given dimension type. Throws an exception, if the used ValueType doesn't match the ValueType of the returning dimension. - */ - @Override - public Dimension getDimensionFor(DimensionIdentifier dimension) { - switch (dimension) { - case BoatClassName: - return BoatClassNameDimension; - case CompetitorName: - return CompetitorNameDimension; - case CourseAreaName: - return CourseAreaNameDimension; - case FleetName: - return FleetNameDimension; - case LegNumber: - return LegNumberDimension; - case LegType: - return LegTypeDimension; - case Nationality: - return NationalityDimension; - case RaceName: - return RaceNameDimension; - case RegattaName: - return RegattaNameDimension; - case SailID: - return SailIDDimension; - case WindStrength: - return WindStrengthDimension; - case Year: - return YearDimension; - } - throw new IllegalArgumentException("Not yet implemented for the given dimension: " - + dimension.toString()); - } - - public final static Dimension RegattaNameDimension = new AbstractDimension("Regatta") { - @Override - public String getDimensionValueFrom(GPSFixWithContext data) { - return data.getRegattaName(); - } - }; - - public final static Dimension RaceNameDimension = new AbstractDimension("Race") { - @Override - public String getDimensionValueFrom(GPSFixWithContext data) { - return data.getRaceName(); - } - }; - - public final static Dimension LegNumberDimension = new AbstractDimension("Leg Number") { - @Override - public Integer getDimensionValueFrom(GPSFixWithContext data) { - return data.getLegNumber(); - } - }; - - public final static Dimension CourseAreaNameDimension = new AbstractDimension("Course Area") { - @Override - public String getDimensionValueFrom(GPSFixWithContext data) { - return data.getCourseAreaName(); - } - }; - - public final static Dimension FleetNameDimension = new AbstractDimension("Fleet") { - @Override - public String getDimensionValueFrom(GPSFixWithContext data) { - return data.getFleetName(); - } - }; - - public final static Dimension BoatClassNameDimension = new AbstractDimension("Boat Class") { - @Override - public String getDimensionValueFrom(GPSFixWithContext data) { - return data.getBoatClassName(); - } - }; - - public final static Dimension YearDimension = new AbstractDimension("Year") { - @Override - public Integer getDimensionValueFrom(GPSFixWithContext data) { - return data.getYear(); - } - }; - - public final static Dimension LegTypeDimension = new AbstractDimension("Leg Type") { - @Override - public LegType getDimensionValueFrom(GPSFixWithContext data) { - return data.getLegType(); - } - }; - - public final static Dimension CompetitorNameDimension = new AbstractDimension("Competitor") { - @Override - public String getDimensionValueFrom(GPSFixWithContext data) { - return data.getCompetitorName(); - } - }; - - public final static Dimension SailIDDimension = new AbstractDimension("Sail ID") { - @Override - public String getDimensionValueFrom(GPSFixWithContext data) { - return data.getCompetitorSailID(); - } - }; - - public final static Dimension NationalityDimension = new AbstractDimension("Nationality") { - @Override - public String getDimensionValueFrom(GPSFixWithContext data) { - return data.getCompetitorNationality(); - } - }; - - //TODO after new clusters - public final static Dimension WindStrengthDimension = new AbstractDimension("Wind Strength") { - @Override - public String getDimensionValueFrom(GPSFixWithContext data) { - return data.getWindStrength().getName(); - } - }; - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/TrackedLegOfCompetitorDimensionManager.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/TrackedLegOfCompetitorDimensionManager.java deleted file mode 100644 index e389758cb9a..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/dimensions/TrackedLegOfCompetitorDimensionManager.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.sap.sailing.datamining.dimensions; - -import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.domain.common.LegType; -import com.sap.sse.datamining.data.deprecated.Dimension; -import com.sap.sse.datamining.impl.data.deprecated.AbstractDimension; - -public final class TrackedLegOfCompetitorDimensionManager implements DimensionManager { - - public TrackedLegOfCompetitorDimensionManager() { } - - /** - * @return The dimension for the given dimension type. Throws an exception, if the used ValueType doesn't match the ValueType of the returning dimension. - */ - public Dimension getDimensionFor(DimensionIdentifier dimension) { - switch (dimension) { - case BoatClassName: - return BoatClassNameDimension; - case CompetitorName: - return CompetitorNameDimension; - case CourseAreaName: - return CourseAreaNameDimension; - case FleetName: - return FleetNameDimension; - case LegNumber: - return LegNumberDimension; - case LegType: - return LegTypeDimension; - case Nationality: - return NationalityDimension; - case RaceName: - return RaceNameDimension; - case RegattaName: - return RegattaNameDimension; - case SailID: - return SailIDDimension; - case WindStrength: - return WindStrengthDimension; - case Year: - return YearDimension; - } - throw new IllegalArgumentException("Not yet implemented for the given dimension: " - + dimension.toString()); - } - - public final static Dimension RegattaNameDimension = new AbstractDimension("Regatta") { - @Override - public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getRegattaName(); - } - }; - - public final static Dimension RaceNameDimension = new AbstractDimension("Race") { - @Override - public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getRaceName(); - } - }; - - public final static Dimension LegNumberDimension = new AbstractDimension("Leg Number") { - @Override - public Integer getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getLegNumber(); - } - }; - - public final static Dimension CourseAreaNameDimension = new AbstractDimension("Course Area") { - @Override - public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getCourseAreaName(); - } - }; - - public final static Dimension FleetNameDimension = new AbstractDimension("Fleet") { - @Override - public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getFleetName(); - } - }; - - public final static Dimension BoatClassNameDimension = new AbstractDimension("Boat Class") { - @Override - public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getBoatClassName(); - } - }; - - public final static Dimension YearDimension = new AbstractDimension("Year") { - @Override - public Integer getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getYear(); - } - }; - - public final static Dimension LegTypeDimension = new AbstractDimension("Leg Type") { - @Override - public LegType getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getLegType(); - } - }; - - public final static Dimension CompetitorNameDimension = new AbstractDimension("Competitor") { - @Override - public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getCompetitorName(); - } - }; - - public final static Dimension SailIDDimension = new AbstractDimension("Sail ID") { - @Override - public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getCompetitorSailID(); - } - }; - - public final static Dimension NationalityDimension = new AbstractDimension("Nationality") { - @Override - public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getCompetitorNationality(); - } - }; - - //TODO after new clusters - public final static Dimension WindStrengthDimension = new AbstractDimension("Wind Strength") { - @Override - public String getDimensionValueFrom(TrackedLegOfCompetitorWithContext data) { - return data.getWindStrength().getName(); - } - }; - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/DataMiningFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/DataMiningFactory.java deleted file mode 100644 index 595fb46bfda..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/DataMiningFactory.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.sap.sailing.datamining.factories; - -import java.util.Locale; - -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sailing.server.RacingEventService; -import com.sap.sse.datamining.Query; -import com.sap.sse.datamining.components.ParallelAggregator; -import com.sap.sse.datamining.components.ParallelDataRetriever; -import com.sap.sse.datamining.components.ParallelExtractor; -import com.sap.sse.datamining.components.ParallelFilter; -import com.sap.sse.datamining.components.ParallelGrouper; -import com.sap.sse.datamining.factories.AggregatorFactory; -import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.impl.DataMiningActivator; -import com.sap.sse.datamining.impl.deprecated.QueryImpl; -import com.sap.sse.datamining.workers.FiltrationWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public final class DataMiningFactory { - - private DataMiningFactory() { - } - - public static Query createQuery( - QueryDefinition queryDefinition, RacingEventService racingService) { - Locale locale = DataMiningStringMessages.Util.getLocaleFrom(queryDefinition.getLocaleInfoName()); - - ParallelDataRetriever retriever = DataRetrieverFactory.createDataRetriever( - queryDefinition.getDataType(), racingService, DataMiningActivator.getExecutor()); - - ParallelFilter filter = createFilter(queryDefinition); - - ParallelGrouper grouper = GrouperFactory.createGrouper(queryDefinition, - DataMiningActivator.getExecutor()); - ParallelExtractor extractor = ExtractorFactory.createExtractor( - DataMiningActivator.getStringMessages(), locale, queryDefinition.getStatisticType(), - DataMiningActivator.getExecutor()); - ParallelAggregator aggregator = AggregatorFactory.createAggregator( - DataMiningActivator.getStringMessages(), locale, queryDefinition.getStatisticType().getValueType(), - queryDefinition.getAggregatorType(), DataMiningActivator.getExecutor()); - - return new QueryImpl(DataMiningActivator.getStringMessages(), locale, - retriever, filter, grouper, extractor, aggregator); - } - - private static ParallelFilter createFilter(QueryDefinition queryDefinition) { - if (queryDefinition.getSelection().isEmpty()) { - return FilterFactory.createNonFilteringFilter(); - } - - WorkerBuilder> workerBuilder = FilterFactory.createDimensionFilterBuilder( - queryDefinition.getDataType(), queryDefinition.getSelection()); - return FilterFactory.createParallelFilter(workerBuilder, DataMiningActivator.getExecutor()); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/DataRetrieverFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/DataRetrieverFactory.java deleted file mode 100644 index 1635da5fb2d..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/DataRetrieverFactory.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.sap.sailing.datamining.factories; - -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sailing.datamining.impl.components.GroupDividingParallelDataRetriever; -import com.sap.sailing.datamining.impl.workers.builders.DataRetrieverWorkerBuilder; -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; -import com.sap.sailing.server.RacingEventService; -import com.sap.sse.datamining.components.ParallelDataRetriever; -import com.sap.sse.datamining.workers.DataRetrievalWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public final class DataRetrieverFactory { - - private DataRetrieverFactory() { - } - - /** - * Creates a retriever for the given data type. Throws an exception, if the used DataType doesn't match - * the DataType of the returning retriever. - */ - public static ParallelDataRetriever createDataRetriever(DataTypes dataType, RacingEventService racingService, ThreadPoolExecutor executor) { - WorkerBuilder> workerBuilder = new DataRetrieverWorkerBuilder(dataType); - return new GroupDividingParallelDataRetriever(racingService, workerBuilder, executor); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/ExtractorFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/ExtractorFactory.java deleted file mode 100644 index 3716ad2b970..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/ExtractorFactory.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.sap.sailing.datamining.factories; - -import java.util.Locale; -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sailing.datamining.impl.workers.builders.ExtractionWorkerBuilder; -import com.sap.sailing.datamining.shared.StatisticType; -import com.sap.sse.datamining.components.ParallelExtractor; -import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.impl.components.deprecated.GroupDividingParallelExtractor; -import com.sap.sse.datamining.shared.Message; -import com.sap.sse.datamining.shared.Unit; -import com.sap.sse.datamining.workers.ExtractionWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public final class ExtractorFactory { - - private ExtractorFactory() { } - - public static ParallelExtractor createExtractor(DataMiningStringMessages stringMessages, Locale locale, - StatisticType statisticType, ThreadPoolExecutor executor) { - WorkerBuilder> workerBuilder = new ExtractionWorkerBuilder(statisticType); - String signifier = statisticType.getUnit() == Unit.None ? stringMessages.get(locale, statisticType.getSignifierMessage()) : - stringMessages.get(locale, Message.SignifierInUnit, statisticType.getSignifierMessage(), statisticType.getUnitMessage()); - return new GroupDividingParallelExtractor(signifier, statisticType.getUnit(), statisticType.getValueDecimals(), - workerBuilder, executor); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/FilterFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/FilterFactory.java deleted file mode 100644 index af13bfdbb25..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/FilterFactory.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.sap.sailing.datamining.factories; - -import java.util.Collection; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sailing.datamining.dimensions.DimensionManager; -import com.sap.sailing.datamining.dimensions.DimensionManagerProvider; -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.components.ParallelFilter; -import com.sap.sse.datamining.data.deprecated.Dimension; -import com.sap.sse.datamining.impl.components.deprecated.NonFilteringFilter; -import com.sap.sse.datamining.impl.components.deprecated.PartitioningParallelFilter; -import com.sap.sse.datamining.impl.criterias.AndCompoundFilterCriteria; -import com.sap.sse.datamining.impl.criterias.CompoundFilterCriteria; -import com.sap.sse.datamining.impl.criterias.deprecated.DimensionValuesFilterCriteria; -import com.sap.sse.datamining.impl.workers.builders.FilterByCriteriaBuilder; -import com.sap.sse.datamining.workers.FiltrationWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public final class FilterFactory { - - private FilterFactory() { } - - public static ParallelFilter createParallelFilter(WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { - return new PartitioningParallelFilter(workerBuilder, executor); - } - - public static WorkerBuilder> createDimensionFilterBuilder(DataTypes dataType, Map> selection) { - FilterCriteria criteria = createAndCompoundDimensionFilterCritera(dataType, selection); - WorkerBuilder> builder = new FilterByCriteriaBuilder(criteria); - return builder; - } - - /** - * @return A filter that filters nothing. So the returning collection is the same as the given one. - */ - public static ParallelFilter createNonFilteringFilter() { - return new NonFilteringFilter(); - } - - private static FilterCriteria createAndCompoundDimensionFilterCritera(DataTypes dataType, Map> selection) { - DimensionManager dimensionManager = DimensionManagerProvider.getDimensionManagerFor(dataType); - CompoundFilterCriteria compoundCriteria = new AndCompoundFilterCriteria(); - - for (Entry> entry : selection.entrySet()) { - Dimension dimension = dimensionManager.getDimensionFor(entry.getKey()); - if (dimension != null) { - FilterCriteria criteria = createDimensionFilterCriteria(dimension, entry.getValue()); - compoundCriteria.addCriteria(criteria); - } - } - return compoundCriteria; - } - - @SuppressWarnings("unchecked") - private static FilterCriteria createDimensionFilterCriteria(Dimension dimension, Iterable values) { - return new DimensionValuesFilterCriteria(dimension, (Collection) values); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/GrouperFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/GrouperFactory.java deleted file mode 100644 index f2b28b311e7..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/GrouperFactory.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sap.sailing.datamining.factories; - -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sailing.datamining.dimensions.DimensionManager; -import com.sap.sailing.datamining.dimensions.DimensionManagerProvider; -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sse.datamining.components.ParallelGrouper; -import com.sap.sse.datamining.data.deprecated.Dimension; -import com.sap.sse.datamining.impl.components.deprecated.PartitioningParallelGrouper; -import com.sap.sse.datamining.impl.workers.builders.MultiDimensionalGroupingWorkerBuilder; -import com.sap.sse.datamining.workers.GroupingWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public final class GrouperFactory { - - private GrouperFactory() { } - - public static ParallelGrouper createGrouper(QueryDefinition queryDefinition, ThreadPoolExecutor executor) { - WorkerBuilder> workerBuilder = createGroupingWorkerBuilder(queryDefinition); - return new PartitioningParallelGrouper(workerBuilder, executor); - } - - private static WorkerBuilder> createGroupingWorkerBuilder(QueryDefinition queryDefinition) { - switch (queryDefinition.getGrouperType()) { - case Dimensions: - return createMultiDimensionalGroupingWorkerBuilder(queryDefinition.getDataType(), queryDefinition.getDimensionsToGroupBy()); - } - throw new IllegalArgumentException("Not yet implemented for the given grouper type: " - + queryDefinition.getGrouperType().toString()); - } - - @SuppressWarnings("unchecked") - private static WorkerBuilder> createMultiDimensionalGroupingWorkerBuilder(DataTypes dataType, List dimensionsToGroupBy) { - DimensionManager dimensionManager = DimensionManagerProvider.getDimensionManagerFor(dataType); - Collection> dimensions = new LinkedHashSet>(); - for (DimensionIdentifier sharedDimension : dimensionsToGroupBy) { - Dimension dimension = (Dimension) dimensionManager.getDimensionFor(sharedDimension); - dimensions.add(dimension); - } - return new MultiDimensionalGroupingWorkerBuilder(dimensions); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java new file mode 100644 index 00000000000..6d70e5220b0 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java @@ -0,0 +1,127 @@ +package com.sap.sailing.datamining.factories; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.sap.sailing.datamining.data.HasGPSFixContext; +import com.sap.sailing.datamining.data.HasTrackedLegContext; +import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; +import com.sap.sailing.datamining.data.HasTrackedRaceContext; +import com.sap.sailing.server.RacingEventService; +import com.sap.sse.datamining.Query; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.factories.ProcessorFactory; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.functions.FunctionProvider; +import com.sap.sse.datamining.i18n.DataMiningStringMessages; +import com.sap.sse.datamining.impl.DataMiningActivator; +import com.sap.sse.datamining.impl.ProcessorQuery; +import com.sap.sse.datamining.impl.components.GroupedDataEntry; +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + +public final class SailingDataMiningFactory { + + private SailingDataMiningFactory() { + } + + public static Query createQuery(RacingEventService dataSource, final QueryDefinition queryDefinition, final FunctionProvider functionProvider) { + return new ProcessorQuery(DataMiningActivator.getExecutor(), dataSource, + DataMiningActivator.getStringMessages(), DataMiningStringMessages.Util.getLocaleFor(queryDefinition.getLocaleInfoName())) { + + @Override + protected Processor createFirstProcessor() { + Processor> aggregationProcessor = ProcessorFactory.createAggregationProcessor(/*query*/ this, queryDefinition.getAggregatorType()); + + @SuppressWarnings("unchecked") // TODO Clean, after the deprecated components have been removed + Function extractionFunction = (Function) functionProvider.getFunctionForDTO(queryDefinition.getStatisticToCalculate()); + Processor> extractionProcessor = ProcessorFactory.createExtractionProcessor(aggregationProcessor, extractionFunction); + + List> dimensionsToGroupBy = convertDTOsToFunctions(queryDefinition.getDimensionsToGroupBy(), functionProvider); + Processor groupingProcessor = ProcessorFactory.createGroupingProcessor(extractionProcessor, dimensionsToGroupBy); + + SailingDataRetrievalLevels dataRetrievalLevel = calculateDataRetrievalLevel(extractionFunction); + Processor firstRetrievalProcessor = SailingDataRetrieverFactory.createRetrievalProcessorChain(dataRetrievalLevel, groupingProcessor, queryDefinition.getFilterSelection(), functionProvider); + return firstRetrievalProcessor; + } + + }; + } + + @SuppressWarnings("unchecked") + public static Query> createDimensionValuesQuery(RacingEventService dataSource, final Collection dimensionDTOs, final FunctionProvider functionProvider) { + return new ProcessorQuery, RacingEventService>(DataMiningActivator.getExecutor(), dataSource) { + @Override + protected Processor createFirstProcessor() { + Processor> valueCollector = ProcessorFactory.createGroupedDataCollectingAsSetProcessor(/*query*/ this); + + Collection> dimensions = convertDTOsToFunctions(dimensionDTOs, functionProvider); + Map>> dimensionsMappedByRetrievalLevel = mapFunctionsByRetrievalLevel(dimensions); + SailingDataRetrievalLevels deepestRetrievalLevel = getDeepestRetrievalLevel(dimensionsMappedByRetrievalLevel.keySet()); + + Processor retrievalProcessor = null; + for (int i = deepestRetrievalLevel.ordinal(); i >= 0; i--) { + SailingDataRetrievalLevels retrievalLevel = SailingDataRetrievalLevels.values()[i]; + + Collection> dimensionsForRetrievalLevel = dimensionsMappedByRetrievalLevel.containsKey(retrievalLevel) ? dimensionsMappedByRetrievalLevel.get(retrievalLevel) : new ArrayList>(); + Collection> retrievalResultReceivers = ProcessorFactory.createGroupingExtractorsForDimensions(valueCollector, dimensionsForRetrievalLevel); + if (retrievalProcessor != null) { + retrievalResultReceivers.add(retrievalProcessor); + } + + retrievalProcessor = SailingDataRetrieverFactory.createRetrievalProcessorWithoutFilter(retrievalLevel, retrievalResultReceivers); + } + + // A retrieval processor created this way results always in a Processor + return (Processor) retrievalProcessor; + } + }; + } + + private static List> convertDTOsToFunctions(Collection functionDTOs, FunctionProvider functionProvider) { + List> dimensionsToGroupBy = new ArrayList<>(); + for (FunctionDTO functionDTO : functionDTOs) { + dimensionsToGroupBy.add(functionProvider.getFunctionForDTO(functionDTO)); + } + return dimensionsToGroupBy; + } + + private static Map>> mapFunctionsByRetrievalLevel(Collection> functions) { + Map>> mappedFunctions = new HashMap<>(); + for (Function function : functions) { + SailingDataRetrievalLevels retrievalLevel = calculateDataRetrievalLevel(function); + if (!mappedFunctions.containsKey(retrievalLevel)) { + mappedFunctions.put(retrievalLevel, new HashSet>()); + } + mappedFunctions.get(retrievalLevel).add(function); + } + return mappedFunctions; + } + + private static SailingDataRetrievalLevels calculateDataRetrievalLevel(Function function) { + if (function.getDeclaringType().equals(HasTrackedRaceContext.class)) { + return SailingDataRetrievalLevels.TrackedRace; + } + if (function.getDeclaringType().equals(HasTrackedLegContext.class)) { + return SailingDataRetrievalLevels.TrackedLeg; + } + if (function.getDeclaringType().equals(HasTrackedLegOfCompetitorContext.class)) { + return SailingDataRetrievalLevels.TrackedLegOfCompetitor; + } + if (function.getDeclaringType().equals(HasGPSFixContext.class)) { + return SailingDataRetrievalLevels.GPSFix; + } + return SailingDataRetrievalLevels.GPSFix; + } + + private static SailingDataRetrievalLevels getDeepestRetrievalLevel(Collection retrievalLevels) { + return Collections.max(retrievalLevels); + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataRetrievalLevels.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataRetrievalLevels.java new file mode 100644 index 00000000000..22a1aa66106 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataRetrievalLevels.java @@ -0,0 +1,7 @@ +package com.sap.sailing.datamining.factories; + +public enum SailingDataRetrievalLevels { + + LeaderboardGroup, RegattaLeaderboard, TrackedRace, TrackedLeg, TrackedLegOfCompetitor, GPSFix + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataRetrieverFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataRetrieverFactory.java new file mode 100644 index 00000000000..1a43a403b44 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataRetrieverFactory.java @@ -0,0 +1,141 @@ +package com.sap.sailing.datamining.factories; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ThreadPoolExecutor; + +import com.sap.sailing.datamining.data.HasGPSFixContext; +import com.sap.sailing.datamining.data.HasTrackedLegContext; +import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; +import com.sap.sailing.datamining.data.HasTrackedRaceContext; +import com.sap.sailing.datamining.impl.components.GPSFixRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.LeaderboardGroupRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.RegattaLeaderboardFilteringRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.TrackedLegFilteringRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.TrackedLegOfCompetitorFilteringRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.TrackedRaceFilteringRetrievalProcessor; +import com.sap.sailing.domain.leaderboard.LeaderboardGroup; +import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; +import com.sap.sailing.server.RacingEventService; +import com.sap.sse.datamining.components.FilterCriterion; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.functions.FunctionProvider; +import com.sap.sse.datamining.impl.DataMiningActivator; +import com.sap.sse.datamining.impl.criterias.AndCompoundFilterCriterion; +import com.sap.sse.datamining.impl.criterias.CompoundFilterCriterion; +import com.sap.sse.datamining.impl.criterias.NonFilteringFilterCriterion; +import com.sap.sse.datamining.impl.criterias.NullaryFunctionValuesFilterCriterion; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + +public final class SailingDataRetrieverFactory { + + private SailingDataRetrieverFactory() { + } + + /** + * Creates the processor chain for the data retrieval and returns the first processor of the chain. + * @param groupingProcessor The result receiver after the retrieval + * @param filterSelection The filter functions and values for the filtration + * @param functionProvider + * @return The first processor of the retrieval chain. + */ + @SuppressWarnings("unchecked") + public static Processor createRetrievalProcessorChain(SailingDataRetrievalLevels dataRetrievalLevel, Processor groupingProcessor, Map> filterSelection, FunctionProvider functionProvider) { + Processor resultReceiver = groupingProcessor; + for (int i = dataRetrievalLevel.ordinal(); i >= 0; i--) { + resultReceiver = createDataRetrieverFor(SailingDataRetrievalLevels.values()[i], resultReceiver, filterSelection, functionProvider); + } + return (Processor) resultReceiver; + } + + @SuppressWarnings("unchecked") + /* The way this method is used should guarantee, that the result receiver matches the new processor + */ + private static Processor createDataRetrieverFor(SailingDataRetrievalLevels dataRetrievalLevel, + Processor resultReceiver, Map> filterSelection, FunctionProvider functionProvider) { + ThreadPoolExecutor executor = DataMiningActivator.getExecutor(); + + switch (dataRetrievalLevel) { + case GPSFix: + Processor gpsFixSpecificResultReceiver = (Processor) resultReceiver; + return new GPSFixRetrievalProcessor(executor, Arrays.asList(gpsFixSpecificResultReceiver)); + case LeaderboardGroup: + Processor leaderboardGroupSpecificResultReceiver = (Processor) resultReceiver; + return new LeaderboardGroupRetrievalProcessor(executor, Arrays.asList(leaderboardGroupSpecificResultReceiver)); + case RegattaLeaderboard: + Processor regattaLeaderboardSpecificResultReceiver = (Processor) resultReceiver; + return new RegattaLeaderboardFilteringRetrievalProcessor(executor, Arrays.asList(regattaLeaderboardSpecificResultReceiver), getFilterCriteriaForBaseDataType(RegattaLeaderboard.class, filterSelection, functionProvider)); + case TrackedLeg: + Processor trackedLegSpecificResultReceiver = (Processor) resultReceiver; + return new TrackedLegFilteringRetrievalProcessor(executor, Arrays.asList(trackedLegSpecificResultReceiver), getFilterCriteriaForBaseDataType(HasTrackedLegContext.class, filterSelection, functionProvider)); + case TrackedLegOfCompetitor: + Processor trackedLegOfCompetitorSpecificResultReceiver = (Processor) resultReceiver; + return new TrackedLegOfCompetitorFilteringRetrievalProcessor(executor, Arrays.asList(trackedLegOfCompetitorSpecificResultReceiver), getFilterCriteriaForBaseDataType(HasTrackedLegOfCompetitorContext.class, filterSelection, functionProvider)); + case TrackedRace: + Processor trackedRaceSpecificResultReceiver = (Processor) resultReceiver; + return new TrackedRaceFilteringRetrievalProcessor(executor, Arrays.asList(trackedRaceSpecificResultReceiver), getFilterCriteriaForBaseDataType(HasTrackedRaceContext.class, filterSelection, functionProvider)); + } + throw new IllegalArgumentException("No data retriever implemented for the given data retrieval level '" + + dataRetrievalLevel + "'"); + } + + private static FilterCriterion getFilterCriteriaForBaseDataType(Class baseDataType, + Map> filterSelection, FunctionProvider functionProvider) { + CompoundFilterCriterion criteria = null; + for (Entry> filterSelectionEntry : filterSelection.entrySet()) { + Function function = functionProvider.getFunctionForDTO(filterSelectionEntry.getKey()); + if (baseDataType.equals(function.getDeclaringType())) { + if (criteria == null) { + criteria = new AndCompoundFilterCriterion<>(); + } + + Collection filterValues = new ArrayList<>(); + for (Object filterValue : filterSelectionEntry.getValue()) { + filterValues.add(filterValue); + } + criteria.addCriteria(new NullaryFunctionValuesFilterCriterion(function, filterValues)); + } + } + return criteria != null ? criteria : new NonFilteringFilterCriterion(); + } + + /** + * Creates a retrieval processor without filter for the given retrieval level and result receivers.
+ * The input type of the result receivers has to match the result type of the created retrieval processor for the given retrievel level or a {@link ClassCastException} can be thrown. + * For example, if the retrieval Level is {@link SailingDataRetrievalLevels#TrackedRace} the input must be {@link HasTrackedRaceContext}. + */ + @SuppressWarnings("unchecked") + public static Processor createRetrievalProcessorWithoutFilter(SailingDataRetrievalLevels retrievalLevel, + Collection> retrievalResultReceivers) throws ClassCastException { + ThreadPoolExecutor executor = DataMiningActivator.getExecutor(); + + switch (retrievalLevel) { + case GPSFix: + Collection> gpsFixSpecificResultReceivers = (Collection>)(Collection) retrievalResultReceivers; + return new GPSFixRetrievalProcessor(executor, gpsFixSpecificResultReceivers); + case LeaderboardGroup: + Collection> leaderboardGroupSpecificResultReceivers = (Collection>)(Collection) retrievalResultReceivers; + return new LeaderboardGroupRetrievalProcessor(executor, leaderboardGroupSpecificResultReceivers); + case RegattaLeaderboard: + Collection> regattaLeaderboardSpecificResultReceivers = (Collection>)(Collection) retrievalResultReceivers; + return new RegattaLeaderboardFilteringRetrievalProcessor(executor, regattaLeaderboardSpecificResultReceivers, new NonFilteringFilterCriterion()); + case TrackedLeg: + Collection> trackedLegSpecificResultReceivers = (Collection>)(Collection) retrievalResultReceivers; + return new TrackedLegFilteringRetrievalProcessor(executor, trackedLegSpecificResultReceivers, new NonFilteringFilterCriterion()); + case TrackedLegOfCompetitor: + Collection> trackedLegOfCompetitorSpecificResultReceivers = (Collection>)(Collection) retrievalResultReceivers; + return new TrackedLegOfCompetitorFilteringRetrievalProcessor(executor, trackedLegOfCompetitorSpecificResultReceivers, new NonFilteringFilterCriterion()); + case TrackedRace: + Collection> trackedRaceSpecificResultReceivers = (Collection>)(Collection) retrievalResultReceivers; + return new TrackedRaceFilteringRetrievalProcessor(executor, trackedRaceSpecificResultReceivers, new NonFilteringFilterCriterion()); + } + throw new IllegalArgumentException("No data retriever implemented for the given data retrieval level '" + + retrievalLevel + "'"); + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/Activator.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/Activator.java deleted file mode 100644 index 4fd17a70345..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/Activator.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.sap.sailing.datamining.impl; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceRegistration; - -import com.sap.sailing.datamining.impl.data.DataMiningClassesWithFunctionsService; -import com.sap.sse.datamining.functions.ClassesWithFunctionsService; - -public class Activator implements BundleActivator { - - private static BundleContext context; - - private ServiceRegistration classesWithFunctionsServiceReference; - - @Override - public void start(BundleContext context) throws Exception { - Activator.context = context; - registerClassesWithFunctionsService(); - } - - @Override - public void stop(BundleContext context) throws Exception { - unregisterClassesWithFunctionsService(); - } - - private void unregisterClassesWithFunctionsService() { - context.ungetService(classesWithFunctionsServiceReference.getReference()); - } - - private void registerClassesWithFunctionsService() { - classesWithFunctionsServiceReference = context.registerService(ClassesWithFunctionsService.class, - new DataMiningClassesWithFunctionsService(), null); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/WindStrengthClusterImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/WindStrengthClusterImpl.java deleted file mode 100644 index 602cc87830c..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/WindStrengthClusterImpl.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sap.sailing.datamining.impl; - - -import com.sap.sailing.datamining.WindStrengthCluster; -import com.sap.sse.datamining.impl.data.deprecated.ClusterOfComparableImpl; - -public class WindStrengthClusterImpl extends ClusterOfComparableImpl implements WindStrengthCluster { - - public WindStrengthClusterImpl(String name, Double lowerRangeInBeaufort, Double upperRangeInBeaufort) { - super(name, upperRangeInBeaufort, lowerRangeInBeaufort); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/AbstractLeaderboardGroupDataRetrievalWorker.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/AbstractLeaderboardGroupDataRetrievalWorker.java deleted file mode 100644 index 0aa8b24e865..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/AbstractLeaderboardGroupDataRetrievalWorker.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.sap.sailing.datamining.impl.components; - -import java.util.ArrayList; -import java.util.Collection; - -import com.sap.sailing.datamining.data.HasTrackedLegContext; -import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; -import com.sap.sailing.datamining.impl.data.HasTrackedLegContextImpl; -import com.sap.sailing.datamining.impl.data.HasTrackedLegOfCompetitorContextImpl; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.CourseArea; -import com.sap.sailing.domain.base.Fleet; -import com.sap.sailing.domain.base.Leg; -import com.sap.sailing.domain.base.RaceColumn; -import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; -import com.sap.sailing.domain.tracking.TrackedLeg; -import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; -import com.sap.sailing.domain.tracking.TrackedRace; -import com.sap.sse.common.Util; -import com.sap.sse.datamining.impl.workers.retrievers.AbstractRetrievalWorker; -import com.sap.sse.datamining.workers.DataRetrievalWorker; - -public abstract class AbstractLeaderboardGroupDataRetrievalWorker - extends AbstractRetrievalWorker> - implements DataRetrievalWorker { - - private LeaderboardGroup group; - - @Override - public void setSource(LeaderboardGroup source) { - this.group = source; - } - - protected LeaderboardGroup getGroup() { - return group; - } - - private static Collection> retrieveDataTillTrackedLeg(LeaderboardGroup group) { - Collection> data = new ArrayList>(); - for (Leaderboard leaderboard : group.getLeaderboards()) { - CourseArea courseArea = leaderboard.getDefaultCourseArea(); - for (RaceColumn raceColumn : leaderboard.getRaceColumns()) { - for (Fleet fleet : raceColumn.getFleets()) { - TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); - if (trackedRace != null) { - int legNumber = 1; - for (Leg leg : trackedRace.getRace().getCourse().getLegs()) { - TrackedLeg trackedLeg = trackedRace.getTrackedLeg(leg); - if (trackedLeg != null) { - HasTrackedLegContext dataContext = new HasTrackedLegContextImpl(group, leaderboard, - courseArea, fleet, trackedRace, trackedLeg, legNumber); - data.add(new Util.Pair(trackedLeg, dataContext)); - legNumber++; - } - } - } - } - } - } - return data; - } - - protected static Collection> retrieveDataTillTrackedLegOfCompetitor( - LeaderboardGroup group) { - Collection> data = new ArrayList>(); - Collection> baseData = retrieveDataTillTrackedLeg(group); - for (Util.Pair baseDataEntry : baseData) { - TrackedLeg trackedLeg = baseDataEntry.getA(); - HasTrackedLegContext trackedLegContext = baseDataEntry.getB(); - for (Competitor competitor : trackedLegContext.getTrackedRace().getRace().getCompetitors()) { - TrackedLegOfCompetitor trackedLegOfCompetitor = trackedLeg.getTrackedLeg(competitor); - HasTrackedLegOfCompetitorContext dataContext = new HasTrackedLegOfCompetitorContextImpl(trackedLegContext, - competitor); - data.add(new Util.Pair(trackedLegOfCompetitor, - dataContext)); - } - } - return data; - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/GPSFixRetrievalProcessor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/GPSFixRetrievalProcessor.java new file mode 100644 index 00000000000..7eb964a2b69 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/GPSFixRetrievalProcessor.java @@ -0,0 +1,47 @@ +package com.sap.sailing.datamining.impl.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sailing.datamining.Activator; +import com.sap.sailing.datamining.data.HasGPSFixContext; +import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; +import com.sap.sailing.datamining.impl.data.GPSFixWithContext; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.tracking.GPSFixMoving; +import com.sap.sailing.domain.tracking.GPSFixTrack; +import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor; +import com.sap.sse.datamining.shared.annotations.DataRetriever; + +@DataRetriever(dataType=HasGPSFixContext.class, + groupName=Activator.dataRetrieverGroupName, + level=5) +public class GPSFixRetrievalProcessor extends AbstractSimpleRetrievalProcessor { + + public GPSFixRetrievalProcessor(ExecutorService executor, Collection> resultReceivers) { + super(executor, resultReceivers); + } + + @Override + protected Iterable retrieveData(HasTrackedLegOfCompetitorContext element) { + Collection gpsFixesWithContext = new ArrayList<>(); + GPSFixTrack competitorTrack = element.getTrackedRace().getTrack(element.getCompetitor()); + competitorTrack.lockForRead(); + try { + TrackedLegOfCompetitor trackedLegOfCompetitor = element.getTrackedLegOfCompetitor(); + if (trackedLegOfCompetitor.getStartTime() != null && trackedLegOfCompetitor.getFinishTime() != null) { + for (GPSFixMoving gpsFix : competitorTrack.getFixes(trackedLegOfCompetitor.getStartTime(), true, trackedLegOfCompetitor.getFinishTime(), true)) { + HasGPSFixContext gpsFixWithContext = new GPSFixWithContext(element, gpsFix); + gpsFixesWithContext.add(gpsFixWithContext); + } + } + } finally { + competitorTrack.unlockAfterRead(); + } + return gpsFixesWithContext; + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/GroupDividingParallelDataRetriever.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/GroupDividingParallelDataRetriever.java deleted file mode 100644 index 807a874be6a..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/GroupDividingParallelDataRetriever.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.sap.sailing.datamining.impl.components; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; -import com.sap.sailing.server.RacingEventService; -import com.sap.sse.datamining.components.ParallelDataRetriever; -import com.sap.sse.datamining.impl.components.deprecated.AbstractParallelComponent; -import com.sap.sse.datamining.workers.DataRetrievalWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -/** - * Retrieves elements of type DataType from all {@link LeaderboardGroup}s known to the - * {@link RacingEventSErvice} passed to this object's constructor. See also - * {@link RacingEventService#getLeaderboardGroups()}. - * - * @param - */ -public class GroupDividingParallelDataRetriever extends AbstractParallelComponent> - implements ParallelDataRetriever { - - private RacingEventService racingService; - private WorkerBuilder> workerBuilder; - - public GroupDividingParallelDataRetriever(RacingEventService racingService, WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { - super(executor); - this.racingService = racingService; - this.workerBuilder = workerBuilder; - } - - @Override - protected void setUpWorkersFor(Void v) { - for (LeaderboardGroup group : racingService.getLeaderboardGroups().values()) { - DataRetrievalWorker worker = workerBuilder.build(); - worker.setReceiver(this); - worker.setSource(group); - addWorker(worker); - } - } - - @Override - protected Collection finalizeData() { - Collection data = new ArrayList(); - for (Collection results : getResults()) { - data.addAll(results); - } - return Collections.unmodifiableCollection(new CopyOnWriteArrayList(data)); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/LeaderboardGroupFilteringRetrievalProcessor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/LeaderboardGroupFilteringRetrievalProcessor.java deleted file mode 100644 index 1e8ac564adf..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/LeaderboardGroupFilteringRetrievalProcessor.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sap.sailing.datamining.impl.components; - -import java.util.Collection; -import java.util.concurrent.ExecutorService; - -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; -import com.sap.sailing.server.RacingEventService; -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.components.Processor; -import com.sap.sse.datamining.impl.components.AbstractFilteringRetrievalProcessor; - -public class LeaderboardGroupFilteringRetrievalProcessor extends - AbstractFilteringRetrievalProcessor { - - public LeaderboardGroupFilteringRetrievalProcessor(ExecutorService executor, - Collection> resultReceivers, FilterCriteria criteria) { - super(executor, resultReceivers, criteria); - } - - @Override - protected Iterable retrieveData(RacingEventService element) { - return element.getLeaderboardGroups().values(); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/LeaderboardGroupRetrievalProcessor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/LeaderboardGroupRetrievalProcessor.java new file mode 100644 index 00000000000..986b50f5ed6 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/LeaderboardGroupRetrievalProcessor.java @@ -0,0 +1,29 @@ +package com.sap.sailing.datamining.impl.components; + +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sailing.datamining.Activator; +import com.sap.sailing.domain.leaderboard.LeaderboardGroup; +import com.sap.sailing.server.RacingEventService; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor; +import com.sap.sse.datamining.shared.annotations.DataRetriever; + +@DataRetriever(dataType=LeaderboardGroup.class, + groupName=Activator.dataRetrieverGroupName, + level=0) +public class LeaderboardGroupRetrievalProcessor extends + AbstractSimpleRetrievalProcessor { + + public LeaderboardGroupRetrievalProcessor(ExecutorService executor, + Collection> resultReceivers) { + super(executor, resultReceivers); + } + + @Override + protected Iterable retrieveData(RacingEventService element) { + return element.getLeaderboardGroups().values(); + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/RegattaLeaderboardFilteringRetrievalProcessor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/RegattaLeaderboardFilteringRetrievalProcessor.java new file mode 100644 index 00000000000..dc1366e1794 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/RegattaLeaderboardFilteringRetrievalProcessor.java @@ -0,0 +1,38 @@ +package com.sap.sailing.datamining.impl.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sailing.datamining.Activator; +import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.leaderboard.LeaderboardGroup; +import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; +import com.sap.sse.datamining.components.FilterCriterion; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor; +import com.sap.sse.datamining.shared.annotations.DataRetriever; + +@DataRetriever(dataType=RegattaLeaderboard.class, + groupName=Activator.dataRetrieverGroupName, + level=1) +public class RegattaLeaderboardFilteringRetrievalProcessor extends + AbstractSimpleFilteringRetrievalProcessor { + + public RegattaLeaderboardFilteringRetrievalProcessor(ExecutorService executor, + Collection> resultReceivers, FilterCriterion criteria) { + super(executor, resultReceivers, criteria); + } + + @Override + protected Iterable retrieveData(LeaderboardGroup element) { + Collection regattaLeaderboards = new ArrayList<>(); + for (Leaderboard leaderboard : element.getLeaderboards()) { + if (leaderboard instanceof RegattaLeaderboard) { + regattaLeaderboards.add((RegattaLeaderboard) leaderboard); + } + } + return regattaLeaderboards; + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TrackedLegFilteringRetrievalProcessor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TrackedLegFilteringRetrievalProcessor.java new file mode 100644 index 00000000000..36bd0bb500c --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TrackedLegFilteringRetrievalProcessor.java @@ -0,0 +1,40 @@ +package com.sap.sailing.datamining.impl.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sailing.datamining.Activator; +import com.sap.sailing.datamining.data.HasTrackedLegContext; +import com.sap.sailing.datamining.data.HasTrackedRaceContext; +import com.sap.sailing.datamining.impl.data.TrackedLegWithContext; +import com.sap.sailing.domain.tracking.TrackedLeg; +import com.sap.sse.datamining.components.FilterCriterion; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor; +import com.sap.sse.datamining.shared.annotations.DataRetriever; + +@DataRetriever(dataType=HasTrackedLegContext.class, + groupName=Activator.dataRetrieverGroupName, + level=3) +public class TrackedLegFilteringRetrievalProcessor extends + AbstractSimpleFilteringRetrievalProcessor { + + public TrackedLegFilteringRetrievalProcessor(ExecutorService executor, + Collection> resultReceivers, FilterCriterion criteria) { + super(executor, resultReceivers, criteria); + } + + @Override + protected Iterable retrieveData(HasTrackedRaceContext element) { + Collection trackedLegsWithContext = new ArrayList<>(); + int legNumber = 1; + for (TrackedLeg trackedLeg : element.getTrackedRace().getTrackedLegs()) { + HasTrackedLegContext trackedLegWithContext = new TrackedLegWithContext(element, trackedLeg, legNumber); + trackedLegsWithContext.add(trackedLegWithContext); + legNumber++; + } + return trackedLegsWithContext; + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TrackedLegOfCompetitorFilteringRetrievalProcessor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TrackedLegOfCompetitorFilteringRetrievalProcessor.java new file mode 100644 index 00000000000..3f9cfa6ba47 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TrackedLegOfCompetitorFilteringRetrievalProcessor.java @@ -0,0 +1,39 @@ +package com.sap.sailing.datamining.impl.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sailing.datamining.Activator; +import com.sap.sailing.datamining.data.HasTrackedLegContext; +import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; +import com.sap.sailing.datamining.impl.data.TrackedLegOfCompetitorWithContext; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sse.datamining.components.FilterCriterion; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor; +import com.sap.sse.datamining.shared.annotations.DataRetriever; + +@DataRetriever(dataType=HasTrackedLegOfCompetitorContext.class, + groupName=Activator.dataRetrieverGroupName, + level=4) +public class TrackedLegOfCompetitorFilteringRetrievalProcessor extends + AbstractSimpleFilteringRetrievalProcessor { + + public TrackedLegOfCompetitorFilteringRetrievalProcessor(ExecutorService executor, + Collection> resultReceivers, + FilterCriterion criteria) { + super(executor, resultReceivers, criteria); + } + + @Override + protected Iterable retrieveData(HasTrackedLegContext element) { + Collection trackedLegOfCompetitorsWithContext = new ArrayList<>(); + for (Competitor competitor : element.getRace().getCompetitors()) { + HasTrackedLegOfCompetitorContext trackedLegOfCompetitorWithContext = new TrackedLegOfCompetitorWithContext(element, element.getTrackedLeg().getTrackedLeg(competitor)); + trackedLegOfCompetitorsWithContext.add(trackedLegOfCompetitorWithContext); + } + return trackedLegOfCompetitorsWithContext; + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TrackedRaceFilteringRetrievalProcessor.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TrackedRaceFilteringRetrievalProcessor.java new file mode 100644 index 00000000000..b5ebf752fba --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/components/TrackedRaceFilteringRetrievalProcessor.java @@ -0,0 +1,46 @@ +package com.sap.sailing.datamining.impl.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sailing.datamining.data.HasTrackedRaceContext; +import com.sap.sailing.datamining.impl.data.TrackedRaceWithContext; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sse.datamining.components.FilterCriterion; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor; +import com.sap.sse.datamining.shared.annotations.DataRetriever; + +@DataRetriever(dataType=HasTrackedRaceContext.class, + groupName="Sailing", + level=2) +public class TrackedRaceFilteringRetrievalProcessor extends + AbstractSimpleFilteringRetrievalProcessor { + + public TrackedRaceFilteringRetrievalProcessor(ExecutorService executor, + Collection> resultReceivers, FilterCriterion criteria) { + super(executor, resultReceivers, criteria); + } + + @Override + protected Iterable retrieveData(Leaderboard element) { + Collection trackedRacesWithContext = new ArrayList<>(); + for (RaceColumn raceColumn : element.getRaceColumns()) { + for (Fleet fleet : raceColumn.getFleets()) { + TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); + if (trackedRace != null) { + Regatta regatta = trackedRace.getTrackedRegatta().getRegatta(); + HasTrackedRaceContext trackedRaceWithContext = new TrackedRaceWithContext(regatta, fleet, trackedRace); + trackedRacesWithContext.add(trackedRaceWithContext); + } + } + } + return trackedRacesWithContext; + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/DataMiningClassesWithFunctionsService.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/DataMiningClassesWithFunctionsService.java deleted file mode 100644 index ddc69a317a8..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/DataMiningClassesWithFunctionsService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.sap.sailing.datamining.impl.data; - -import java.util.Collection; -import java.util.HashSet; - -import com.sap.sailing.datamining.data.GPSFixWithContext; -import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext; -import com.sap.sse.datamining.functions.ClassesWithFunctionsService; - -public class DataMiningClassesWithFunctionsService implements ClassesWithFunctionsService { - - @Override - public boolean hasInternalClassesWithMarkedMethods() { - return true; - } - - @Override - public Collection> getInternalClassesWithMarkedMethods() { - Collection> internalClasses = new HashSet<>(); - internalClasses.add(GPSFixWithContext.class); - internalClasses.add(TrackedLegOfCompetitorWithContext.class); - return internalClasses; - } - - @Override - public boolean hasExternalLibraryClasses() { - return false; - } - - @Override - public Collection> getExternalLibraryClasses() { - return new HashSet<>(); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixWithContext.java new file mode 100644 index 00000000000..44be900af1a --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/GPSFixWithContext.java @@ -0,0 +1,32 @@ +package com.sap.sailing.datamining.impl.data; + +import com.sap.sailing.datamining.data.HasGPSFixContext; +import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.tracking.GPSFixMoving; +import com.sap.sailing.domain.tracking.TrackedLeg; +import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; +import com.sap.sailing.domain.tracking.TrackedRace; + +public class GPSFixWithContext extends TrackedLegOfCompetitorWithContext implements HasGPSFixContext { + + private final GPSFixMoving gpsFix; + + public GPSFixWithContext(HasTrackedLegOfCompetitorContext legContext, GPSFixMoving gpsFix) { + this(legContext.getRegatta(), legContext.getFleet(), legContext.getTrackedRace(), + legContext.getTrackedLeg(), legContext.getLegNumber(), legContext.getTrackedLegOfCompetitor(), gpsFix); + } + + public GPSFixWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace, + TrackedLeg trackedLeg, int legNumber, TrackedLegOfCompetitor trackedLegOfCompetitor, GPSFixMoving gpsFix) { + super(regatta, fleet, trackedRace, trackedLeg, legNumber, trackedLegOfCompetitor); + this.gpsFix = gpsFix; + } + + @Override + public GPSFixMoving getGPSFix() { + return gpsFix; + } + +} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasGPSFixContextImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasGPSFixContextImpl.java deleted file mode 100644 index a26e907ecf9..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasGPSFixContextImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sailing.datamining.impl.data; - -import com.sap.sailing.datamining.data.HasGPSFixContext; -import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.CourseArea; -import com.sap.sailing.domain.base.Fleet; -import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; -import com.sap.sailing.domain.tracking.TrackedLeg; -import com.sap.sailing.domain.tracking.TrackedRace; - -public class HasGPSFixContextImpl extends HasTrackedLegOfCompetitorContextImpl implements HasGPSFixContext { - - public HasGPSFixContextImpl(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, CourseArea courseArea, - Fleet fleet, TrackedRace trackedRace, TrackedLeg trackedLeg, int legNumber, Competitor competitor) { - super(leaderboardGroup, leaderboard, courseArea, fleet, trackedRace, trackedLeg, legNumber, competitor); - } - - public HasGPSFixContextImpl(HasTrackedLegOfCompetitorContext baseContext) { - this(baseContext.getLeaderboardGroup(), baseContext.getLeaderboard(), baseContext.getCourseArea(), baseContext.getFleet(), - baseContext.getTrackedRace(), baseContext.getTrackedLeg(), baseContext.getLegNumber(), - baseContext.getCompetitor()); - } - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasLeaderboardContextImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasLeaderboardContextImpl.java deleted file mode 100644 index f74221d0401..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasLeaderboardContextImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sap.sailing.datamining.impl.data; - -import com.sap.sailing.datamining.data.HasLeaderboardContext; -import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; - -public class HasLeaderboardContextImpl extends HasLeaderboardGroupContextImpl implements HasLeaderboardContext { - - private final Leaderboard leaderboard; - - public HasLeaderboardContextImpl(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard) { - super(leaderboardGroup); - this.leaderboard = leaderboard; - } - - @Override - public Leaderboard getLeaderboard() { - return leaderboard; - } - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasLeaderboardGroupContextImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasLeaderboardGroupContextImpl.java deleted file mode 100644 index 355e29daa31..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasLeaderboardGroupContextImpl.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sap.sailing.datamining.impl.data; - -import com.sap.sailing.datamining.data.HasLeaderboardGroupContext; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; - -public class HasLeaderboardGroupContextImpl implements HasLeaderboardGroupContext { - - private final LeaderboardGroup leaderboardGroup; - - public HasLeaderboardGroupContextImpl(LeaderboardGroup leaderboardGroup) { - this.leaderboardGroup = leaderboardGroup; - } - - @Override - public LeaderboardGroup getLeaderboardGroup() { - return leaderboardGroup; - } - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasTrackedLegOfCompetitorContextImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasTrackedLegOfCompetitorContextImpl.java deleted file mode 100644 index ec494b241b8..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasTrackedLegOfCompetitorContextImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.sap.sailing.datamining.impl.data; - -import com.sap.sailing.datamining.data.HasTrackedLegContext; -import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.CourseArea; -import com.sap.sailing.domain.base.Fleet; -import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; -import com.sap.sailing.domain.tracking.TrackedLeg; -import com.sap.sailing.domain.tracking.TrackedRace; - -public class HasTrackedLegOfCompetitorContextImpl extends HasTrackedLegContextImpl implements HasTrackedLegOfCompetitorContext { - - private final Competitor competitor; - - public HasTrackedLegOfCompetitorContextImpl(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, - CourseArea courseArea, Fleet fleet, TrackedRace trackedRace, TrackedLeg trackedLeg, int legNumber, Competitor competitor) { - super(leaderboardGroup, leaderboard, courseArea, fleet, trackedRace, trackedLeg, legNumber); - this.competitor = competitor; - } - - public HasTrackedLegOfCompetitorContextImpl(HasTrackedLegContext trackedLegContext, Competitor competitor) { - this(trackedLegContext.getLeaderboardGroup(), trackedLegContext.getLeaderboard(), trackedLegContext.getCourseArea(), - trackedLegContext.getFleet(), trackedLegContext.getTrackedRace(), trackedLegContext.getTrackedLeg(), trackedLegContext.getLegNumber(), - competitor); - } - - @Override - public Competitor getCompetitor() { - return competitor; - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasTrackedRaceContextImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasTrackedRaceContextImpl.java deleted file mode 100644 index 1ee5f98c319..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasTrackedRaceContextImpl.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.sap.sailing.datamining.impl.data; - -import java.util.Calendar; - -import com.sap.sailing.datamining.data.HasLeaderboardContext; -import com.sap.sailing.datamining.data.HasTrackedRaceContext; -import com.sap.sailing.domain.base.CourseArea; -import com.sap.sailing.domain.base.Fleet; -import com.sap.sailing.domain.common.TimePoint; -import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; -import com.sap.sailing.domain.tracking.TrackedRace; - -public class HasTrackedRaceContextImpl extends HasLeaderboardContextImpl implements HasTrackedRaceContext { - - private final CourseArea courseArea; - private final Fleet fleet; - private final TrackedRace trackedRace; - private Integer year; - private boolean yearHasBeenInitialized; - - public HasTrackedRaceContextImpl(HasLeaderboardContext leaderboardContext, CourseArea courseArea, Fleet fleet, - TrackedRace trackedRace) { - this(leaderboardContext.getLeaderboardGroup(), leaderboardContext.getLeaderboard(), courseArea, fleet, trackedRace); - } - - public HasTrackedRaceContextImpl(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, CourseArea courseArea, - Fleet fleet, TrackedRace trackedRace) { - super(leaderboardGroup, leaderboard); - this.courseArea = courseArea; - this.fleet = fleet; - this.trackedRace = trackedRace; - } - - @Override - public CourseArea getCourseArea() { - return courseArea; - } - - @Override - public Fleet getFleet() { - return fleet; - } - - @Override - public TrackedRace getTrackedRace() { - return trackedRace; - } - - @Override - public Integer getYear() { - if (!yearHasBeenInitialized) { - initializeYear(); - } - return year; - } - - private void initializeYear() { - TimePoint time = getTrackedRace().getStartOfRace() != null ? getTrackedRace().getStartOfRace() : getTrackedRace().getStartOfTracking(); - if (time == null) { - year = 0; - } - Calendar calendar = Calendar.getInstance(); - calendar.setTime(time.asDate()); - year = calendar.get(Calendar.YEAR); - yearHasBeenInitialized = true; - } - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/SailingDataMiningClassesWithFunctionsService.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/SailingDataMiningClassesWithFunctionsService.java new file mode 100644 index 00000000000..167ebf9e3fb --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/SailingDataMiningClassesWithFunctionsService.java @@ -0,0 +1,30 @@ +package com.sap.sailing.datamining.impl.data; + +import java.util.HashSet; +import java.util.Set; + +import com.sap.sailing.datamining.data.HasGPSFixContext; +import com.sap.sse.datamining.ClassesWithFunctionsService; + +public class SailingDataMiningClassesWithFunctionsService implements ClassesWithFunctionsService { + + @Override + public Set> getInternalClassesWithMarkedMethods() { + Set> internalClasses = new HashSet<>(); + /* + * This also contains the marked methods of + * HasTrackedRaceContext, + * HasTrackedLegContext and + * HasTrackedLegOfCompetitorContext, + * because these are the super types of HasGPSFixContext. + */ + internalClasses.add(HasGPSFixContext.class); + return internalClasses; + } + + @Override + public Set> getExternalLibraryClasses() { + return new HashSet<>(); + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java new file mode 100644 index 00000000000..9bd1da34c20 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegOfCompetitorWithContext.java @@ -0,0 +1,47 @@ +package com.sap.sailing.datamining.impl.data; + +import com.sap.sailing.datamining.data.HasTrackedLegContext; +import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.common.TimePoint; +import com.sap.sailing.domain.tracking.TrackedLeg; +import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; +import com.sap.sailing.domain.tracking.TrackedRace; + +public class TrackedLegOfCompetitorWithContext extends TrackedLegWithContext implements HasTrackedLegOfCompetitorContext { + + private final TrackedLegOfCompetitor trackedLegOfCompetitor; + private final Competitor competitor; + + public TrackedLegOfCompetitorWithContext(HasTrackedLegContext trackedLegContext, TrackedLegOfCompetitor trackedLegOfCompetitor) { + this(trackedLegContext.getRegatta(), trackedLegContext.getFleet(), + trackedLegContext.getTrackedRace(), trackedLegContext.getTrackedLeg(), + trackedLegContext.getLegNumber(), trackedLegOfCompetitor); + } + + public TrackedLegOfCompetitorWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace, + TrackedLeg trackedLeg, int legNumber, TrackedLegOfCompetitor trackedLegOfCompetitor) { + super(regatta, fleet, trackedRace, trackedLeg, legNumber); + this.trackedLegOfCompetitor = trackedLegOfCompetitor; + this.competitor = trackedLegOfCompetitor.getCompetitor(); + } + + @Override + public TrackedLegOfCompetitor getTrackedLegOfCompetitor() { + return trackedLegOfCompetitor; + } + + @Override + public Competitor getCompetitor() { + return competitor; + } + + @Override + public Double getDistanceTraveled() { + TimePoint timePoint = getTrackedRace().getEndOfTracking(); + return getTrackedLegOfCompetitor().getDistanceTraveled(timePoint).getMeters(); + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasTrackedLegContextImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegWithContext.java similarity index 67% rename from java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasTrackedLegContextImpl.java rename to java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegWithContext.java index fc9d85ee03d..660c31d5972 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/HasTrackedLegContextImpl.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedLegWithContext.java @@ -2,34 +2,30 @@ package com.sap.sailing.datamining.impl.data; import com.sap.sailing.datamining.data.HasTrackedLegContext; import com.sap.sailing.datamining.data.HasTrackedRaceContext; -import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.common.LegType; import com.sap.sailing.domain.common.NoWindException; import com.sap.sailing.domain.common.TimePoint; import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; -import com.sap.sailing.domain.leaderboard.Leaderboard; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.tracking.TrackedLeg; import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; import com.sap.sailing.domain.tracking.TrackedRace; -public class HasTrackedLegContextImpl extends HasTrackedRaceContextImpl implements HasTrackedLegContext { +public class TrackedLegWithContext extends TrackedRaceWithContext implements HasTrackedLegContext { private final TrackedLeg trackedLeg; private final int legNumber; private LegType legType; private boolean legTypeHasBeenInitialized; - public HasTrackedLegContextImpl(HasTrackedRaceContext trackedRaceContext, TrackedLeg trackedLeg, int legNumber) { - this(trackedRaceContext.getLeaderboardGroup(), trackedRaceContext.getLeaderboard(), trackedRaceContext - .getCourseArea(), trackedRaceContext.getFleet(), trackedRaceContext.getTrackedRace(), trackedLeg, - legNumber); + public TrackedLegWithContext(HasTrackedRaceContext trackedRaceContext, TrackedLeg trackedLeg, int legNumber) { + this(trackedRaceContext.getRegatta(), trackedRaceContext.getFleet(), + trackedRaceContext.getTrackedRace(), trackedLeg, legNumber); } - public HasTrackedLegContextImpl(LeaderboardGroup leaderboardGroup, Leaderboard leaderboard, CourseArea courseArea, Fleet fleet, - TrackedRace trackedRace, TrackedLeg trackedLeg, int legNumber) { - super(leaderboardGroup, leaderboard, courseArea, fleet, trackedRace); + public TrackedLegWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace, TrackedLeg trackedLeg, int legNumber) { + super(regatta, fleet, trackedRace); this.trackedLeg = trackedLeg; this.legNumber = legNumber; } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedRaceWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedRaceWithContext.java new file mode 100644 index 00000000000..774c73940bb --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/TrackedRaceWithContext.java @@ -0,0 +1,78 @@ +package com.sap.sailing.datamining.impl.data; + +import java.util.Calendar; + +import com.sap.sailing.datamining.data.HasTrackedRaceContext; +import com.sap.sailing.domain.base.BoatClass; +import com.sap.sailing.domain.base.CourseArea; +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.common.TimePoint; +import com.sap.sailing.domain.tracking.TrackedRace; + +public class TrackedRaceWithContext implements HasTrackedRaceContext { + + private final Regatta regatta; + private final Fleet fleet; + private final TrackedRace trackedRace; + private Integer year; + private boolean yearHasBeenInitialized; + + public TrackedRaceWithContext(Regatta regatta, Fleet fleet, TrackedRace trackedRace) { + this.regatta = regatta; + this.fleet = fleet; + this.trackedRace = trackedRace; + } + + @Override + public Regatta getRegatta() { + return regatta; + } + + @Override + public CourseArea getCourseArea() { + return getRegatta().getDefaultCourseArea(); + } + + @Override + public BoatClass getBoatClass() { + return getRegatta().getBoatClass(); + } + + @Override + public TrackedRace getTrackedRace() { + return trackedRace; + } + + @Override + public Fleet getFleet() { + return fleet; + } + + @Override + public RaceDefinition getRace() { + return getTrackedRace().getRace(); + } + + @Override + public Integer getYear() { + if (!yearHasBeenInitialized) { + year = calculateYear(); + yearHasBeenInitialized = true; + } + return year; + } + + private Integer calculateYear() { + TimePoint startOfRace = getTrackedRace().getStartOfRace(); + TimePoint time = startOfRace != null ? startOfRace : getTrackedRace().getStartOfTracking(); + if (time == null) { + year = 0; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(time.asDate()); + return calendar.get(Calendar.YEAR); + } + +} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/gps_fix/GPSFixLeaderboardGroupDataRetrievalWorker.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/gps_fix/GPSFixLeaderboardGroupDataRetrievalWorker.java deleted file mode 100644 index 0d6cd415472..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/gps_fix/GPSFixLeaderboardGroupDataRetrievalWorker.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.sap.sailing.datamining.impl.gps_fix; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import com.sap.sailing.datamining.data.GPSFixWithContext; -import com.sap.sailing.datamining.data.HasGPSFixContext; -import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; -import com.sap.sailing.datamining.impl.components.AbstractLeaderboardGroupDataRetrievalWorker; -import com.sap.sailing.datamining.impl.data.HasGPSFixContextImpl; -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.tracking.GPSFixMoving; -import com.sap.sailing.domain.tracking.GPSFixTrack; -import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; -import com.sap.sse.common.Util; - -public class GPSFixLeaderboardGroupDataRetrievalWorker extends AbstractLeaderboardGroupDataRetrievalWorker { - - @Override - public Collection doWork() { - Collection data = new ArrayList(); - Collection> baseData = retrieveDataTillTrackedLegOfCompetitor(getGroup()); - for (Util.Pair baseDataEntry : baseData) { - HasGPSFixContext context = new HasGPSFixContextImpl(baseDataEntry.getB()); - data.addAll(retrieveDataFor(context)); - } - return data; - } - - private Collection retrieveDataFor(HasGPSFixContext context) { - List data = new ArrayList(); - TrackedLegOfCompetitor trackedLegOfCompetitor = context.getTrackedLeg().getTrackedLeg(context.getCompetitor()); - GPSFixTrack competitorTrack = context.getTrackedRace().getTrack(context.getCompetitor()); - competitorTrack.lockForRead(); - try { - if (trackedLegOfCompetitor.getStartTime() != null && trackedLegOfCompetitor.getFinishTime() != null) { - for (GPSFixMoving gpsFix : competitorTrack.getFixes(trackedLegOfCompetitor.getStartTime(), true, trackedLegOfCompetitor.getFinishTime(), true)) { - data.add(new GPSFixWithContextImpl(gpsFix, context)); - } - } - } finally { - competitorTrack.unlockAfterRead(); - } - return data; - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/gps_fix/GPSFixWithContextImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/gps_fix/GPSFixWithContextImpl.java deleted file mode 100644 index e514dcdd62f..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/gps_fix/GPSFixWithContextImpl.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.sap.sailing.datamining.impl.gps_fix; - -import com.sap.sailing.datamining.Clusters.WindStrength; -import com.sap.sailing.datamining.WindStrengthCluster; -import com.sap.sailing.datamining.data.GPSFixWithContext; -import com.sap.sailing.datamining.data.HasGPSFixContext; -import com.sap.sailing.domain.common.LegType; -import com.sap.sailing.domain.common.Position; -import com.sap.sailing.domain.common.SpeedWithBearing; -import com.sap.sailing.domain.common.TimePoint; -import com.sap.sailing.domain.common.impl.DegreePosition; -import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl; -import com.sap.sailing.domain.common.impl.MillisecondsTimePoint; -import com.sap.sailing.domain.tracking.GPSFixMoving; -import com.sap.sailing.domain.tracking.Wind; -import com.sap.sailing.domain.tracking.impl.GPSFixMovingImpl; - -public class GPSFixWithContextImpl extends GPSFixMovingImpl implements GPSFixWithContext { - private static final long serialVersionUID = -5551381302809417831L; - - private HasGPSFixContext context; - private Wind wind; - - private boolean windHasBeenInitialized; - - public GPSFixWithContextImpl(GPSFixMoving gpsFix, HasGPSFixContext context) { - super(copyPosition(gpsFix), copyTimePoint(gpsFix), copySpeed(gpsFix)); - this.context = context; - - windHasBeenInitialized= false; - } - - private static SpeedWithBearing copySpeed(GPSFixMoving gpsFix) { - return new KnotSpeedWithBearingImpl(gpsFix.getSpeed().getKnots(), gpsFix.getSpeed().getBearing()); - } - - private static TimePoint copyTimePoint(GPSFixMoving gpsFix) { - return new MillisecondsTimePoint(gpsFix.getTimePoint().asMillis()); - } - - private static Position copyPosition(GPSFixMoving gpsFix) { - return new DegreePosition(gpsFix.getPosition().getLatDeg(), gpsFix.getPosition().getLngDeg()); - } - - @Override - public String getRegattaName() { - return context.getTrackedRace().getTrackedRegatta().getRegatta().getName(); - } - - @Override - public String getRaceName() { - return context.getTrackedRace().getRace().getName(); - } - - @Override - public int getLegNumber() { - return context.getLegNumber(); - } - - @Override - public String getCourseAreaName() { - return context.getCourseArea().getName(); - } - - @Override - public String getFleetName() { - return context.getFleet().getName(); - } - - @Override - public String getBoatClassName() { - return context.getCompetitor().getBoat().getBoatClass().getName(); - } - - @Override - public Integer getYear() { - return context.getYear(); - } - - @Override - public LegType getLegType() { - return context.getLegType(); - } - - @Override - public String getCompetitorName() { - return context.getCompetitor().getName(); - } - - @Override - public String getCompetitorSailID() { - return context.getCompetitor().getBoat().getSailID(); - } - - @Override - public String getCompetitorNationality() { - return context.getCompetitor().getTeam().getNationality().getThreeLetterIOCAcronym(); - } - - @Override - public WindStrengthCluster getWindStrength() { - if (getWind() == null) { - return null; - } - - return WindStrength.getClusterFor(getWind().getBeaufort(), WindStrength.StandardClusters); - } - - public Wind getWind() { - if (!windHasBeenInitialized) { - wind = context.getTrackedRace().getWind(getPosition(), getTimePoint()); - windHasBeenInitialized = true; - } - - return wind; - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/tracked_leg_of_competitor/DistanceTraveledExtractionWorker.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/tracked_leg_of_competitor/DistanceTraveledExtractionWorker.java deleted file mode 100644 index ea79b20f949..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/tracked_leg_of_competitor/DistanceTraveledExtractionWorker.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sap.sailing.datamining.impl.tracked_leg_of_competitor; - -import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext; -import com.sap.sailing.domain.common.Distance; -import com.sap.sse.datamining.impl.workers.extractors.AbstractExtractionWorker; - -public class DistanceTraveledExtractionWorker extends AbstractExtractionWorker { - - @Override - public Double extract(TrackedLegOfCompetitorWithContext dataEntry) { - Distance distanceTraveled = dataEntry.getDistanceTraveled(); - return distanceTraveled != null ? distanceTraveled.getMeters() : 0; - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/tracked_leg_of_competitor/TrackedLegOfCompetitorLeaderboardGroupDataRetrievalWorker.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/tracked_leg_of_competitor/TrackedLegOfCompetitorLeaderboardGroupDataRetrievalWorker.java deleted file mode 100644 index 813add4be80..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/tracked_leg_of_competitor/TrackedLegOfCompetitorLeaderboardGroupDataRetrievalWorker.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sap.sailing.datamining.impl.tracked_leg_of_competitor; - -import java.util.ArrayList; -import java.util.Collection; - -import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; -import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext; -import com.sap.sailing.datamining.impl.components.AbstractLeaderboardGroupDataRetrievalWorker; -import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; -import com.sap.sse.common.Util; - -public class TrackedLegOfCompetitorLeaderboardGroupDataRetrievalWorker extends AbstractLeaderboardGroupDataRetrievalWorker { - - @Override - public Collection doWork() { - Collection data = new ArrayList(); - Collection> baseData = retrieveDataTillTrackedLegOfCompetitor(getGroup()); - for (Util.Pair baseDataEntry : baseData) { - data.add(new TrackedLegOfCompetitorWithContextImpl(baseDataEntry.getA(), baseDataEntry.getB())); - } - return data; - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/tracked_leg_of_competitor/TrackedLegOfCompetitorWithContextImpl.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/tracked_leg_of_competitor/TrackedLegOfCompetitorWithContextImpl.java deleted file mode 100644 index f211553eab9..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/tracked_leg_of_competitor/TrackedLegOfCompetitorWithContextImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.sap.sailing.datamining.impl.tracked_leg_of_competitor; - -import com.sap.sailing.datamining.WindStrengthCluster; -import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; -import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext; -import com.sap.sailing.domain.common.Distance; -import com.sap.sailing.domain.common.LegType; -import com.sap.sailing.domain.common.TimePoint; -import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; - -public class TrackedLegOfCompetitorWithContextImpl implements TrackedLegOfCompetitorWithContext { - - private TrackedLegOfCompetitor trackedLegOfCompetitor; - private HasTrackedLegOfCompetitorContext context; - - public TrackedLegOfCompetitorWithContextImpl(TrackedLegOfCompetitor trackedLegOfCompetitor, HasTrackedLegOfCompetitorContext context) { - this.trackedLegOfCompetitor = trackedLegOfCompetitor; - this.context = context; - } - - @Override - public String getRegattaName() { - return context.getTrackedRace().getTrackedRegatta().getRegatta().getName(); - } - - @Override - public String getRaceName() { - return context.getTrackedRace().getRace().getName(); - } - - @Override - public int getLegNumber() { - return context.getLegNumber(); - } - - @Override - public String getCourseAreaName() { - return context.getCourseArea().getName(); - } - - @Override - public String getFleetName() { - return context.getFleet().getName(); - } - - @Override - public String getBoatClassName() { - return context.getCompetitor().getBoat().getBoatClass().getName(); - } - - @Override - public Integer getYear() { - return context.getYear(); - } - - @Override - public LegType getLegType() { - return context.getLegType(); - } - - @Override - public String getCompetitorName() { - return context.getCompetitor().getName(); - } - - @Override - public String getCompetitorSailID() { - return context.getCompetitor().getBoat().getSailID(); - } - - @Override - public String getCompetitorNationality() { - return context.getCompetitor().getTeam().getNationality().getThreeLetterIOCAcronym(); - } - - @Override - public WindStrengthCluster getWindStrength() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Distance getDistanceTraveled() { - TimePoint finishTime = trackedLegOfCompetitor.getFinishTime(); - return finishTime != null ? trackedLegOfCompetitor.getDistanceTraveled(finishTime) : null; - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/workers/SpeedInKnotsExtractionWorker.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/workers/SpeedInKnotsExtractionWorker.java deleted file mode 100644 index cf130331d30..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/workers/SpeedInKnotsExtractionWorker.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sap.sailing.datamining.impl.workers; - -import com.sap.sailing.domain.base.Moving; -import com.sap.sse.datamining.impl.workers.extractors.AbstractExtractionWorker; - -public class SpeedInKnotsExtractionWorker extends AbstractExtractionWorker { - - @Override - public Double extract(Moving dataEntry) { - return dataEntry.getSpeed().getKnots(); - } - -} \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/workers/builders/DataRetrieverWorkerBuilder.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/workers/builders/DataRetrieverWorkerBuilder.java deleted file mode 100644 index 7c34311185c..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/workers/builders/DataRetrieverWorkerBuilder.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.sap.sailing.datamining.impl.workers.builders; - -import com.sap.sailing.datamining.impl.gps_fix.GPSFixLeaderboardGroupDataRetrievalWorker; -import com.sap.sailing.datamining.impl.tracked_leg_of_competitor.TrackedLegOfCompetitorLeaderboardGroupDataRetrievalWorker; -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; -import com.sap.sse.datamining.workers.DataRetrievalWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public class DataRetrieverWorkerBuilder implements WorkerBuilder> { - - private final DataTypes dataType; - - public DataRetrieverWorkerBuilder(DataTypes dataType) { - this.dataType = dataType; - } - - @Override - @SuppressWarnings("unchecked") - public DataRetrievalWorker build() { - switch (dataType) { - case GPSFix: - return (DataRetrievalWorker) new GPSFixLeaderboardGroupDataRetrievalWorker(); - case TrackedLegOfCompetitor: - return (DataRetrievalWorker) new TrackedLegOfCompetitorLeaderboardGroupDataRetrievalWorker(); - } - throw new IllegalArgumentException("Not yet implemented for the given data type: " + dataType.toString()); - } - -} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/workers/builders/ExtractionWorkerBuilder.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/workers/builders/ExtractionWorkerBuilder.java deleted file mode 100644 index f589cf1ec69..00000000000 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/workers/builders/ExtractionWorkerBuilder.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.sap.sailing.datamining.impl.workers.builders; - -import com.sap.sailing.datamining.impl.tracked_leg_of_competitor.DistanceTraveledExtractionWorker; -import com.sap.sailing.datamining.impl.workers.SpeedInKnotsExtractionWorker; -import com.sap.sailing.datamining.shared.StatisticType; -import com.sap.sse.datamining.workers.ExtractionWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public class ExtractionWorkerBuilder implements WorkerBuilder> { - - private StatisticType statisticType; - - public ExtractionWorkerBuilder(StatisticType statisticType) { - this.statisticType = statisticType; - } - - @Override - @SuppressWarnings("unchecked") - public ExtractionWorker build() { - switch (statisticType) { - case Speed: - return (ExtractionWorker) new SpeedInKnotsExtractionWorker(); - case Distance: - return (ExtractionWorker) new DistanceTraveledExtractionWorker(); - } - throw new IllegalArgumentException("Not yet implemented for the given statistic type: " - + statisticType.toString()); - } - -} diff --git a/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF index effe738b191..7f31bc8dc09 100755 --- a/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.common/META-INF/MANIFEST.MF @@ -21,4 +21,5 @@ Export-Package: com.sap.sailing.domain.common, com.sap.sailing.domain.common.scalablevalue, com.sap.sailing.domain.common.scalablevalue.impl, com.sap.sailing.domain.common.trackfiles -Require-Bundle: com.sap.sse.common +Require-Bundle: com.sap.sse.datamining.shared, + com.sap.sse.common diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Speed.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Speed.java index 192bb359998..a8944893e70 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Speed.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/Speed.java @@ -2,6 +2,9 @@ package com.sap.sailing.domain.common; import java.io.Serializable; +import com.sap.sse.datamining.shared.Unit; +import com.sap.sse.datamining.shared.annotations.Statistic; + /** * A speed, convertable in various units of measure. Can be negative. * @@ -48,6 +51,7 @@ public interface Speed extends Comparable, Serializable { } }; + @Statistic(messageKey="InKnots", resultDecimals=2, resultUnit=Unit.Knots) double getKnots(); double getMetersPerSecond(); diff --git a/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF index d9ad7470bde..cdccdb6e656 100644 --- a/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain.shared.android/META-INF/MANIFEST.MF @@ -6,6 +6,7 @@ Bundle-Version: 1.0.0.qualifier Bundle-Vendor: SAP Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Require-Bundle: com.sap.sailing.domain.common;bundle-version="1.0.0", + com.sap.sse.datamining.shared;bundle-version="1.0.0", com.sap.sse.common Export-Package: com.sap.sailing.domain.base, com.sap.sailing.domain.base.configuration, diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Boat.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Boat.java index 0883e5384ef..e431312c985 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Boat.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Boat.java @@ -1,9 +1,11 @@ package com.sap.sailing.domain.base; import com.sap.sse.common.Named; +import com.sap.sse.datamining.shared.annotations.Dimension; public interface Boat extends Named { BoatClass getBoatClass(); + @Dimension(messageKey="SailID") String getSailID(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java index 9f1ab5088f3..bab5f9f8a7d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java @@ -2,11 +2,14 @@ package com.sap.sailing.domain.base; import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.WithID; +import com.sap.sse.datamining.shared.annotations.Connector; import com.sap.sse.common.Named; public interface Competitor extends Named, WithID, IsManagedBySharedDomainFactory { + @Connector(messageKey="Team", ordinal=8) Team getTeam(); + @Connector(messageKey="Boat", ordinal=9) Boat getBoat(); Color getColor(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Nationality.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Nationality.java index 56824573404..b2c09c8bc4f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Nationality.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Nationality.java @@ -2,8 +2,10 @@ package com.sap.sailing.domain.base; import com.sap.sailing.domain.common.CountryCode; import com.sap.sse.common.Named; +import com.sap.sse.datamining.shared.annotations.Dimension; public interface Nationality extends Named, WithImage, IsManagedBySharedDomainFactory { + @Dimension(messageKey="NationalityAcronym") String getThreeLetterIOCAcronym(); CountryCode getCountryCode(); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/WithNationality.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/WithNationality.java index 11603d89d7c..c145cdb6e59 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/WithNationality.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/WithNationality.java @@ -1,5 +1,8 @@ package com.sap.sailing.domain.base; +import com.sap.sse.datamining.shared.annotations.Connector; + public interface WithNationality { + @Connector(ordinal=7) Nationality getNationality(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java index 8364205a31e..bbe4932d708 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CompetitorImpl.java @@ -60,7 +60,7 @@ public class CompetitorImpl implements DynamicCompetitor { public Serializable getId() { return id; } - + @Override public DynamicTeam getTeam() { return team; diff --git a/java/com.sap.sailing.domain/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain/META-INF/MANIFEST.MF index 8e9e94d2d5d..79862c31372 100755 --- a/java/com.sap.sailing.domain/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain/META-INF/MANIFEST.MF @@ -32,4 +32,5 @@ Require-Bundle: com.googlecode.java-diff-utils;bundle-version="1.3.0", com.sap.sailing.domain.common, org.json.simple;bundle-version="1.1.0", com.sap.sailing.geocoding, + com.sap.sse.datamining.shared;bundle-version="1.0.0", com.sap.sse.common diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Moving.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Moving.java index 01993de2f32..03ea5115756 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Moving.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Moving.java @@ -1,7 +1,9 @@ package com.sap.sailing.domain.base; import com.sap.sailing.domain.common.SpeedWithBearing; +import com.sap.sse.datamining.shared.annotations.Connector; public interface Moving { + @Connector(messageKey="Speed") SpeedWithBearing getSpeed(); } diff --git a/java/com.sap.sailing.gwt.ui/DataMining.css b/java/com.sap.sailing.gwt.ui/DataMining.css index a1e0d76ae36..653802fe734 100644 --- a/java/com.sap.sailing.gwt.ui/DataMining.css +++ b/java/com.sap.sailing.gwt.ui/DataMining.css @@ -219,7 +219,3 @@ input.magnifier { -ms-border-radius: 0px 3px 3px 0px; border-radius: 0px 3px 3px 0px; } - -.dataTypeLabel { - font-weight: bold; -} diff --git a/java/com.sap.sailing.gwt.ui/DataMining.html b/java/com.sap.sailing.gwt.ui/DataMining.html index 640da47f228..fde79db199d 100644 --- a/java/com.sap.sailing.gwt.ui/DataMining.html +++ b/java/com.sap.sailing.gwt.ui/DataMining.html @@ -11,8 +11,9 @@ - + + diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT.launch b/java/com.sap.sailing.gwt.ui/SailingGWT.launch index e09b25e150b..5d943eeb607 100755 --- a/java/com.sap.sailing.gwt.ui/SailingGWT.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT.launch @@ -7,7 +7,7 @@ - + @@ -53,7 +53,7 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/leaderboard/LeaderboardActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/leaderboard/LeaderboardActivity.java index a898d6e1021..3077796a29f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/leaderboard/LeaderboardActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/client/place/leaderboard/LeaderboardActivity.java @@ -165,7 +165,7 @@ public class LeaderboardActivity extends AbstractActivity implements ErrorReport raceColumnSelectionStrategy, showAddedScores, showOverallColumnWithNumberOfRacesSailedPerCompetitor); } else { - final List overallDetails = Collections.emptyList(); + final List overallDetails = Collections.singletonList(DetailType.REGATTA_RANK); result = LeaderboardSettingsFactory.getInstance().createNewDefaultSettings(null, null, /* overallDetails */ overallDetails, null, /* autoExpandFirstRace */false, refreshIntervalMillis, numberOfLastRacesToShow, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 49f4499b2ea..199d71b7bae 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -813,7 +813,7 @@ public interface StringMessages extends Messages { String lastFinished(); String run(); String times(); - String numberOfGPSFixes(); + String dataAmount(); String averageCleanedServerTime(); String averageCleanedOverallTime(); String dataMiningBenchmarkResults(); @@ -838,7 +838,7 @@ public interface StringMessages extends Messages { String selectSheet(); String groupBy(); String statisticToCalculate(); - String queryResultsChartSubtitle(int retrievedDataAmount, int filteredDataAmount, double calculationTime); + String queryResultsChartSubtitle(int retrievedDataAmount, double calculationTime); String noQuerySelected(); String runAutomatically(); String noStatisticSelectedError(); @@ -971,9 +971,8 @@ public interface StringMessages extends Messages { String rerunQueryAfterRefreshTooltip(); String queryDefinitionProvider(); String statisticProvider(); - String toCalculateThe(); + String calculateThe(); String groupingProvider(); - String use(); String releaseNotes(); String hasSplitFleetContiguousScoring(); String eventOverview(); @@ -1042,6 +1041,7 @@ public interface StringMessages extends Messages { String imageURLs(); String videoURLs(); String sponsorImageURLs(); + String invalidSelection(); String advancePassId(); String pleaseSelectAScoringResult(); String eventOfficialWebsiteURL(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 3a15cae3826..b71b33bd07e 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -802,7 +802,7 @@ done=Done lastFinished=Last finished run=Run times=times -numberOfGPSFixes=Number of GPS-Fixes +dataAmount=Data amount averageCleanedServerTime=\u2205 Cleaned Server Time averageCleanedOverallTime=\u2205 Cleaned Overall Time dataMiningBenchmarkResults=Data Mining Benchmark Results @@ -827,7 +827,7 @@ cleanedOverallTime=Cleaned Overall Time dataMiningResult=Data Mining Result groupBy=Group by statisticToCalculate=Calculate statistic -queryResultsChartSubtitle=Worked through {1}/{0} data entries in {2} seconds +queryResultsChartSubtitle=Worked through {0} data entries in {1} seconds noQuerySelected=No query selected runAutomatically=Run automatically windImport_Upload=Upload @@ -954,8 +954,7 @@ runAutomaticallyTooltip=Run the query automatically, after you changed e.g. the rerunQueryAfterRefreshTooltip=Reruns the query after the tables have been refreshed. queryDefinitionProvider=Query Definition Provider statisticProvider=Statistic Provider -toCalculateThe=to calculate the -use=Use +calculateThe=Calculate the groupingProvider=Grouping Provider releaseNotes=News and Release History hasSplitFleetContiguousScoring=Split fleets scored contiguously @@ -1023,6 +1022,7 @@ pleaseSelectASeriesFirst=Please select a series first. imageURLs=Image URLs videoURLs=Video URLs sponsorImageURLs=Sponsor Image URLs +invalidSelection=The current selection isn''t valid. advancePassId=Advance Pass ID pleaseSelectAScoringResult=Please select a scoring result... eventOfficialWebsiteURL=Official Website URL @@ -1064,6 +1064,6 @@ windChart=Wind Chart showVideoPopup=Show Video hideVideoPopup=Hide Video manageMedia=Manage Media -manageMediaTooltip=Configure audio and video clips, synchronize times -showAll=Show all -raceVisibilityColumn=Visibility +manageMediaTooltip=Configure audio and video clips, synchronize times +showAll=Show all +raceVisibilityColumn=Visibility diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 7fd4ada064f..5047c5322f8 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -798,7 +798,7 @@ done=Fertig lastFinished=Zuletzt fertig run=Ausführen times=mal -numberOfGPSFixes=Anzahl der GPS-Fixes +dataAmount=Anzahl der Daten averageCleanedServerTime=\u2205 Bereinigte Server-Zeit averageCleanedOverallTime=\u2205 Bereinigte Gesamt-Zeit dataMiningBenchmarkResults=Data Mining Benchmark Ergebnisse @@ -823,7 +823,7 @@ cleanedOverallTime=Bereinigte Gesamt-Zeit dataMiningResult=Data Mining Ergebnis groupBy=Gruppieren nach statisticToCalculate=Berechne Kennzahl -queryResultsChartSubtitle=Es wurden {1}/{0} Datensätze in {2} Sekunden verarbeitet +queryResultsChartSubtitle=Es wurden {0} Datensätze in {1} Sekunden verarbeitet noQuerySelected=Keine Abfrage ausgewählt runAutomatically=Automatisch ausführen windImport_Upload=Abschicken @@ -950,8 +950,7 @@ runAutomaticallyTooltip=Führe die Anfrage automatisch durch, wenn zum Beispiel rerunQueryAfterRefreshTooltip=Wiederholt die Anfrage nachdem die Tabellen aktualisiert wurden. queryDefinitionProvider=Anfragen-Definitions-Versorger statisticProvider=Statistik-Versorger -toCalculateThe=zur Berechnung von -use=Verwende +calculateThe=Berechne die groupingProvider=Gruppierungs-Versorger releaseNotes=Neuigkeiten und Änderungshistorie hasSplitFleetContiguousScoring=Gruppen durchgängig bepunkten @@ -1017,6 +1016,7 @@ pleaseSelectASeriesFirst=Bitte zuerst eine Serie auswählen. imageURLs=Bilder-URLs videoURLs=Video-URLs sponsorImageURLs=Sponsorenlogo-URLs +invalidSelection=Die aktuelle Selektion ist nicht gültig. advancePassId=Pass ID erhöhen pleaseSelectAScoringResult=Bitte ein Ergebnis auswählen... eventOfficialWebsiteURL=URL der offiziellen Veranstaltungs-Website diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 047cbf5cf04..03d6310e6b4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -795,7 +795,7 @@ done=Готово lastFinished=Последняя завершенная run=Начать times=раз -numberOfGPSFixes=Количество точек фиксации GPS +dataAmount=Data amount averageCleanedServerTime=\u2205 Чистое время на сервере averageCleanedOverallTime=\u2205 Чистое итоговое время dataMiningBenchmarkResults=Результаты сравнительного теста сбора данных @@ -820,7 +820,7 @@ cleanedOverallTime=Чистое итоговое время dataMiningResult=Результат сбора данных groupBy=Группировать по statisticToCalculate=Рассчитать статистику -queryResultsChartSubtitle=Обработанные {1}/{0} элементы данных через {2} секунд +queryResultsChartSubtitle=Обработанные {0} элементы данных через {1} секунд noQuerySelected=Запросы не выбраны runAutomatically=Запустить автоматически windImport_Upload=Загрузить @@ -947,8 +947,7 @@ runAutomaticallyTooltip=Запустить запрос автоматическ rerunQueryAfterRefreshTooltip=Повторно запускает запрос после обновления таблиц. queryDefinitionProvider=Поставщик определения запроса statisticProvider=Поставщик статистических данных -toCalculateThe=для расчета -use=Использовать +calculateThe=Calculate the groupingProvider=Поставщик группировки releaseNotes=Новости и история выпусков hasSplitFleetContiguousScoring=Разделить флоты, имеющие близкие количества очков diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/components/AbstractObjectRenderer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/components/AbstractObjectRenderer.java new file mode 100644 index 00000000000..f851f1c0bf8 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/components/AbstractObjectRenderer.java @@ -0,0 +1,17 @@ +package com.sap.sailing.gwt.ui.client.shared.components; + +import com.google.gwt.text.shared.AbstractRenderer; + +public abstract class AbstractObjectRenderer extends AbstractRenderer { + + @Override + public String render(T object) { + if (object == null) { + return ""; + } + return convertObjectToString(object); + } + + protected abstract String convertObjectToString(T nonNullObject); + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/components/SimpleObjectRenderer.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/components/SimpleObjectRenderer.java new file mode 100644 index 00000000000..6ab2bfe1ec2 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/components/SimpleObjectRenderer.java @@ -0,0 +1,13 @@ +package com.sap.sailing.gwt.ui.client.shared.components; + +/** + * Simple renderer, that uses the objects toString method to render. + */ +public class SimpleObjectRenderer extends AbstractObjectRenderer { + + @Override + protected String convertObjectToString(T object) { + return object.toString(); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/components/SimpleValueListBox.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/components/SimpleValueListBox.java deleted file mode 100644 index 8c985825a50..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/components/SimpleValueListBox.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sap.sailing.gwt.ui.client.shared.components; - -import java.io.IOException; - -import com.google.gwt.text.shared.Renderer; -import com.google.gwt.user.client.ui.ValueListBox; - -/** - * A simple implementation of {@link ValueListBox}, that uses the toString()-Method to render it's content. - * - * @author Lennart - * @see Renderer - */ -public class SimpleValueListBox extends ValueListBox { - - public SimpleValueListBox() { - super(new Renderer() { - @Override - public String render(T object) { - if (object == null) { - return ""; - } - return object.toString(); - } - @Override - public void render(T object, Appendable appendable) throws IOException { - appendable.append(render(object)); - } - }); - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningControls.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningControls.java similarity index 74% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningControls.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningControls.java index 0da7632c299..8a5196330b2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningControls.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningControls.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; import com.google.gwt.user.client.ui.Widget; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java new file mode 100644 index 00000000000..9c620c72472 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningEntryPoint.java @@ -0,0 +1,113 @@ +package com.sap.sailing.gwt.ui.datamining; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.rpc.ServiceDefTarget; +import com.google.gwt.user.client.ui.AbstractImagePrototype; +import com.google.gwt.user.client.ui.Anchor; +import com.google.gwt.user.client.ui.DockLayoutPanel; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.RootLayoutPanel; +import com.google.gwt.user.client.ui.SplitLayoutPanel; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.client.AbstractEntryPoint; +import com.sap.sailing.gwt.ui.client.GlobalNavigationPanel; +import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; +import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants; +import com.sap.sailing.gwt.ui.client.SailingService; +import com.sap.sailing.gwt.ui.client.SailingServiceAsync; +import com.sap.sailing.gwt.ui.client.shared.components.Component; +import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialog; +import com.sap.sailing.gwt.ui.datamining.execution.SimpleQueryRunner; +import com.sap.sailing.gwt.ui.datamining.presentation.BenchmarkResultsPanel; +import com.sap.sailing.gwt.ui.datamining.presentation.ResultsChart; +import com.sap.sailing.gwt.ui.datamining.selection.QueryDefinitionProviderWithControls; +import com.sap.sailing.gwt.ui.datamining.settings.QueryRunnerSettings; +import com.sap.sailing.gwt.ui.datamining.settings.RefreshingSelectionTablesSettings; +import com.sap.sse.gwt.client.EntryPointHelper; +import com.sap.sse.gwt.shared.GwtHttpRequestUtils; + +public class DataMiningEntryPoint extends AbstractEntryPoint { + private final SailingServiceAsync sailingService = GWT.create(SailingService.class); + + private static DataMiningResources resources = GWT.create(DataMiningResources.class); + + private final DataMiningServiceAsync dataMiningService = GWT.create(DataMiningService.class); + + @Override + protected void doOnModuleLoad() { + super.doOnModuleLoad(); + + EntryPointHelper.registerASyncService((ServiceDefTarget) sailingService, RemoteServiceMappingConstants.sailingServiceRemotePath); + EntryPointHelper.registerASyncService((ServiceDefTarget) dataMiningService, RemoteServiceMappingConstants.dataMiningServiceRemotePath); + + RootLayoutPanel rootPanel = RootLayoutPanel.get(); + SplitLayoutPanel splitPanel = new SplitLayoutPanel(); + rootPanel.add(splitPanel); + + DockLayoutPanel dockPanel = new DockLayoutPanel(Unit.PX); + dockPanel.addNorth(createLogoAndTitlePanel(), 68); + QueryDefinitionProviderWithControls queryDefinitionProviderWithControls = new QueryDefinitionProviderWithControls(stringMessages, sailingService, dataMiningService, this); + queryDefinitionProviderWithControls.getEntryWidget().addStyleName("dataMiningPanel"); + dockPanel.add(queryDefinitionProviderWithControls.getEntryWidget()); + + ResultsPresenter resultsPresenter = new ResultsChart(stringMessages); + if (GwtHttpRequestUtils.getBooleanParameter("benchmark", false)) { + BenchmarkResultsPanel benchmarkResultsPanel = new BenchmarkResultsPanel(stringMessages, dataMiningService, this, queryDefinitionProviderWithControls); + splitPanel.addSouth(benchmarkResultsPanel, 500); + } else { + splitPanel.addSouth(resultsPresenter.getWidget(), 400); + } + + splitPanel.add(dockPanel); + + QueryRunner queryRunner = new SimpleQueryRunner(stringMessages, dataMiningService, this, queryDefinitionProviderWithControls, resultsPresenter); + queryDefinitionProviderWithControls.addControl(queryRunner.getEntryWidget()); + queryDefinitionProviderWithControls.addControl(createSettingsControlWidget(queryRunner, queryDefinitionProviderWithControls)); + } + + private LogoAndTitlePanel createLogoAndTitlePanel() { + LogoAndTitlePanel logoAndTitlePanel = new LogoAndTitlePanel(stringMessages.dataMining(), stringMessages, this); + logoAndTitlePanel.addStyleName("LogoAndTitlePanel"); + FlowPanel globalNavigationPanel = new GlobalNavigationPanel(stringMessages, true, null, null, /* event */ null, null); + logoAndTitlePanel.add(globalNavigationPanel); + return logoAndTitlePanel; + } + + private Widget createSettingsControlWidget(final QueryRunner queryRunner, final QueryDefinitionProvider queryDefinitionProvider) { + HorizontalPanel panel = new HorizontalPanel(); + panel.setSpacing(5); + + Label runnerSettingsLabel = new Label(queryRunner.getLocalizedShortName() + ":"); + panel.add(runnerSettingsLabel); + Anchor runnerSettingsAnchor = new Anchor(AbstractImagePrototype.create(resources.settingsIcon()).getSafeHtml()); + runnerSettingsAnchor.setTitle(stringMessages.settings()); + runnerSettingsAnchor.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + new SettingsDialog(queryRunner, stringMessages).show(); + } + }); + panel.add(runnerSettingsAnchor); + + Label selectionTablesSettingsLabel = new Label(queryDefinitionProvider.getSelectionProvider().getLocalizedShortName() + ":"); + panel.add(selectionTablesSettingsLabel); + Anchor selectionTablesSettingsAnchor = new Anchor(AbstractImagePrototype.create(resources.settingsIcon()).getSafeHtml()); + selectionTablesSettingsAnchor.setTitle(stringMessages.settings()); + selectionTablesSettingsAnchor.addClickHandler(new ClickHandler() { + @SuppressWarnings("unchecked") + @Override + public void onClick(ClickEvent event) { + new SettingsDialog((Component) queryDefinitionProvider.getSelectionProvider(), stringMessages).show(); + } + }); + panel.add(selectionTablesSettingsAnchor); + + return panel; + } + +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningResources.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningResources.java similarity index 84% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningResources.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningResources.java index 9a4bc32b818..dcae09b285e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningResources.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningResources.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.ImageResource; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningService.java new file mode 100644 index 00000000000..8d467a01ac4 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningService.java @@ -0,0 +1,27 @@ +package com.sap.sailing.gwt.ui.datamining; + +import java.util.Collection; +import java.util.Set; + +import com.google.gwt.user.client.rpc.RemoteService; +import com.sap.sailing.datamining.shared.SailingDataMiningSerializationDummy; +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.QueryResult; +import com.sap.sse.datamining.shared.SSEDataMiningSerializationDummy; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + +public interface DataMiningService extends RemoteService { + + Collection getAllStatistics(String localeInfoName); + + Collection getDimensionsFor(FunctionDTO statisticToCalculate, String localeInfoName); + + QueryResult> getDimensionValuesFor(Collection dimensions) throws Exception; + + QueryResult runQuery(QueryDefinition queryDefinition) throws Exception; + + SSEDataMiningSerializationDummy pseudoMethodSoThatSomeSSEDataMiningClassesAreAddedToTheGWTSerializationPolicy(); + + SailingDataMiningSerializationDummy pseudoMethodSoThatSomeSailingDataMiningClassesAreAddedToTheGWTSerializationPolicy(); + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningServiceAsync.java new file mode 100644 index 00000000000..a685c029c21 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/DataMiningServiceAsync.java @@ -0,0 +1,40 @@ +package com.sap.sailing.gwt.ui.datamining; + +import java.util.Collection; +import java.util.Set; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sap.sailing.datamining.shared.SailingDataMiningSerializationDummy; +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.QueryResult; +import com.sap.sse.datamining.shared.SSEDataMiningSerializationDummy; +import com.sap.sse.datamining.shared.dto.FunctionDTO; +import com.sap.sse.datamining.shared.impl.GenericGroupKey; + +public interface DataMiningServiceAsync { + + void getAllStatistics(String localeInfoName, AsyncCallback> callback); + + void getDimensionsFor(FunctionDTO statisticToCalculate, String localeInfoName, AsyncCallback> callback); + + void getDimensionValuesFor(Collection dimensions, AsyncCallback>> callback); + + void runQuery(QueryDefinition queryDefinition, AsyncCallback> callback); + + /** + * This method does nothing, but is needed to ensure, that some classes for the data mining + * (like {@link GenericGroupKey}) is added to the GWT serialization policy.
+ * This is necessary, because the type is somehow hidden from GWT. For Further information + * look at bug 1503.
+ */ + void pseudoMethodSoThatSomeSSEDataMiningClassesAreAddedToTheGWTSerializationPolicy(AsyncCallback asyncCallback); + + /** + * This method does nothing, but is needed to ensure, that some classes for the data mining + * (like {@link GenericGroupKey}) is added to the GWT serialization policy.
+ * This is necessary, because the type is somehow hidden from GWT. For Further information + * look at bug 1503.
+ */ + void pseudoMethodSoThatSomeSailingDataMiningClassesAreAddedToTheGWTSerializationPolicy(AsyncCallback asyncCallback); + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/GroupingChangedListener.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GroupingChangedListener.java similarity index 63% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/GroupingChangedListener.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GroupingChangedListener.java index d7ccf86460f..add491a2248 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/GroupingChangedListener.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GroupingChangedListener.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; public interface GroupingChangedListener { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/GroupingProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GroupingProvider.java similarity index 66% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/GroupingProvider.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GroupingProvider.java index 88ff9ef88c2..f8bb229cf06 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/GroupingProvider.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/GroupingProvider.java @@ -1,17 +1,17 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; import java.util.Collection; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.datamining.shared.QueryDefinition; import com.sap.sailing.gwt.ui.client.shared.components.Component; +import com.sap.sse.datamining.shared.QueryDefinition; import com.sap.sse.datamining.shared.components.GrouperType; +import com.sap.sse.datamining.shared.dto.FunctionDTO; public interface GroupingProvider extends Component { public GrouperType getGrouperType(); - public Collection getDimensionsToGroupBy(); + public Collection getDimensionsToGroupBy(); public String getCustomGrouperScriptText(); public void applyQueryDefinition(QueryDefinition queryDefinition); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/QueryDefinitionChangedListener.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryDefinitionChangedListener.java similarity index 53% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/QueryDefinitionChangedListener.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryDefinitionChangedListener.java index 8ebae367469..ac6d68abd1f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/QueryDefinitionChangedListener.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryDefinitionChangedListener.java @@ -1,6 +1,6 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; -import com.sap.sailing.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.QueryDefinition; public interface QueryDefinitionChangedListener { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/QueryDefinitionProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryDefinitionProvider.java similarity index 84% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/QueryDefinitionProvider.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryDefinitionProvider.java index 3ca6d80c975..c373fb75e68 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/QueryDefinitionProvider.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryDefinitionProvider.java @@ -1,12 +1,13 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; -import com.sap.sailing.datamining.shared.QueryDefinition; import com.sap.sailing.gwt.ui.client.shared.components.Component; +import com.sap.sse.datamining.shared.QueryDefinition; public interface QueryDefinitionProvider extends Component { public Iterable validateQueryDefinition(QueryDefinition queryDefinition); public QueryDefinition getQueryDefinition(); + public void applyQueryDefinition(QueryDefinition queryDefinition); public void addQueryDefinitionChangedListener(QueryDefinitionChangedListener listener); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/QueryRunner.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryRunner.java similarity index 55% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/QueryRunner.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryRunner.java index eb49e21d441..64374c61ec0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/QueryRunner.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/QueryRunner.java @@ -1,8 +1,8 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; -import com.sap.sailing.datamining.shared.QueryDefinition; import com.sap.sailing.gwt.ui.client.shared.components.Component; -import com.sap.sailing.gwt.ui.datamining.client.settings.QueryRunnerSettings; +import com.sap.sailing.gwt.ui.datamining.settings.QueryRunnerSettings; +import com.sap.sse.datamining.shared.QueryDefinition; public interface QueryRunner extends QueryDefinitionChangedListener, Component { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/ResultsPresenter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsPresenter.java similarity index 87% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/ResultsPresenter.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsPresenter.java index 067f109a590..2e2d77b417d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/ResultsPresenter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/ResultsPresenter.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; import com.google.gwt.user.client.ui.Widget; import com.sap.sse.datamining.shared.QueryResult; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/SelectionChangedListener.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/SelectionChangedListener.java similarity index 64% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/SelectionChangedListener.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/SelectionChangedListener.java index 02e29962d45..e04a7398b16 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/SelectionChangedListener.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/SelectionChangedListener.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; public interface SelectionChangedListener { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/SelectionProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/SelectionProvider.java similarity index 59% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/SelectionProvider.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/SelectionProvider.java index 1acaf20a9c1..7802e5b7733 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/SelectionProvider.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/SelectionProvider.java @@ -1,17 +1,18 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; +import java.io.Serializable; import java.util.Collection; import java.util.Map; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.datamining.shared.QueryDefinition; import com.sap.sailing.gwt.ui.client.shared.components.Component; +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.dto.FunctionDTO; public interface SelectionProvider extends Component { public void addSelectionChangedListener(SelectionChangedListener listener); - public Map> getSelection(); + public Map> getFilterSelection(); public void applySelection(QueryDefinition queryDefinition); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/StatisticChangedListener.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/StatisticChangedListener.java new file mode 100644 index 00000000000..f1f36fe3e0c --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/StatisticChangedListener.java @@ -0,0 +1,11 @@ +package com.sap.sailing.gwt.ui.datamining; + +import com.sap.sse.datamining.shared.components.AggregatorType; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + + +public interface StatisticChangedListener { + + public void statisticChanged(FunctionDTO newStatisticToCalculate, AggregatorType newAggregatorType); + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/StatisticProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/StatisticProvider.java new file mode 100644 index 00000000000..0152052cf22 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/StatisticProvider.java @@ -0,0 +1,17 @@ +package com.sap.sailing.gwt.ui.datamining; + +import com.sap.sailing.gwt.ui.client.shared.components.Component; +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.components.AggregatorType; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + +public interface StatisticProvider extends Component { + + public FunctionDTO getStatisticToCalculate(); + public AggregatorType getAggregatorType(); + + public void addStatisticChangedListener(StatisticChangedListener listener); + + public void applyQueryDefinition(QueryDefinition queryDefinition); + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/UnitFormatter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/UnitFormatter.java similarity index 92% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/UnitFormatter.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/UnitFormatter.java index f9e9b450962..fbcaf43c977 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/UnitFormatter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/UnitFormatter.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client; +package com.sap.sailing.gwt.ui.datamining; import com.google.gwt.core.shared.GWT; import com.sap.sailing.gwt.ui.client.StringMessages; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningEntryPoint.java deleted file mode 100644 index 2b97dd5e292..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningEntryPoint.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Style.Unit; -import com.google.gwt.user.client.rpc.ServiceDefTarget; -import com.google.gwt.user.client.ui.DockLayoutPanel; -import com.google.gwt.user.client.ui.FlowPanel; -import com.google.gwt.user.client.ui.HTML; -import com.google.gwt.user.client.ui.RootLayoutPanel; -import com.google.gwt.user.client.ui.SplitLayoutPanel; -import com.sap.sailing.gwt.ui.client.AbstractEntryPoint; -import com.sap.sailing.gwt.ui.client.GlobalNavigationPanel; -import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; -import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants; -import com.sap.sailing.gwt.ui.client.SailingService; -import com.sap.sailing.gwt.ui.client.SailingServiceAsync; -import com.sap.sse.gwt.client.EntryPointHelper; - -public class DataMiningEntryPoint extends AbstractEntryPoint { - private final SailingServiceAsync sailingService = GWT.create(SailingService.class); - -// private static DataMiningResources resources = GWT.create(DataMiningResources.class); - - private final DataMiningServiceAsync dataMiningService = GWT.create(DataMiningService.class); - - @Override - protected void doOnModuleLoad() { - super.doOnModuleLoad(); - - EntryPointHelper.registerASyncService((ServiceDefTarget) sailingService, RemoteServiceMappingConstants.sailingServiceRemotePath); - EntryPointHelper.registerASyncService((ServiceDefTarget) dataMiningService, RemoteServiceMappingConstants.dataMiningServiceRemotePath); - - RootLayoutPanel rootPanel = RootLayoutPanel.get(); - SplitLayoutPanel splitPanel = new SplitLayoutPanel(); - rootPanel.add(splitPanel); - - DockLayoutPanel dockPanel = new DockLayoutPanel(Unit.PX); - dockPanel.addNorth(createLogoAndTitlePanel(), 68); - - HTML siteInConstructionLabel = new HTML("This site is currently under construction."); - siteInConstructionLabel.setStyleName("chart-importantMessage"); - dockPanel.add(siteInConstructionLabel); - -// QueryDefinitionProviderWithControls queryDefinitionProviderWithControls = new QueryDefinitionProviderWithControls(stringMessages, sailingService, this); -// QueryDefinitionProvider queryDefinitionProvider = queryDefinitionProviderWithControls; -// queryDefinitionProvider.getEntryWidget().addStyleName("dataMiningPanel"); -// dockPanel.add(queryDefinitionProvider.getEntryWidget()); -// -// ResultsPresenter resultsPresenter = new ResultsChart(stringMessages); -// splitPanel.addSouth(resultsPresenter.getWidget(), 400); -// -// splitPanel.add(dockPanel); -// -// QueryRunner queryRunner = new SimpleQueryRunner(stringMessages, dataMiningService, this, queryDefinitionProvider, resultsPresenter); -// queryDefinitionProviderWithControls.addControl(queryRunner.getEntryWidget()); -// queryDefinitionProviderWithControls.addControl(createSettingsControlWidget(queryRunner, queryDefinitionProvider)); -// -// SimpleQueryDefinition queryDefinition = new SimpleQueryDefinition(LocaleInfo.getCurrentLocale().getLocaleName(), GrouperType.Dimensions, StatisticType.Speed, AggregatorType.Average, DataTypes.GPSFix); -// queryDefinition.appendDimensionToGroupBy(DimensionIdentifier.RegattaName); -// queryDefinitionProvider.applyQueryDefinition(queryDefinition); -// queryRunner.run(queryDefinitionProvider.getQueryDefinition()); - } - - private LogoAndTitlePanel createLogoAndTitlePanel() { - LogoAndTitlePanel logoAndTitlePanel = new LogoAndTitlePanel(stringMessages.dataMining(), stringMessages, this); - logoAndTitlePanel.addStyleName("LogoAndTitlePanel"); - FlowPanel globalNavigationPanel = new GlobalNavigationPanel(stringMessages, true, null, null, /* event */ null, null); - logoAndTitlePanel.add(globalNavigationPanel); - return logoAndTitlePanel; - } - -// private Widget createSettingsControlWidget(final QueryRunner queryRunner, final QueryDefinitionProvider queryDefinitionProvider) { -// HorizontalPanel panel = new HorizontalPanel(); -// panel.setSpacing(5); -// -// Label runnerSettingsLabel = new Label(queryRunner.getLocalizedShortName() + ":"); -// panel.add(runnerSettingsLabel); -// Anchor runnerSettingsAnchor = new Anchor(AbstractImagePrototype.create(resources.settingsIcon()).getSafeHtml()); -// runnerSettingsAnchor.setTitle(stringMessages.settings()); -// runnerSettingsAnchor.addClickHandler(new ClickHandler() { -// @Override -// public void onClick(ClickEvent event) { -// new SettingsDialog(queryRunner, stringMessages).show(); -// } -// }); -// panel.add(runnerSettingsAnchor); -// -// Label selectionTablesSettingsLabel = new Label(queryDefinitionProvider.getSelectionProvider().getLocalizedShortName() + ":"); -// panel.add(selectionTablesSettingsLabel); -// Anchor selectionTablesSettingsAnchor = new Anchor(AbstractImagePrototype.create(resources.settingsIcon()).getSafeHtml()); -// selectionTablesSettingsAnchor.setTitle(stringMessages.settings()); -// selectionTablesSettingsAnchor.addClickHandler(new ClickHandler() { -// @SuppressWarnings("unchecked") -// @Override -// public void onClick(ClickEvent event) { -// new SettingsDialog((Component) queryDefinitionProvider.getSelectionProvider(), stringMessages).show(); -// } -// }); -// panel.add(selectionTablesSettingsAnchor); -// -// return panel; -// } - -} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningService.java deleted file mode 100644 index ce6f83a8213..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client; - -import java.util.Collection; - -import com.google.gwt.user.client.rpc.RemoteService; -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sse.datamining.shared.DataMiningSerializationDummy; -import com.sap.sse.datamining.shared.QueryResult; -import com.sap.sse.datamining.shared.dto.FunctionDTO; - -public interface DataMiningService extends RemoteService { - - Collection getDimensionsFor(DataTypes dataType); - - QueryResult runQuery(QueryDefinition queryDefinition) throws Exception; - - DataMiningSerializationDummy pseudoMethodSoThatSomeDataMiningClassesAreAddedToTheGWTSerializationPolicy(); - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningServiceAsync.java deleted file mode 100644 index 7ede7c5f667..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/DataMiningServiceAsync.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client; - -import java.util.Collection; - -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sse.datamining.shared.DataMiningSerializationDummy; -import com.sap.sse.datamining.shared.QueryResult; -import com.sap.sse.datamining.shared.dto.FunctionDTO; - -public interface DataMiningServiceAsync { - - void getDimensionsFor(DataTypes dataType, AsyncCallback> callback); - - void runQuery(QueryDefinition queryDefinition, AsyncCallback> callback); - - /** - * This method does nothing, but is needed to ensure, that GenericGroupKey<String> in the GWT serialization policy.
- * This is necessary, because the type is somehow covered from GWT. For Further information look at bug 1503.
- */ - void pseudoMethodSoThatSomeDataMiningClassesAreAddedToTheGWTSerializationPolicy(AsyncCallback asyncCallback); - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/StatisticChangedListener.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/StatisticChangedListener.java deleted file mode 100644 index 170881e5813..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/StatisticChangedListener.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client; - -import com.sap.sailing.gwt.ui.datamining.client.selection.SimpleStatistic; - -public interface StatisticChangedListener { - - public void statisticChanged(SimpleStatistic newStatistic); - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/StatisticProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/StatisticProvider.java deleted file mode 100644 index 3680b34687c..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/StatisticProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client; - -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sailing.datamining.shared.StatisticType; -import com.sap.sailing.gwt.ui.client.shared.components.Component; -import com.sap.sailing.gwt.ui.datamining.client.selection.SimpleStatistic; -import com.sap.sse.datamining.shared.components.AggregatorType; - -public interface StatisticProvider extends Component { - - public StatisticType getStatisticType(); - public AggregatorType getAggregatorType(); - public DataTypes getDataType(); - public SimpleStatistic getStatistic(); - - public void addStatisticChangedListener(StatisticChangedListener listener); - - public void applyQueryDefinition(QueryDefinition queryDefinition); - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/StatisticsManager.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/StatisticsManager.java deleted file mode 100644 index 9305772c5cb..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/StatisticsManager.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client; - -import java.util.Collection; -import java.util.Set; - -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.gwt.ui.datamining.client.selection.ComplexStatistic; - -public interface StatisticsManager { - - public void addStatistic(ComplexStatistic statistic); - - public ComplexStatistic getStatistic(DataTypes dataType); - public Collection getAllStatistics(); - - public Set getRegisteredBaseDataTypes(); - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/ComplexStatistic.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/ComplexStatistic.java deleted file mode 100644 index b2d92398224..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/ComplexStatistic.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.StatisticType; -import com.sap.sse.datamining.shared.components.AggregatorType; - -public class ComplexStatistic { - - private final DataTypes baseDataType; - private final Set possibleStatistics; - private final Set possibleAggregators; - - public ComplexStatistic(DataTypes baseDataType, Collection possibleStatistics, Collection possibleAggregators) { - this.baseDataType = baseDataType; - this.possibleAggregators = new HashSet(possibleAggregators); - this.possibleStatistics = new HashSet(possibleStatistics); - } - - public DataTypes getBaseDataType() { - return baseDataType; - } - - public Set getPossibleStatistics() { - return possibleStatistics; - } - - public Set getPossibleAggregators() { - return possibleAggregators; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/ComplexStatisticProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/ComplexStatisticProvider.java deleted file mode 100644 index 280cdb46fcf..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/ComplexStatisticProvider.java +++ /dev/null @@ -1,199 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import com.google.gwt.event.logical.shared.ValueChangeEvent; -import com.google.gwt.event.logical.shared.ValueChangeHandler; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.ValueListBox; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sailing.datamining.shared.StatisticType; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent; -import com.sap.sailing.gwt.ui.client.shared.components.SimpleValueListBox; -import com.sap.sailing.gwt.ui.datamining.client.StatisticChangedListener; -import com.sap.sailing.gwt.ui.datamining.client.StatisticProvider; -import com.sap.sailing.gwt.ui.datamining.client.StatisticsManager; -import com.sap.sse.datamining.shared.components.AggregatorType; - -public class ComplexStatisticProvider implements StatisticProvider { - - private final StringMessages stringMessages; - private final StatisticsManager statisticsManager; - private Set listeners; - - private final HorizontalPanel mainPanel; - private final ValueListBox statisticListBox; - private final ValueListBox aggregatorListBox; - private final ValueListBox dataTypeListBox; - - public ComplexStatisticProvider(StringMessages stringMessages, StatisticsManager statisticsManager) { - this.stringMessages = stringMessages; - this.statisticsManager = statisticsManager; - listeners = new HashSet(); - - mainPanel = new HorizontalPanel(); - mainPanel.setSpacing(5); - - Label dataTypeLabel = new Label(this.stringMessages.use()); - dataTypeLabel.addStyleName("dataTypeLabel"); - mainPanel.add(dataTypeLabel); - dataTypeListBox = createDataTypeListBox(); - mainPanel.add(dataTypeListBox); - - mainPanel.add(new Label(this.stringMessages.toCalculateThe())); - statisticListBox = createStatisticToCalculateListBox(); - mainPanel.add(statisticListBox); - - aggregatorListBox = createAggregatorListBox(); - HorizontalPanel aggregatorPanel = surroundAggregatorListBoxWithBraces(aggregatorListBox); - mainPanel.add(aggregatorPanel); - - applyStatistic(getStandardStatistic()); - } - - private ValueListBox createDataTypeListBox() { - ValueListBox dataTypeListBox = new SimpleValueListBox(); - dataTypeListBox.setValue(getStandardStatistic().getBaseDataType(), false); - dataTypeListBox.setAcceptableValues(this.statisticsManager.getRegisteredBaseDataTypes()); - dataTypeListBox.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - applyStatistic(ComplexStatisticProvider.this.statisticsManager.getStatistic(event.getValue())); - notifyHandlers(); - } - }); - return dataTypeListBox; - } - - private HorizontalPanel surroundAggregatorListBoxWithBraces(ValueListBox aggregatorListBox) { - HorizontalPanel aggregatorPanel = new HorizontalPanel(); - aggregatorPanel.setSpacing(1); - aggregatorPanel.add(new Label("(")); - - aggregatorPanel.add(aggregatorListBox); - aggregatorPanel.add(new Label(")")); - return aggregatorPanel; - } - - private ValueListBox createAggregatorListBox() { - ValueListBox aggregatorListBox = new SimpleValueListBox(); - aggregatorListBox.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - notifyHandlers(); - } - }); - return aggregatorListBox; - } - - private ValueListBox createStatisticToCalculateListBox() { - ValueListBox statisticListBox = new SimpleValueListBox(); - statisticListBox.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - notifyHandlers(); - } - }); - return statisticListBox; - } - - private ComplexStatistic getStandardStatistic() { - return this.statisticsManager.getAllStatistics().iterator().next(); - } - - @Override - public void applyQueryDefinition(QueryDefinition queryDefinition) { - applyStatistic(statisticsManager.getStatistic(queryDefinition.getDataType())); - aggregatorListBox.setValue(queryDefinition.getAggregatorType(), false); - dataTypeListBox.setValue(queryDefinition.getDataType(), false); - } - - private void applyStatistic(ComplexStatistic statistic) { - dataTypeListBox.setValue(statistic.getBaseDataType(), false); - - aggregatorListBox.setAcceptableValues(Arrays.asList(AggregatorType.values())); - aggregatorListBox.setValue(statistic.getPossibleAggregators().iterator().next(), false); - aggregatorListBox.setAcceptableValues(statistic.getPossibleAggregators()); - - statisticListBox.setAcceptableValues(Arrays.asList(StatisticType.values())); - statisticListBox.setValue(statistic.getPossibleStatistics().iterator().next(), false); - statisticListBox.setAcceptableValues(statistic.getPossibleStatistics()); - } - - private void notifyHandlers() { - SimpleStatistic newStatistic = getStatistic(); - for (StatisticChangedListener listener : listeners) { - listener.statisticChanged(newStatistic); - } - } - - @Override - public SimpleStatistic getStatistic() { - return new SimpleStatistic(getDataType(), getStatisticType(), getAggregatorType()); - } - - @Override - public void addStatisticChangedListener(StatisticChangedListener listener) { - listeners.add(listener); - } - - @Override - public StatisticType getStatisticType() { - return statisticListBox.getValue(); - } - - @Override - public AggregatorType getAggregatorType() { - return aggregatorListBox.getValue(); - } - - @Override - public DataTypes getDataType() { - return dataTypeListBox.getValue(); - } - - @Override - public String getLocalizedShortName() { - return stringMessages.statisticProvider(); - } - - @Override - public Widget getEntryWidget() { - return mainPanel; - } - - @Override - public boolean isVisible() { - return mainPanel.isVisible(); - } - - @Override - public void setVisible(boolean visibility) { - mainPanel.setVisible(visibility); - } - - @Override - public boolean hasSettings() { - return false; - } - - @Override - public SettingsDialogComponent getSettingsDialogComponent() { - return null; - } - - @Override - public void updateSettings(Object newSettings) { } - - @Override - public String getDependentCssClassName() { - return "complexStatisticProvider"; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/GroupBySelectionPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/GroupBySelectionPanel.java deleted file mode 100644 index 7ca31cbe5e2..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/GroupBySelectionPanel.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import com.google.gwt.event.logical.shared.ValueChangeEvent; -import com.google.gwt.event.logical.shared.ValueChangeHandler; -import com.google.gwt.text.shared.Renderer; -import com.google.gwt.user.client.ui.FlowPanel; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.ValueListBox; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.datamining.shared.components.GrouperType; - -public abstract class GroupBySelectionPanel extends FlowPanel { - - private StringMessages stringMessages; - - private ValueListBox grouperTypeListBox; - private HorizontalPanel dimensionsToGroupByPanel; - private List> dimensionsToGroupByBoxes; - - public GroupBySelectionPanel(StringMessages stringMessages) { - this.stringMessages = stringMessages; - dimensionsToGroupByBoxes = new ArrayList>(); - - add(createGrouperTypeSelectionPanel()); - - dimensionsToGroupByPanel = new HorizontalPanel(); - dimensionsToGroupByPanel.setSpacing(5); - add(dimensionsToGroupByPanel); - - ValueListBox dimensionToGroupByBox = createDimensionToGroupByBox(); - dimensionsToGroupByPanel.add(dimensionToGroupByBox); - dimensionsToGroupByBoxes.add(dimensionToGroupByBox); - } - - public void apply(QueryDefinition queryDefinition) { - grouperTypeListBox.setValue(queryDefinition.getGrouperType(), true); - - switch (queryDefinition.getGrouperType()) { - case Dimensions: - applyDimensionsToGroupBy(queryDefinition); - break; - default: - throw new IllegalArgumentException("Not yet implemented for the given data type: " + queryDefinition.getGrouperType().toString()); - } - } - - private void applyDimensionsToGroupBy(QueryDefinition queryDefinition) { - int index = 0; - for (DimensionIdentifier dimension : queryDefinition.getDimensionsToGroupBy()) { - dimensionsToGroupByBoxes.get(index).setValue(dimension, true); - index++; - } - } - - public GrouperType getGrouperType() { - return grouperTypeListBox.getValue(); - } - - public Collection getDimensionsToGroupBy() { - Collection dimensionsToGroupBy = new ArrayList(); - if (getGrouperType() == GrouperType.Dimensions) { - for (ValueListBox dimensionToGroupByBox : dimensionsToGroupByBoxes) { - if (dimensionToGroupByBox.getValue() != null) { - dimensionsToGroupBy.add(dimensionToGroupByBox.getValue()); - } - } - } - return dimensionsToGroupBy; - } - - private HorizontalPanel createGrouperTypeSelectionPanel() { - HorizontalPanel selectGroupByPanel = new HorizontalPanel(); - selectGroupByPanel.setSpacing(5); - - selectGroupByPanel.add(new Label(this.stringMessages.groupBy() + ": ")); - grouperTypeListBox = new ValueListBox(new Renderer() { - @Override - public String render(GrouperType grouperType) { - if (grouperType == null) { - return ""; - } - return grouperType.toString(); - } - - @Override - public void render(GrouperType grouperType, Appendable appendable) throws IOException { - appendable.append(render(grouperType)); - } - }); - grouperTypeListBox.setValue(GrouperType.Dimensions, false); - selectGroupByPanel.add(grouperTypeListBox); - - grouperTypeListBox.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - finishValueChangedHandling(); - } - }); - - return selectGroupByPanel; - } - - private ValueListBox createDimensionToGroupByBox() { - ValueListBox dimensionToGroupByBox = new ValueListBox( - new Renderer() { - @Override - public String render(DimensionIdentifier gpsFixDimension) { - if (gpsFixDimension == null) { - return ""; - } - return gpsFixDimension.toString(); - } - - @Override - public void render(DimensionIdentifier gpsFixDimension, Appendable appendable) - throws IOException { - appendable.append(render(gpsFixDimension)); - - } - }); - dimensionToGroupByBox.addValueChangeHandler(new ValueChangeHandler() { - private boolean firstChange = true; - - @Override - public void onValueChange(ValueChangeEvent event) { - if (firstChange && event.getValue() != null) { - ValueListBox newBox = createDimensionToGroupByBox(); - dimensionsToGroupByPanel.add(newBox); - dimensionsToGroupByBoxes.add(newBox); - firstChange = false; - } else if (event.getValue() == null) { - dimensionsToGroupByPanel.remove((Widget) event.getSource()); - dimensionsToGroupByBoxes.remove(event.getSource()); - } - finishValueChangedHandling(); - } - }); - dimensionToGroupByBox.setAcceptableValues(Arrays.asList(DimensionIdentifier.values())); - return dimensionToGroupByBox; - } - - protected abstract void finishValueChangedHandling(); - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/RefreshingSelectionTablesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/RefreshingSelectionTablesPanel.java deleted file mode 100644 index 49c8cfd37b7..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/RefreshingSelectionTablesPanel.java +++ /dev/null @@ -1,394 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import com.google.gwt.event.logical.shared.ResizeEvent; -import com.google.gwt.event.logical.shared.ResizeHandler; -import com.google.gwt.user.client.Timer; -import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.SimplePanel; -import com.google.gwt.user.client.ui.Widget; -import com.google.gwt.view.client.SelectionChangeEvent; -import com.google.gwt.view.client.SelectionChangeEvent.Handler; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sailing.domain.common.LegType; -import com.sap.sailing.domain.common.TrackedRaceStatusEnum; -import com.sap.sailing.domain.common.dto.BoatClassDTO; -import com.sap.sailing.domain.common.dto.CompetitorDTO; -import com.sap.sailing.domain.common.dto.RaceDTO; -import com.sap.sailing.gwt.ui.client.ErrorReporter; -import com.sap.sailing.gwt.ui.client.SailingServiceAsync; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent; -import com.sap.sailing.gwt.ui.datamining.client.SelectionChangedListener; -import com.sap.sailing.gwt.ui.datamining.client.SelectionProvider; -import com.sap.sailing.gwt.ui.datamining.client.settings.RefreshingSelectionTablesSettings; -import com.sap.sailing.gwt.ui.datamining.client.settings.RefreshingSelectionTablesSettingsDialogComponent; -import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsDTO; -import com.sap.sailing.gwt.ui.shared.RegattaDTO; - -public class RefreshingSelectionTablesPanel implements SelectionProvider { - - private static final int resizeDelay = 100; - private static final double relativeWidthInPercent = 1; - private static final int widthMargin = 17; - private static final double relativeHeightInPercent = 0.35; - - private StringMessages stringMessages; - private SailingServiceAsync sailingService; - private ErrorReporter errorReporter; - - private SimplePanel entryWidget; - - private RefreshingSelectionTablesSettings settings; - private Timer timer; - private Map> tablesMappedByDimension; - private Set listeners; - - public RefreshingSelectionTablesPanel(StringMessages stringMessages, SailingServiceAsync sailingService, ErrorReporter errorReporter) { - this.stringMessages = stringMessages; - this.sailingService = sailingService; - this.errorReporter = errorReporter; - settings = new RefreshingSelectionTablesSettings(); - listeners = new HashSet(); - - tablesMappedByDimension = new HashMap>(); - entryWidget = new SimplePanel(); - entryWidget.setWidget(createTables()); - - timer = new Timer() { - @Override - public void run() { - updateTables(); - } - }; - - Window.addResizeHandler(new ResizeHandler() { - private final Timer timer = new Timer() { - @Override - public void run() { - doLayout(Window.getClientWidth(), Window.getClientHeight()); - } - }; - @Override - public void onResize(ResizeEvent event) { - timer.schedule(resizeDelay); - } - }); - - updateTables(); - doLayout(Window.getClientWidth(), Window.getClientHeight()); - } - - private void doLayout(int newWindowWidth, int newWindowHeight) { - int absoluteWidth = (int) ((newWindowWidth - widthMargin) * relativeWidthInPercent); - int absoluteHeight = (int) (newWindowHeight * relativeHeightInPercent); - - entryWidget.setWidth(absoluteWidth + "px"); - entryWidget.setHeight(absoluteHeight + "px"); - - Collection> tables = tablesMappedByDimension.values(); - for (SelectionTable table : tables) { - table.setWidth((absoluteWidth / tables.size()) + "px"); - table.setHeight(absoluteHeight + "px"); - } - } - - @Override - public void addSelectionChangedListener(SelectionChangedListener listener) { - listeners.add(listener); - for (SelectionTable table : tablesMappedByDimension.values()) { - table.addSelectionChangeHandler(new Handler() { - @Override - public void onSelectionChange(SelectionChangeEvent event) { - notifySelectionChanged(); - } - }); - } - } - - private void notifySelectionChanged() { - for (SelectionChangedListener listener : listeners) { - listener.selectionChanged(); - } - } - - @Override - public Map> getSelection() { - Map> selection = new HashMap>(); - for (SelectionTable table : tablesMappedByDimension.values()) { - Collection specificSelection = table.getSelectionAsValues(); - if (!specificSelection.isEmpty()) { - selection.put(table.getDimension(), specificSelection); - } - } - return selection; - } - - @Override - public void applySelection(QueryDefinition queryDefinition) { - for (Entry> selectionEntry : queryDefinition.getSelection().entrySet()) { - SelectionTable selectionTable = tablesMappedByDimension.get(selectionEntry.getKey()); - selectionTable.setSelection((Iterable) selectionEntry.getValue()); - } - } - - @Override - public void clearSelection() { - for (SelectionTable table : tablesMappedByDimension.values()) { - table.clearSelection(); - } - } - - @SuppressWarnings("unchecked") //You can't use instanceof for generic type parameters - private SelectionTable getTable(DimensionIdentifier dimension) { - try { - return (SelectionTable) tablesMappedByDimension.get(dimension); - } catch (ClassCastException e) { - return null; - } - } - - @Override - public String getLocalizedShortName() { - return stringMessages.selectionTables(); - } - - @Override - public Widget getEntryWidget() { - return entryWidget; - } - - @Override - public boolean isVisible() { - return entryWidget.isVisible(); - } - - @Override - public void setVisible(boolean visibility) { - entryWidget.setVisible(visibility); - } - - @Override - public boolean hasSettings() { - return true; - } - - @Override - public SettingsDialogComponent getSettingsDialogComponent() { - return new RefreshingSelectionTablesSettingsDialogComponent(settings, stringMessages); - } - - @Override - public void updateSettings(RefreshingSelectionTablesSettings newSettings) { - if (settings.isRefreshAutomatically() != newSettings.isRefreshAutomatically()) { - if (newSettings.isRefreshAutomatically()) { - updateTables(); - } else { - timer.cancel(); - } - } - - if (settings.getRefreshIntervalInMilliseconds() != newSettings.getRefreshIntervalInMilliseconds()) { - if (newSettings.isRefreshAutomatically()) { - timer.cancel(); - timer.schedule(newSettings.getRefreshIntervalInMilliseconds()); - } - } - - settings = newSettings; - } - - private void updateTables() { - sailingService.getRegattas(new AsyncCallback>() { - @Override - public void onFailure(Throwable caught) { - errorReporter.reportError("Error fetching the regattas from the server: " + caught.getMessage()); - } - - @Override - public void onSuccess(List regattas) { - boolean tableContentChanged = false; - Map> content = extractContent(regattas); - for (Entry> contentEntry : content.entrySet()) { - boolean currentTableContentChanged = getTable(contentEntry.getKey()).updateContent(contentEntry.getValue()); - if (!tableContentChanged) { - tableContentChanged = currentTableContentChanged; - } - } - - if (settings.isRerunQueryAfterRefresh() && tableContentChanged) { - notifySelectionChanged(); - // TODO query is executed, before the data is ready to be analyzed - } - if (settings.isRefreshAutomatically()) { - timer.schedule(settings.getRefreshIntervalInMilliseconds()); - } - } - }); - } - - private Map> extractContent(Collection regattas) { - Map> content = new HashMap>(); - - Set regattasWithData = new HashSet(); - Set boatClasses = new HashSet(); - Set races = new HashSet(); - Set competitors = new HashSet(); - Set nationalities = new HashSet(); - for (RegattaDTO regatta : regattas) { - if (regattaContainsData(regatta)) { - regattasWithData.add(regatta); - boatClasses.add(regatta.boatClass); - for (RaceWithCompetitorsDTO race : regatta.races) { - if (race != null) { - races.add(race); - for (CompetitorDTO competitor : race.competitors) { - if (competitor != null) { - competitors.add(competitor); - nationalities.add(competitor.getThreeLetterIocCountryCode()); - } - } - } - } - } - } - - List sortedRegattas = new ArrayList(regattasWithData); - Collections.sort(sortedRegattas, new Comparator() { - @Override - public int compare(RegattaDTO o1, RegattaDTO o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - - List sortedBoatClasses = new ArrayList(boatClasses); - Collections.sort(sortedBoatClasses, new Comparator() { - @Override - public int compare(BoatClassDTO o1, BoatClassDTO o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - - List sortedRaces = new ArrayList(races); - Collections.sort(sortedRaces, new Comparator() { - @Override - public int compare(RaceDTO o1, RaceDTO o2) { - return o1.getName().compareTo(o2.getName()); - } - }); - - content.put(DimensionIdentifier.RegattaName, sortedRegattas); - content.put(DimensionIdentifier.BoatClassName, sortedBoatClasses); - content.put(DimensionIdentifier.RaceName, sortedRaces); - content.put(DimensionIdentifier.LegNumber, Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); - content.put(DimensionIdentifier.LegType, Arrays.asList(LegType.values())); - content.put(DimensionIdentifier.CompetitorName, competitors); - content.put(DimensionIdentifier.SailID, competitors); - content.put(DimensionIdentifier.Nationality, nationalities); - - return content; - } - - private boolean regattaContainsData(RegattaDTO regatta) { - if (regatta != null) { - for (RaceDTO race : regatta.races) { - if (race.isTracked || race.status.status == TrackedRaceStatusEnum.FINISHED) { - return true; - } - } - } - return false; - } - - private Widget createTables() { - HorizontalPanel tablesPanel = new HorizontalPanel(); - tablesMappedByDimension = new HashMap>(); - - SelectionTable regattaNameTable = new SelectionTable(stringMessages - .regatta(), DimensionIdentifier.RegattaName) { - @Override - public String getValue(RegattaDTO regatta) { - return regatta.getName(); - } - }; - tablesPanel.add(regattaNameTable); - tablesMappedByDimension.put(regattaNameTable.getDimension(), regattaNameTable); - - SelectionTable boatClassTable = new SelectionTable(stringMessages - .boatClass(), DimensionIdentifier.BoatClassName) { - @Override - public String getValue(BoatClassDTO boatClass) { - return boatClass.getName(); - } - }; - tablesPanel.add(boatClassTable); - tablesMappedByDimension.put(boatClassTable.getDimension(), boatClassTable); - - SelectionTable raceNameTable = new SelectionTable(stringMessages.race(), - DimensionIdentifier.RaceName) { - @Override - public String getValue(RaceDTO race) { - return race.getName(); - } - }; - tablesPanel.add(raceNameTable); - tablesMappedByDimension.put(raceNameTable.getDimension(), raceNameTable); - - SelectionTable legTypeTable = new SimpleSelectionTable(stringMessages.legType(), - DimensionIdentifier.LegType); - tablesPanel.add(legTypeTable); - tablesMappedByDimension.put(legTypeTable.getDimension(), legTypeTable); - - SelectionTable legNumberTable = new SimpleSelectionTable(stringMessages.legLabel(), - DimensionIdentifier.LegNumber); - tablesPanel.add(legNumberTable); - tablesMappedByDimension.put(legNumberTable.getDimension(), legNumberTable); - - SelectionTable nationalityTable = new SimpleSelectionTable(stringMessages - .nationality(), DimensionIdentifier.Nationality); - tablesPanel.add(nationalityTable); - tablesMappedByDimension.put(nationalityTable.getDimension(), nationalityTable); - - SelectionTable competitorNameTable = new SelectionTable(stringMessages - .competitor(), DimensionIdentifier.CompetitorName) { - @Override - public String getValue(CompetitorDTO competitor) { - return competitor.getName(); - } - }; - tablesPanel.add(competitorNameTable); - tablesMappedByDimension.put(competitorNameTable.getDimension(), competitorNameTable); - - SelectionTable competitorSailIDTable = new SelectionTable(stringMessages - .sailID(), DimensionIdentifier.SailID) { - @Override - public String getValue(CompetitorDTO competitor) { - return competitor.getSailID(); - } - }; - tablesPanel.add(competitorSailIDTable); - tablesMappedByDimension.put(competitorSailIDTable.getDimension(), competitorSailIDTable); - - return tablesPanel; - } - - @Override - public String getDependentCssClassName() { - return "refreshingSelectionTables"; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/RestrictedGroupingProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/RestrictedGroupingProvider.java deleted file mode 100644 index ff439446d21..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/RestrictedGroupingProvider.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import com.google.gwt.event.logical.shared.ValueChangeEvent; -import com.google.gwt.event.logical.shared.ValueChangeHandler; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.ValueListBox; -import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.datamining.shared.DimensionIdentifier.OrdinalComparator; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent; -import com.sap.sailing.gwt.ui.client.shared.components.SimpleValueListBox; -import com.sap.sailing.gwt.ui.datamining.client.GroupingChangedListener; -import com.sap.sailing.gwt.ui.datamining.client.GroupingProvider; -import com.sap.sse.datamining.shared.components.GrouperType; - -public class RestrictedGroupingProvider implements GroupingProvider { - - private static final OrdinalComparator dimensionComparator = new DimensionIdentifier.OrdinalComparator(); - - private final StringMessages stringMessages; - private final Set listeners; - - private final HorizontalPanel mainPanel; - private final List> dimensionToGroupByBoxes; - - public RestrictedGroupingProvider(StringMessages stringMessages) { - this.stringMessages = stringMessages; - listeners = new HashSet(); - dimensionToGroupByBoxes = new ArrayList>(); - - mainPanel = new HorizontalPanel(); - mainPanel.setSpacing(5); - mainPanel.add(new Label(this.stringMessages.groupBy() + ":")); - mainPanel.add(createDimensionToGroupByBox()); - } - - private ValueListBox createDimensionToGroupByBox() { - ValueListBox dimensionToGroupByBox = new SimpleValueListBox(); - dimensionToGroupByBoxes.add(dimensionToGroupByBox); - dimensionToGroupByBox.addValueChangeHandler(new ValueChangeHandler() { - private boolean firstChange = true; - - @Override - public void onValueChange(ValueChangeEvent event) { - if (firstChange && event.getValue() != null) { - ValueListBox newBox = createDimensionToGroupByBox(); - mainPanel.add(newBox); - dimensionToGroupByBoxes.add(newBox); - firstChange = false; - } else if (event.getValue() == null) { - mainPanel.remove((Widget) event.getSource()); - dimensionToGroupByBoxes.remove(event.getSource()); - updateAcceptableValues(); - } - notifyListeners(); - } - }); - updateAcceptableValues(); - return dimensionToGroupByBox; - } - - private void updateAcceptableValues() { - for (ValueListBox dimensionToGroupByBox : dimensionToGroupByBoxes) { - List acceptableValues = new ArrayList(Arrays.asList(DimensionIdentifier.values())); - acceptableValues.removeAll(getDimensionsToGroupBy()); - if (dimensionToGroupByBox.getValue() != null) { - acceptableValues.add(dimensionToGroupByBox.getValue()); - } - Collections.sort(acceptableValues, dimensionComparator); - acceptableValues.add(null); - dimensionToGroupByBox.setAcceptableValues(acceptableValues); - } - } - - @Override - public GrouperType getGrouperType() { - return GrouperType.Dimensions; - } - - @Override - public Collection getDimensionsToGroupBy() { - Collection dimensionsToGroupBy = new ArrayList(); - for (ValueListBox dimensionListBox : dimensionToGroupByBoxes) { - if (dimensionListBox.getValue() != null) { - dimensionsToGroupBy.add(dimensionListBox.getValue()); - } - } - return dimensionsToGroupBy; - } - - @Override - public String getCustomGrouperScriptText() { - return ""; - } - - @Override - public void applyQueryDefinition(QueryDefinition queryDefinition) { - if (queryDefinition.getGrouperType() == GrouperType.Dimensions) { - int index = 0; - for (DimensionIdentifier dimension : queryDefinition.getDimensionsToGroupBy()) { - dimensionToGroupByBoxes.get(index).setValue(dimension, true); - index++; - } - } - } - - @Override - public void addGroupingChangedListener(GroupingChangedListener listener) { - listeners.add(listener); - } - - private void notifyListeners() { - for (GroupingChangedListener listener : listeners) { - listener.groupingChanged(); - } - } - - @Override - public String getLocalizedShortName() { - return stringMessages.groupingProvider(); - } - - @Override - public Widget getEntryWidget() { - return mainPanel; - } - - @Override - public boolean isVisible() { - return mainPanel.isVisible(); - } - - @Override - public void setVisible(boolean visibility) { - mainPanel.setVisible(visibility); - } - - @Override - public boolean hasSettings() { - return false; - } - - @Override - public SettingsDialogComponent getSettingsDialogComponent() { - return null; - } - - @Override - public void updateSettings(Object newSettings) { } - - @Override - public String getDependentCssClassName() { - return "restrictedGroupingProvider"; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SimpleSelectionTable.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SimpleSelectionTable.java deleted file mode 100644 index 00d081eb5e8..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SimpleSelectionTable.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; - -import com.sap.sailing.datamining.shared.DimensionIdentifier; - -public class SimpleSelectionTable extends SelectionTable { - - public SimpleSelectionTable(String title, DimensionIdentifier dimension) { - super(title, dimension); - } - - @Override - public ContentType getValue(ContentType content) { - return content; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SimpleStatistic.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SimpleStatistic.java deleted file mode 100644 index 52eddd8fc7c..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SimpleStatistic.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; - -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.StatisticType; -import com.sap.sse.datamining.shared.components.AggregatorType; - -public class SimpleStatistic { - - private DataTypes dataType; - private StatisticType statisticType; - private AggregatorType aggregatorType; - - public SimpleStatistic(DataTypes dataType, StatisticType statisticType, AggregatorType aggregatorType) { - this.dataType = dataType; - this.statisticType = statisticType; - this.aggregatorType = aggregatorType; - } - - public DataTypes getDataType() { - return dataType; - } - - public StatisticType getStatisticType() { - return statisticType; - } - - public AggregatorType getAggregatorType() { - return aggregatorType; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SimpleStatisticsManager.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SimpleStatisticsManager.java deleted file mode 100644 index b701293c85c..00000000000 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SimpleStatisticsManager.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Set; - -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.StatisticType; -import com.sap.sailing.gwt.ui.datamining.client.StatisticsManager; -import com.sap.sse.datamining.shared.components.AggregatorType; - -public class SimpleStatisticsManager implements StatisticsManager { - - private HashMap statisticsMap; - - public SimpleStatisticsManager() { - statisticsMap = new HashMap(); - } - - @Override - public void addStatistic(ComplexStatistic statistic) { - statisticsMap.put(statistic.getBaseDataType(), statistic); - } - - @Override - public ComplexStatistic getStatistic(DataTypes dataType) { - return statisticsMap.get(dataType); - } - - @Override - public Collection getAllStatistics() { - return statisticsMap.values(); - } - - @Override - public Set getRegisteredBaseDataTypes() { - return statisticsMap.keySet(); - } - - public static StatisticsManager createManagerWithStandardStatistics() { - StatisticsManager manager = new SimpleStatisticsManager(); - - manager.addStatistic(new ComplexStatistic(DataTypes.GPSFix, - Arrays.asList(StatisticType.Speed), - Arrays.asList(AggregatorType.Average))); - manager.addStatistic(new ComplexStatistic(DataTypes.TrackedLegOfCompetitor, - Arrays.asList(StatisticType.Distance), - Arrays.asList(AggregatorType.Average, AggregatorType.Sum))); - - return manager; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/execution/SimpleQueryRunner.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/execution/SimpleQueryRunner.java similarity index 86% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/execution/SimpleQueryRunner.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/execution/SimpleQueryRunner.java index 0c29aac00f3..ab79e4b2262 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/execution/SimpleQueryRunner.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/execution/SimpleQueryRunner.java @@ -1,20 +1,20 @@ -package com.sap.sailing.gwt.ui.datamining.client.execution; +package com.sap.sailing.gwt.ui.datamining.execution; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.datamining.shared.QueryDefinition; import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent; -import com.sap.sailing.gwt.ui.datamining.client.DataMiningServiceAsync; -import com.sap.sailing.gwt.ui.datamining.client.QueryDefinitionProvider; -import com.sap.sailing.gwt.ui.datamining.client.QueryRunner; -import com.sap.sailing.gwt.ui.datamining.client.ResultsPresenter; -import com.sap.sailing.gwt.ui.datamining.client.settings.QueryRunnerSettings; -import com.sap.sailing.gwt.ui.datamining.client.settings.QueryRunnerSettingsDialogComponent; +import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync; +import com.sap.sailing.gwt.ui.datamining.QueryDefinitionProvider; +import com.sap.sailing.gwt.ui.datamining.QueryRunner; +import com.sap.sailing.gwt.ui.datamining.ResultsPresenter; +import com.sap.sailing.gwt.ui.datamining.settings.QueryRunnerSettings; +import com.sap.sailing.gwt.ui.datamining.settings.QueryRunnerSettingsDialogComponent; +import com.sap.sse.datamining.shared.QueryDefinition; import com.sap.sse.datamining.shared.QueryResult; public class SimpleQueryRunner implements QueryRunner { @@ -57,7 +57,6 @@ public class SimpleQueryRunner implements QueryRunner { public void run(QueryDefinition queryDefinition) { Iterable errorMessages = queryDefinitionProvider.validateQueryDefinition(queryDefinition); if (errorMessages == null || !errorMessages.iterator().hasNext()) { -// queryStatusLabel.setText(" | " + stringMessages.running()); dataMiningService.runQuery(queryDefinition, new AsyncCallback>() { @Override public void onFailure(Throwable caught) { @@ -67,7 +66,6 @@ public class SimpleQueryRunner implements QueryRunner { @Override public void onSuccess(QueryResult result) { -// queryStatusLabel.setText(" | " + stringMessages.done()); resultsPresenter.showResult(result); } }); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/BenchmarkResult.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/BenchmarkResult.java similarity index 59% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/BenchmarkResult.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/BenchmarkResult.java index 2a6e2b92284..bafe4953498 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/BenchmarkResult.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/BenchmarkResult.java @@ -1,15 +1,15 @@ -package com.sap.sailing.gwt.ui.datamining.client.presentation; +package com.sap.sailing.gwt.ui.datamining.presentation; public class BenchmarkResult { private String identifier; - private int numberOfGPSFixes; + private int dataAmount; private double serverTime; private double overallTime; - public BenchmarkResult(String identifier, int numberOfGPSFixes, double serverTime, double overallTime) { + public BenchmarkResult(String identifier, int dataAmount, double serverTime, double overallTime) { this.identifier = identifier; - this.numberOfGPSFixes = numberOfGPSFixes; + this.dataAmount = dataAmount; this.serverTime = serverTime; this.overallTime = overallTime; } @@ -18,8 +18,8 @@ public class BenchmarkResult { return identifier; } - public int getNumberOfGPSFixes() { - return numberOfGPSFixes; + public int getDataAmount() { + return dataAmount; } public double getServerTime() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/BenchmarkResultsChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/BenchmarkResultsChart.java similarity index 96% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/BenchmarkResultsChart.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/BenchmarkResultsChart.java index 3015a8ed1da..2bed43d9120 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/BenchmarkResultsChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/BenchmarkResultsChart.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client.presentation; +package com.sap.sailing.gwt.ui.datamining.presentation; import java.util.ArrayList; import java.util.Collections; @@ -72,7 +72,7 @@ public class BenchmarkResultsChart extends SimplePanel implements RequiresResize double averageOverallTime = getAverage(cleanedOverallTimePoints); //This method has to be called, before the points are added to the chart. - updateChartSubtitle(results.get(0).getNumberOfGPSFixes(), averageServerTime, averageOverallTime); + updateChartSubtitle(results.get(0).getDataAmount(), averageServerTime, averageOverallTime); serverTimeSeries.setPoints(serverTimePoints.toArray(new Point[serverTimePoints.size()])); cleanedServerTimeSeries.setPoints(cleanedServerTimePoints); cleanedServerTimeSeries.setName(stringMessages.cleanedServerTime() + "(" + (serverTimePoints.size() - cleanedServerTimePoints.length) + ")"); @@ -149,9 +149,9 @@ public class BenchmarkResultsChart extends SimplePanel implements RequiresResize } } - private void updateChartSubtitle(int numberOfGPSFixes, double averageServerTime, double averageOverallTime) { + private void updateChartSubtitle(int dataAmount, double averageServerTime, double averageOverallTime) { StringBuilder subtitelBuilder = new StringBuilder(); - subtitelBuilder.append(stringMessages.numberOfGPSFixes() + ": " + numberOfGPSFixes); + subtitelBuilder.append(stringMessages.dataAmount() + ": " + dataAmount); subtitelBuilder.append(" - " + stringMessages.averageCleanedServerTime() + ": " + averageServerTime + "s"); subtitelBuilder.append(" - " + stringMessages.averageCleanedOverallTime() + ": " + averageOverallTime + "s"); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/BenchmarkResultsPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/BenchmarkResultsPanel.java similarity index 93% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/BenchmarkResultsPanel.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/BenchmarkResultsPanel.java index 977d96647c7..384a3231789 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/BenchmarkResultsPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/BenchmarkResultsPanel.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client.presentation; +package com.sap.sailing.gwt.ui.datamining.presentation; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; @@ -10,8 +10,8 @@ import com.google.gwt.user.client.ui.IntegerBox; import com.google.gwt.user.client.ui.Label; import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.datamining.client.DataMiningServiceAsync; -import com.sap.sailing.gwt.ui.datamining.client.QueryDefinitionProvider; +import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync; +import com.sap.sailing.gwt.ui.datamining.QueryDefinitionProvider; import com.sap.sse.datamining.shared.QueryResult; public class BenchmarkResultsPanel extends FlowPanel { @@ -68,7 +68,7 @@ public class BenchmarkResultsPanel extends FlowPanel { private void updateResults(final ClientBenchmarkData benchmarkData, double overallTimeInSeconds, QueryResult result) { resultsChart.addResult(new BenchmarkResult(stringMessages.runAsSubstantive() + " " + benchmarkData.getCurrentRun(), - result.getFilteredDataAmount(), result.getCalculationTimeInSeconds(), overallTimeInSeconds)); + result.getRetrievedDataAmount(), result.getCalculationTimeInSeconds(), overallTimeInSeconds)); if (benchmarkData.isFinished()) { benchmarkStatusLabel.setText(" | " + stringMessages.done()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/ClientBenchmarkData.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/ClientBenchmarkData.java similarity index 88% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/ClientBenchmarkData.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/ClientBenchmarkData.java index 538550a34b7..17a86fa96b0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/ClientBenchmarkData.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/ClientBenchmarkData.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client.presentation; +package com.sap.sailing.gwt.ui.datamining.presentation; public class ClientBenchmarkData { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/PlainResultsPresenter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/PlainResultsPresenter.java new file mode 100644 index 00000000000..38973427d32 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/PlainResultsPresenter.java @@ -0,0 +1,65 @@ +package com.sap.sailing.gwt.ui.datamining.presentation; + +import java.util.Map.Entry; + +import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.SimplePanel; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.datamining.ResultsPresenter; +import com.sap.sse.datamining.shared.GroupKey; +import com.sap.sse.datamining.shared.QueryResult; + +public class PlainResultsPresenter implements ResultsPresenter { + + private final StringMessages stringMessages; + + private final SimplePanel mainPanel; + private final HTML resultsLabel; + + public PlainResultsPresenter(StringMessages stringMessages) { + this.stringMessages = stringMessages; + + mainPanel = new SimplePanel(); + resultsLabel = new HTML(); + mainPanel.setWidget(resultsLabel); + } + + @Override + public void showResult(QueryResult result) { + StringBuilder resultsBuilder = new StringBuilder("" + result.getResultSignifier() + ""); + resultsBuilder.append(stringMessages.queryResultsChartSubtitle(result.getRetrievedDataAmount(), result.getCalculationTimeInSeconds())); + + resultsBuilder.append("
    "); + for (Entry resultEntry : result.getResults().entrySet()) { + resultsBuilder.append("
  • "); + resultsBuilder.append("" + resultEntry.getKey().toString() + ": "); + resultsBuilder.append(resultEntry.getValue().doubleValue()); + resultsBuilder.append("
  • "); + } + resultsBuilder.append("
"); + + resultsLabel.setHTML(resultsBuilder.toString()); + } + + @Override + public void showError(String error) { + resultsLabel.setHTML(error); + } + + @Override + public void showError(String mainError, Iterable detailedErrors) { + StringBuilder errorBuilder = new StringBuilder(mainError + ":
    "); + for (String detailedError : detailedErrors) { + errorBuilder.append("
  • " + detailedError + "
  • "); + } + errorBuilder.append("
"); + showError(errorBuilder.toString()); + } + + @Override + public Widget getWidget() { + return mainPanel; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/ResultsChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/ResultsChart.java similarity index 95% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/ResultsChart.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/ResultsChart.java index 6e135714135..b5648c8a34b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/presentation/ResultsChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/presentation/ResultsChart.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client.presentation; +package com.sap.sailing.gwt.ui.datamining.presentation; import java.util.ArrayList; import java.util.Collection; @@ -26,8 +26,8 @@ import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.shared.panels.ResizingSimplePanel; -import com.sap.sailing.gwt.ui.datamining.client.ResultsPresenter; -import com.sap.sailing.gwt.ui.datamining.client.UnitFormatter; +import com.sap.sailing.gwt.ui.datamining.ResultsPresenter; +import com.sap.sailing.gwt.ui.datamining.UnitFormatter; import com.sap.sse.datamining.shared.GroupKey; import com.sap.sse.datamining.shared.QueryResult; @@ -59,7 +59,7 @@ public class ResultsChart implements ResultsPresenter { errorLabel.setStyleName("chart-importantMessage"); createChart(); - mainPanel.setWidget(chart); + showError(this.stringMessages.invalidSelection()); } @Override @@ -140,11 +140,10 @@ public class ResultsChart implements ResultsPresenter { private void updateChartSubtitleAndSetChartAsWidget(QueryResult result) { chart.setChartSubtitle(new ChartSubtitle().setText(stringMessages.queryResultsChartSubtitle( - result.getRetrievedDataAmount(), result.getFilteredDataAmount(), result.getCalculationTimeInSeconds()))); + result.getRetrievedDataAmount(), result.getCalculationTimeInSeconds()))); // This is needed, so that the subtitle is updated. Otherwise the text would stay empty mainPanel.setWidget(null); mainPanel.setWidget(chart); - } public List getSortedKeysFrom(QueryResult result) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/AbstractQueryDefinitionProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/AbstractQueryDefinitionProvider.java similarity index 70% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/AbstractQueryDefinitionProvider.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/AbstractQueryDefinitionProvider.java index 3d39d762474..51307ed3883 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/AbstractQueryDefinitionProvider.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/AbstractQueryDefinitionProvider.java @@ -1,32 +1,34 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; +package com.sap.sailing.gwt.ui.datamining.selection; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Set; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.datamining.shared.QueryDefinition; import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.datamining.client.QueryDefinitionChangedListener; -import com.sap.sailing.gwt.ui.datamining.client.QueryDefinitionProvider; -import com.sap.sse.datamining.shared.components.GrouperType; +import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync; +import com.sap.sailing.gwt.ui.datamining.QueryDefinitionChangedListener; +import com.sap.sailing.gwt.ui.datamining.QueryDefinitionProvider; +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.dto.FunctionDTO; public abstract class AbstractQueryDefinitionProvider implements QueryDefinitionProvider { private final StringMessages stringMessages; private final SailingServiceAsync sailingService; + private final DataMiningServiceAsync dataMiningService; private final ErrorReporter errorReporter; private boolean blockChangeNotification; private final Set listeners; public AbstractQueryDefinitionProvider(StringMessages stringMessages, SailingServiceAsync sailingService, - ErrorReporter errorReporter) { + DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter) { this.stringMessages = stringMessages; this.sailingService = sailingService; + this.dataMiningService = dataMiningService; this.errorReporter = errorReporter; blockChangeNotification = false; @@ -52,28 +54,16 @@ public abstract class AbstractQueryDefinitionProvider implements QueryDefinition } private String validateGrouper(QueryDefinition queryDefinition) { - GrouperType grouper = queryDefinition.getGrouperType(); - if (grouper == null) { - return stringMessages.noGrouperSelectedError(); - } - - ValidateGrouper: switch (grouper) { - case Dimensions: - for (DimensionIdentifier dimension : queryDefinition.getDimensionsToGroupBy()) { - if (dimension != null) { - break ValidateGrouper; - } + for (FunctionDTO dimension : queryDefinition.getDimensionsToGroupBy()) { + if (dimension != null) { + return null; } - return stringMessages.noDimensionToGroupBySelectedError(); - default: - return stringMessages.noGrouperSelectedError(); } - - return null; + return stringMessages.noDimensionToGroupBySelectedError(); } private String validateStatisticAndAggregator(QueryDefinition queryDefinition) { - return queryDefinition.getStatisticType() == null || queryDefinition.getAggregatorType() == null ? stringMessages.noStatisticSelectedError() : null; + return queryDefinition.getStatisticToCalculate() == null || queryDefinition.getAggregatorType() == null ? stringMessages.noStatisticSelectedError() : null; } @Override @@ -106,6 +96,10 @@ public abstract class AbstractQueryDefinitionProvider implements QueryDefinition protected SailingServiceAsync getSailingService() { return sailingService; } + + protected DataMiningServiceAsync getDataMiningService() { + return dataMiningService; + } protected ErrorReporter getErrorReporter() { return errorReporter; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/MultiDimensionalGroupingProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/MultiDimensionalGroupingProvider.java new file mode 100644 index 00000000000..f9088cb61fd --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/MultiDimensionalGroupingProvider.java @@ -0,0 +1,240 @@ +package com.sap.sailing.gwt.ui.datamining.selection; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import com.google.gwt.event.logical.shared.ValueChangeEvent; +import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.i18n.client.LocaleInfo; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.ValueListBox; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.client.ErrorReporter; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.client.shared.components.AbstractObjectRenderer; +import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent; +import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync; +import com.sap.sailing.gwt.ui.datamining.GroupingChangedListener; +import com.sap.sailing.gwt.ui.datamining.GroupingProvider; +import com.sap.sailing.gwt.ui.datamining.StatisticChangedListener; +import com.sap.sailing.gwt.ui.datamining.StatisticProvider; +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.components.AggregatorType; +import com.sap.sse.datamining.shared.components.GrouperType; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + +public class MultiDimensionalGroupingProvider implements GroupingProvider, StatisticChangedListener { + + private final StringMessages stringMessages; + private final DataMiningServiceAsync dataMiningService; + private final ErrorReporter errorReporter; + private final Set listeners; + + private final HorizontalPanel mainPanel; + private final List> dimensionToGroupByBoxes; + + private FunctionDTO currentStatisticToCalculate; + private List availableDimensions; + + public MultiDimensionalGroupingProvider(StringMessages stringMessages, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter, + StatisticProvider statisticProvider) { + this.stringMessages = stringMessages; + this.dataMiningService = dataMiningService; + this.errorReporter = errorReporter; + listeners = new HashSet(); + currentStatisticToCalculate = null; + availableDimensions = new ArrayList<>(); + dimensionToGroupByBoxes = new ArrayList>(); + + mainPanel = new HorizontalPanel(); + mainPanel.setSpacing(5); + mainPanel.add(new Label(this.stringMessages.groupBy() + ":")); + + ValueListBox firstDimensionToGroupByBox = createDimensionToGroupByBox(); + addDimensionToGroupByBoxAndUpdateAcceptableValues(firstDimensionToGroupByBox); + statisticProvider.addStatisticChangedListener(this); + } + + @Override + public void statisticChanged(FunctionDTO newStatisticToCalculate, AggregatorType newAggregatorType) { + if (!Objects.equals(currentStatisticToCalculate, newStatisticToCalculate)) { + currentStatisticToCalculate = newStatisticToCalculate; + updateAvailableDimensionsFor(); + } + } + + private void updateAvailableDimensionsFor() { + if (currentStatisticToCalculate != null) { + dataMiningService.getDimensionsFor(currentStatisticToCalculate, LocaleInfo.getCurrentLocale() + .getLocaleName(), new AsyncCallback>() { + @Override + public void onSuccess(Collection dimensions) { + clearAvailableDimensionsAndGroupByBoxes(); + availableDimensions.addAll(dimensions); + Collections.sort(availableDimensions); + ValueListBox firstDimensionToGroupByBox = createDimensionToGroupByBox(); + addDimensionToGroupByBoxAndUpdateAcceptableValues(firstDimensionToGroupByBox); + if (!availableDimensions.isEmpty()) { + firstDimensionToGroupByBox.setValue(availableDimensions.iterator().next(), true); + } + } + + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error fetching the dimensions from the server: " + caught.getMessage()); + } + }); + } else { + clearAvailableDimensionsAndGroupByBoxes(); + ValueListBox firstDimensionToGroupByBox = createDimensionToGroupByBox(); + addDimensionToGroupByBoxAndUpdateAcceptableValues(firstDimensionToGroupByBox); + } + } + + private void clearAvailableDimensionsAndGroupByBoxes() { + for (ValueListBox dimensionToGroupByBox : dimensionToGroupByBoxes) { + mainPanel.remove(dimensionToGroupByBox); + } + dimensionToGroupByBoxes.clear(); + availableDimensions.clear(); + } + + private ValueListBox createDimensionToGroupByBox() { + ValueListBox dimensionToGroupByBox = new ValueListBox(new AbstractObjectRenderer() { + @Override + protected String convertObjectToString(FunctionDTO function) { + return function.getDisplayName(); + } + + }); + dimensionToGroupByBox.addValueChangeHandler(new ValueChangeHandler() { + private boolean firstChange = true; + + @Override + public void onValueChange(ValueChangeEvent event) { + if (firstChange && event.getValue() != null) { + ValueListBox newDimensionToGroupByBox = createDimensionToGroupByBox(); + addDimensionToGroupByBox(newDimensionToGroupByBox); + firstChange = false; + } else if (event.getValue() == null) { + Widget changedDimensionToGroupByBox = (Widget) event.getSource(); + mainPanel.remove(changedDimensionToGroupByBox); + dimensionToGroupByBoxes.remove(changedDimensionToGroupByBox); + } + updateAcceptableValues(); + notifyListeners(); + } + }); + return dimensionToGroupByBox; + } + + private void addDimensionToGroupByBoxAndUpdateAcceptableValues(ValueListBox dimensionToGroupByBox) { + addDimensionToGroupByBox(dimensionToGroupByBox); + updateAcceptableValues(); + } + + private void addDimensionToGroupByBox(ValueListBox dimensionToGroupByBox) { + mainPanel.add(dimensionToGroupByBox); + dimensionToGroupByBoxes.add(dimensionToGroupByBox); + } + + private void updateAcceptableValues() { + for (ValueListBox dimensionToGroupByBox : dimensionToGroupByBoxes) { + List acceptableValues = new ArrayList(availableDimensions); + acceptableValues.removeAll(getDimensionsToGroupBy()); + if (dimensionToGroupByBox.getValue() != null) { + acceptableValues.add(dimensionToGroupByBox.getValue()); + } + Collections.sort(acceptableValues); + acceptableValues.add(null); + dimensionToGroupByBox.setAcceptableValues(acceptableValues); + } + } + + @Override + public GrouperType getGrouperType() { + return GrouperType.Dimensions; + } + + @Override + public Collection getDimensionsToGroupBy() { + Collection dimensionsToGroupBy = new ArrayList(); + for (ValueListBox dimensionListBox : dimensionToGroupByBoxes) { + if (dimensionListBox.getValue() != null) { + dimensionsToGroupBy.add(dimensionListBox.getValue()); + } + } + return dimensionsToGroupBy; + } + + @Override + public String getCustomGrouperScriptText() { + return ""; + } + + @Override + public void applyQueryDefinition(QueryDefinition queryDefinition) { + int index = 0; + for (FunctionDTO dimension : queryDefinition.getDimensionsToGroupBy()) { + dimensionToGroupByBoxes.get(index).setValue(dimension, true); + index++; + } + } + + @Override + public void addGroupingChangedListener(GroupingChangedListener listener) { + listeners.add(listener); + } + + private void notifyListeners() { + for (GroupingChangedListener listener : listeners) { + listener.groupingChanged(); + } + } + + @Override + public String getLocalizedShortName() { + return stringMessages.groupingProvider(); + } + + @Override + public Widget getEntryWidget() { + return mainPanel; + } + + @Override + public boolean isVisible() { + return mainPanel.isVisible(); + } + + @Override + public void setVisible(boolean visibility) { + mainPanel.setVisible(visibility); + } + + @Override + public boolean hasSettings() { + return false; + } + + @Override + public SettingsDialogComponent getSettingsDialogComponent() { + return null; + } + + @Override + public void updateSettings(Object newSettings) { } + + @Override + public String getDependentCssClassName() { + return "multiDimensionalGroupingProvider"; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/QueryDefinitionProviderWithControls.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/QueryDefinitionProviderWithControls.java similarity index 68% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/QueryDefinitionProviderWithControls.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/QueryDefinitionProviderWithControls.java index 100a8cf6aac..0f078a7bb37 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/QueryDefinitionProviderWithControls.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/QueryDefinitionProviderWithControls.java @@ -1,5 +1,6 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; +package com.sap.sailing.gwt.ui.datamining.selection; +import java.io.Serializable; import java.util.Collection; import java.util.Map.Entry; @@ -11,21 +12,22 @@ import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.Widget; -import com.sap.sailing.datamining.shared.DimensionIdentifier; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sailing.datamining.shared.impl.SimpleQueryDefinition; import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent; import com.sap.sailing.gwt.ui.client.shared.panels.ResizingFlowPanel; -import com.sap.sailing.gwt.ui.datamining.client.DataMiningControls; -import com.sap.sailing.gwt.ui.datamining.client.GroupingChangedListener; -import com.sap.sailing.gwt.ui.datamining.client.GroupingProvider; -import com.sap.sailing.gwt.ui.datamining.client.SelectionChangedListener; -import com.sap.sailing.gwt.ui.datamining.client.SelectionProvider; -import com.sap.sailing.gwt.ui.datamining.client.StatisticChangedListener; -import com.sap.sailing.gwt.ui.datamining.client.StatisticProvider; +import com.sap.sailing.gwt.ui.datamining.DataMiningControls; +import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync; +import com.sap.sailing.gwt.ui.datamining.GroupingChangedListener; +import com.sap.sailing.gwt.ui.datamining.SelectionChangedListener; +import com.sap.sailing.gwt.ui.datamining.SelectionProvider; +import com.sap.sailing.gwt.ui.datamining.StatisticChangedListener; +import com.sap.sailing.gwt.ui.datamining.StatisticProvider; +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.components.AggregatorType; +import com.sap.sse.datamining.shared.dto.FunctionDTO; +import com.sap.sse.datamining.shared.impl.QueryDefinitionImpl; public class QueryDefinitionProviderWithControls extends AbstractQueryDefinitionProvider implements DataMiningControls { @@ -36,10 +38,10 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition private StatisticProvider statisticProvider; - private GroupingProvider groupBySelectionPanel; + private MultiDimensionalGroupingProvider groupBySelectionPanel; - public QueryDefinitionProviderWithControls(StringMessages stringMessages, SailingServiceAsync sailingService, ErrorReporter errorReporter) { - super(stringMessages, sailingService, errorReporter); + public QueryDefinitionProviderWithControls(StringMessages stringMessages, SailingServiceAsync sailingService, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter) { + super(stringMessages, sailingService, dataMiningService, errorReporter); mainPanel = new ResizingFlowPanel() { @Override @@ -53,7 +55,7 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition mainPanel.add(createFunctionsPanel()); - selectionProvider = new RefreshingSelectionTablesPanel(stringMessages, sailingService, errorReporter); + selectionProvider = new RefreshingSelectionTablesPanel(stringMessages, dataMiningService, errorReporter, statisticProvider); selectionProvider.addSelectionChangedListener(new SelectionChangedListener() { @Override public void selectionChanged() { @@ -63,54 +65,21 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition mainPanel.add(selectionProvider.getEntryWidget()); } - - @Override - public QueryDefinition getQueryDefinition() { - SimpleQueryDefinition queryDTO = new SimpleQueryDefinition(LocaleInfo.getCurrentLocale().getLocaleName(), groupBySelectionPanel.getGrouperType(), - statisticProvider.getStatisticType(), statisticProvider.getAggregatorType(), - statisticProvider.getDataType()); - - switch (queryDTO.getGrouperType()) { - case Dimensions: - default: - for (DimensionIdentifier dimension : groupBySelectionPanel.getDimensionsToGroupBy()) { - queryDTO.appendDimensionToGroupBy(dimension); - } - break; - } - - for (Entry> selectionEntry : selectionProvider.getSelection().entrySet()) { - queryDTO.setSelectionFor(selectionEntry.getKey(), selectionEntry.getValue()); - } - - return queryDTO; - } - - @Override - public void applyQueryDefinition(QueryDefinition queryDefinition) { - setBlockChangeNotification(true); - selectionProvider.applySelection(queryDefinition); - groupBySelectionPanel.applyQueryDefinition(queryDefinition); - statisticProvider.applyQueryDefinition(queryDefinition); - setBlockChangeNotification(false); - - notifyQueryDefinitionChanged(); - } private Widget createFunctionsPanel() { HorizontalPanel functionsPanel = new HorizontalPanel(); functionsPanel.setSpacing(5); - statisticProvider = new ComplexStatisticProvider(getStringMessages(), SimpleStatisticsManager.createManagerWithStandardStatistics()); + statisticProvider = new SimpleStatisticProvider(getStringMessages(), getDataMiningService(), getErrorReporter()); statisticProvider.addStatisticChangedListener(new StatisticChangedListener() { @Override - public void statisticChanged(SimpleStatistic newStatistic) { + public void statisticChanged(FunctionDTO newStatisticToCalculate, AggregatorType newAggregatorType) { notifyQueryDefinitionChanged(); } }); functionsPanel.add(statisticProvider.getEntryWidget()); - groupBySelectionPanel = new RestrictedGroupingProvider(getStringMessages()); + groupBySelectionPanel = new MultiDimensionalGroupingProvider(getStringMessages(), getDataMiningService(), getErrorReporter(), statisticProvider); groupBySelectionPanel.addGroupingChangedListener(new GroupingChangedListener() { @Override public void groupingChanged() { @@ -134,6 +103,33 @@ public class QueryDefinitionProviderWithControls extends AbstractQueryDefinition return functionsPanel; } + + @Override + public QueryDefinition getQueryDefinition() { + QueryDefinitionImpl queryDTO = new QueryDefinitionImpl(LocaleInfo.getCurrentLocale().getLocaleName(), statisticProvider.getStatisticToCalculate(), + statisticProvider.getAggregatorType()); + + for (FunctionDTO dimension : groupBySelectionPanel.getDimensionsToGroupBy()) { + queryDTO.appendDimensionToGroupBy(dimension); + } + + for (Entry> filterSelectionEntry : selectionProvider.getFilterSelection().entrySet()) { + queryDTO.setFilterSelectionFor(filterSelectionEntry.getKey(), filterSelectionEntry.getValue()); + } + + return queryDTO; + } + + @Override + public void applyQueryDefinition(QueryDefinition queryDefinition) { + setBlockChangeNotification(true); + selectionProvider.applySelection(queryDefinition); + groupBySelectionPanel.applyQueryDefinition(queryDefinition); + statisticProvider.applyQueryDefinition(queryDefinition); + setBlockChangeNotification(false); + + notifyQueryDefinitionChanged(); + } @Override public void addControl(Widget controlWidget) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/RefreshingSelectionTablesPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/RefreshingSelectionTablesPanel.java new file mode 100644 index 00000000000..4d1373409fe --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/RefreshingSelectionTablesPanel.java @@ -0,0 +1,309 @@ +package com.sap.sailing.gwt.ui.datamining.selection; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Objects; +import java.util.Set; + +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.i18n.client.LocaleInfo; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.view.client.SelectionChangeEvent; +import com.sap.sailing.gwt.ui.client.ErrorReporter; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent; +import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync; +import com.sap.sailing.gwt.ui.datamining.SelectionChangedListener; +import com.sap.sailing.gwt.ui.datamining.SelectionProvider; +import com.sap.sailing.gwt.ui.datamining.StatisticChangedListener; +import com.sap.sailing.gwt.ui.datamining.StatisticProvider; +import com.sap.sailing.gwt.ui.datamining.settings.RefreshingSelectionTablesSettings; +import com.sap.sailing.gwt.ui.datamining.settings.RefreshingSelectionTablesSettingsDialogComponent; +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.QueryResult; +import com.sap.sse.datamining.shared.components.AggregatorType; +import com.sap.sse.datamining.shared.dto.FunctionDTO; +import com.sap.sse.datamining.shared.impl.GenericGroupKey; + +public class RefreshingSelectionTablesPanel implements SelectionProvider, + StatisticChangedListener { + + private static final int resizeDelay = 100; + private static final double relativeWidthInPercent = 1; + private static final int widthMargin = 17; + private static final double relativeHeightInPercent = 0.35; + + private StringMessages stringMessages; + private DataMiningServiceAsync dataMiningService; + private ErrorReporter errorReporter; + + private HorizontalPanel tablesPanel; + + private RefreshingSelectionTablesSettings settings; + private Timer timer; + private Map, SelectionTable> tablesMappedByDimensionAsKeys; + private Set listeners; + + private FunctionDTO currentStatisticToCalculate; + + public RefreshingSelectionTablesPanel(StringMessages stringMessages, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter, + StatisticProvider statisticProvider) { + this.stringMessages = stringMessages; + this.dataMiningService = dataMiningService; + this.errorReporter = errorReporter; + settings = new RefreshingSelectionTablesSettings(); + listeners = new HashSet(); + currentStatisticToCalculate = null; + + tablesMappedByDimensionAsKeys = new HashMap, SelectionTable>(); + + tablesPanel = new HorizontalPanel(); + + timer = new Timer() { + @Override + public void run() { + updateTables(); + } + }; + + Window.addResizeHandler(new ResizeHandler() { + private final Timer timer = new Timer() { + @Override + public void run() { + doLayout(Window.getClientWidth(), Window.getClientHeight()); + } + }; + @Override + public void onResize(ResizeEvent event) { + timer.schedule(resizeDelay); + } + }); + + doLayout(Window.getClientWidth(), Window.getClientHeight()); + statisticProvider.addStatisticChangedListener(this); + } + + @Override + public void statisticChanged(FunctionDTO newStatisticToCalculate, AggregatorType newAggregatorType) { + if (!Objects.equals(currentStatisticToCalculate, newStatisticToCalculate)) { + currentStatisticToCalculate = newStatisticToCalculate; + updateAvailableTables(); + } + } + + private void updateAvailableTables() { + dataMiningService.getDimensionsFor(currentStatisticToCalculate, LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback>() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error fetching the dimensions from the server: " + caught.getMessage()); + } + @Override + public void onSuccess(Collection dimensions) { + Collection> dimensionsAsKeys = new HashSet<>(); + for (FunctionDTO dimension : dimensions) { + dimensionsAsKeys.add(new GenericGroupKey(dimension)); + } + + Collection> dimensionTablesToBeRemoved = new HashSet<>(tablesMappedByDimensionAsKeys.keySet()); + dimensionTablesToBeRemoved.removeAll(dimensionsAsKeys); + for (GenericGroupKey dimensionToBeRemoved : dimensionTablesToBeRemoved) { + tablesMappedByDimensionAsKeys.remove(dimensionToBeRemoved); + } + + for (GenericGroupKey dimensionAsKey : dimensionsAsKeys) { + if (!tablesMappedByDimensionAsKeys.containsKey(dimensionAsKey)) { + SelectionTable table = new SelectionTable<>(dimensionAsKey.getValue()); + table.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { + @Override + public void onSelectionChange(SelectionChangeEvent event) { + notifySelectionChanged(); + } + }); + + tablesMappedByDimensionAsKeys.put(dimensionAsKey, table); + } + } + + List> sortedDimensions = new ArrayList<>(tablesMappedByDimensionAsKeys.keySet()); + Collections.sort(sortedDimensions, new Comparator>() { + @Override + public int compare(GenericGroupKey k1, GenericGroupKey k2) { + return k1.getValue().compareTo(k2.getValue()); + } + }); + tablesPanel.clear(); + for (GenericGroupKey dimension : sortedDimensions) { + tablesPanel.add(tablesMappedByDimensionAsKeys.get(dimension)); + } + + updateTables(); + doLayout(Window.getClientWidth(), Window.getClientHeight()); + } + }); + } + + private void doLayout(int newWindowWidth, int newWindowHeight) { + int absoluteWidth = (int) ((newWindowWidth - widthMargin) * relativeWidthInPercent); + int absoluteHeight = (int) (newWindowHeight * relativeHeightInPercent); + + tablesPanel.setWidth(absoluteWidth + "px"); + tablesPanel.setHeight(absoluteHeight + "px"); + + Collection> tables = tablesMappedByDimensionAsKeys.values(); + for (SelectionTable table : tables) { + table.setWidth((absoluteWidth / tables.size()) + "px"); + table.setHeight(absoluteHeight + "px"); + } + } + + private void updateTables() { + Collection dimensions = new HashSet<>(); + for (GenericGroupKey dimensionAsKey : tablesMappedByDimensionAsKeys.keySet()) { + dimensions.add(dimensionAsKey.getValue()); + } + + dataMiningService.getDimensionValuesFor(dimensions, new AsyncCallback>>() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error fetching the dimension values from the server: " + caught.getMessage()); + } + @Override + public void onSuccess(QueryResult> result) { + boolean tableContentChanged = false; + for (GenericGroupKey dimensionAsKey : tablesMappedByDimensionAsKeys.keySet()) { + List sortedDimensionValues = new ArrayList<>(); + if (result.getResults().containsKey(dimensionAsKey)) { + sortedDimensionValues = new ArrayList<>(result.getResults().get(dimensionAsKey)); + Collections.sort(sortedDimensionValues, new Comparator() { + @Override + public int compare(Object o1, Object o2) { + return o1.toString().compareTo(o2.toString()); + } + }); + } + + boolean currentTableContentChanged = tablesMappedByDimensionAsKeys.get(dimensionAsKey).updateContent(sortedDimensionValues); + if (!tableContentChanged) { + tableContentChanged = currentTableContentChanged; + } + } + + if (settings.isRerunQueryAfterRefresh() && tableContentChanged) { + notifySelectionChanged(); + // TODO query is executed, before the data is ready to be analyzed + // TODO does this error still appear with the new concept? + } + if (settings.isRefreshAutomatically()) { + timer.schedule(settings.getRefreshIntervalInMilliseconds()); + } + } + }); + } + + @Override + public void addSelectionChangedListener(SelectionChangedListener listener) { + listeners.add(listener); + } + + private void notifySelectionChanged() { + for (SelectionChangedListener listener : listeners) { + listener.selectionChanged(); + } + } + + @Override + public Map> getFilterSelection() { + Map> selection = new HashMap<>(); + for (SelectionTable table : tablesMappedByDimensionAsKeys.values()) { + Collection specificSelection = table.getSelectionAsValues(); + if (!specificSelection.isEmpty()) { + selection.put(table.getDimension(), specificSelection); + } + } + return selection; + } + + @Override + public void applySelection(QueryDefinition queryDefinition) { + for (Entry> selectionEntry : queryDefinition.getFilterSelection().entrySet()) { + SelectionTable selectionTable = tablesMappedByDimensionAsKeys.get(selectionEntry.getKey()); + selectionTable.setSelection((Iterable) selectionEntry.getValue()); + } + } + + @Override + public void clearSelection() { + for (SelectionTable table : tablesMappedByDimensionAsKeys.values()) { + table.clearSelection(); + } + } + + @Override + public String getLocalizedShortName() { + return stringMessages.selectionTables(); + } + + @Override + public Widget getEntryWidget() { + return tablesPanel; + } + + @Override + public boolean isVisible() { + return tablesPanel.isVisible(); + } + + @Override + public void setVisible(boolean visibility) { + tablesPanel.setVisible(visibility); + } + + @Override + public boolean hasSettings() { + return true; + } + + @Override + public SettingsDialogComponent getSettingsDialogComponent() { + return new RefreshingSelectionTablesSettingsDialogComponent(settings, stringMessages); + } + + @Override + public void updateSettings(RefreshingSelectionTablesSettings newSettings) { + if (settings.isRefreshAutomatically() != newSettings.isRefreshAutomatically()) { + if (newSettings.isRefreshAutomatically()) { + updateTables(); + } else { + timer.cancel(); + } + } + + if (settings.getRefreshIntervalInMilliseconds() != newSettings.getRefreshIntervalInMilliseconds()) { + if (newSettings.isRefreshAutomatically()) { + timer.cancel(); + timer.schedule(newSettings.getRefreshIntervalInMilliseconds()); + } + } + + settings = newSettings; + } + + @Override + public String getDependentCssClassName() { + return "refreshingSelectionTables"; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SelectionTable.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/SelectionTable.java similarity index 79% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SelectionTable.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/SelectionTable.java index eacf0cc25da..b8f028db436 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/selection/SelectionTable.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/SelectionTable.java @@ -1,5 +1,6 @@ -package com.sap.sailing.gwt.ui.datamining.client.selection; +package com.sap.sailing.gwt.ui.datamining.selection; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -12,12 +13,12 @@ import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.MultiSelectionModel; import com.google.gwt.view.client.ProvidesKey; import com.google.gwt.view.client.SelectionChangeEvent; -import com.sap.sailing.datamining.shared.DimensionIdentifier; +import com.sap.sse.datamining.shared.dto.FunctionDTO; import com.sap.sse.gwt.client.panels.AbstractFilterablePanel; -public abstract class SelectionTable extends FlowPanel { +public class SelectionTable extends FlowPanel { - private DimensionIdentifier dimension; + private FunctionDTO dimension; private Collection allData; private AbstractFilterablePanel filterPanel; @@ -25,7 +26,7 @@ public abstract class SelectionTable extends FlowPanel { private MultiSelectionModel selectionModel; private ListDataProvider dataProvider; - public SelectionTable(String title, DimensionIdentifier dimension) { + public SelectionTable(FunctionDTO dimension) { this.dimension = dimension; allData = new ArrayList(); @@ -36,16 +37,16 @@ public abstract class SelectionTable extends FlowPanel { table.addColumn(new TextColumn() { @Override public String getValue(ContentType content) { - return SelectionTable.this.getValueAsString(content); + return SelectionTable.this.getElementAsString(content); } - }, title); + }, dimension.getDisplayName()); selectionModel = new MultiSelectionModel(); table.setSelectionModel(selectionModel); dataProvider = new ListDataProvider(new ProvidesKey() { @Override public Object getKey(ContentType item) { - return getValueAsString(item); + return getElementAsString(item); } }); dataProvider.addDataDisplay(table); @@ -54,7 +55,7 @@ public abstract class SelectionTable extends FlowPanel { @Override public Iterable getSearchableStrings(ContentType content) { Collection searchableStrings = new ArrayList(); - searchableStrings.add(getValueAsString(content)); + searchableStrings.add(getElementAsString(content)); return searchableStrings; } }; @@ -65,7 +66,7 @@ public abstract class SelectionTable extends FlowPanel { add(table); } - public DimensionIdentifier getDimension() { + public FunctionDTO getDimension() { return dimension; } @@ -118,27 +119,23 @@ public abstract class SelectionTable extends FlowPanel { } private Set getKeysFor(Collection content) { - Set newContentKeys = new HashSet(); + Set contentKeys = new HashSet(); for (ContentType element : content) { - newContentKeys.add(dataProvider.getKey(element)); + contentKeys.add(dataProvider.getKey(element)); } - return newContentKeys; + return contentKeys; } - public Collection getSelectionAsValues() { - Collection selectionAsValues = new HashSet(); - for (ContentType content : selectionModel.getSelectedSet()) { - selectionAsValues.add(getValue(content)); - } - return selectionAsValues; + public Collection getSelectionAsValues() { + return selectionModel.getSelectedSet(); } public void setSelection(Iterable elements) { clearSelection(); try { @SuppressWarnings("unchecked") //You can't use instanceof for generic type parameters - Iterable elementsMatchingContent = (Iterable) elements; - for (ContentType element : elementsMatchingContent) { + Iterable specificContent = (Iterable) elements; + for (ContentType element : specificContent) { selectionModel.setSelected(element, true); } } catch (ClassCastException e) {/*Ignore the elements, because they don't match the ContentType*/} @@ -147,11 +144,9 @@ public abstract class SelectionTable extends FlowPanel { public void clearSelection() { selectionModel.clear(); } - - public abstract ValueType getValue(ContentType content); - public String getValueAsString(ContentType content) { - return getValue(content).toString(); + public String getElementAsString(ContentType element) { + return element.toString(); } public void addSelectionChangeHandler(SelectionChangeEvent.Handler handler) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/SimpleStatisticProvider.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/SimpleStatisticProvider.java new file mode 100644 index 00000000000..0fa511e6f2b --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/selection/SimpleStatisticProvider.java @@ -0,0 +1,202 @@ +package com.sap.sailing.gwt.ui.datamining.selection; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.google.gwt.event.logical.shared.ValueChangeEvent; +import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.i18n.client.LocaleInfo; +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.ValueListBox; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.client.ErrorReporter; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.client.shared.components.AbstractObjectRenderer; +import com.sap.sailing.gwt.ui.client.shared.components.SettingsDialogComponent; +import com.sap.sailing.gwt.ui.client.shared.components.SimpleObjectRenderer; +import com.sap.sailing.gwt.ui.datamining.DataMiningServiceAsync; +import com.sap.sailing.gwt.ui.datamining.StatisticChangedListener; +import com.sap.sailing.gwt.ui.datamining.StatisticProvider; +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.components.AggregatorType; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + +public class SimpleStatisticProvider implements StatisticProvider { + + private final StringMessages stringMessages; + private final DataMiningServiceAsync dataMiningService; + private final ErrorReporter errorReporter; + private final Set listeners; + + private final HorizontalPanel mainPanel; + private final ValueListBox extractionFunctionListBox; + private final ValueListBox aggregatorListBox; + + public SimpleStatisticProvider(StringMessages stringMessages, DataMiningServiceAsync dataMiningService, ErrorReporter errorReporter) { + this.stringMessages = stringMessages; + this.dataMiningService = dataMiningService; + this.errorReporter = errorReporter; + listeners = new HashSet(); + + mainPanel = new HorizontalPanel(); + mainPanel.setSpacing(5); + + mainPanel.add(new Label(this.stringMessages.calculateThe())); + extractionFunctionListBox = createExtractionFunctionListBox(); + mainPanel.add(extractionFunctionListBox); + + aggregatorListBox = createAggregatorListBox(); + HorizontalPanel aggregatorPanel = surroundAggregatorListBoxWithBraces(aggregatorListBox); + mainPanel.add(aggregatorPanel); + + updateExtractionFunctions(); + } + + private void updateExtractionFunctions() { + dataMiningService.getAllStatistics(LocaleInfo.getCurrentLocale().getLocaleName(), new AsyncCallback>() { + + @Override + public void onSuccess(Collection extractionFunctions) { + if (!extractionFunctions.isEmpty()) { + List acceptableValues = new ArrayList<>(extractionFunctions); + Collections.sort(acceptableValues); + + FunctionDTO currentExtractionFunction = getStatisticToCalculate(); + FunctionDTO valueToBeSelected = acceptableValues.contains(currentExtractionFunction) ? currentExtractionFunction + : acceptableValues.iterator().next(); + extractionFunctionListBox.setValue(valueToBeSelected); + extractionFunctionListBox.setAcceptableValues(acceptableValues); + + if (!valueToBeSelected.equals(currentExtractionFunction)) { + notifyListeners(); + } + } else { + extractionFunctionListBox.setValue(null); + extractionFunctionListBox.setAcceptableValues(new ArrayList()); + notifyListeners(); + } + } + + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error fetching the available statistics from the server: " + caught.getMessage()); + } + }); + } + + private ValueListBox createExtractionFunctionListBox() { + ValueListBox extractionFunctionListBox = new ValueListBox(new AbstractObjectRenderer() { + @Override + protected String convertObjectToString(FunctionDTO function) { + return function.getDisplayName(); + } + }); + extractionFunctionListBox.addValueChangeHandler(new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + notifyListeners(); + } + }); + return extractionFunctionListBox; + } + + private ValueListBox createAggregatorListBox() { + ValueListBox aggregatorListBox = new ValueListBox(new SimpleObjectRenderer()); + aggregatorListBox.addValueChangeHandler(new ValueChangeHandler() { + @Override + public void onValueChange(ValueChangeEvent event) { + notifyListeners(); + } + }); + + List acceptableValues = Arrays.asList(AggregatorType.values()); + aggregatorListBox.setAcceptableValues(acceptableValues); + aggregatorListBox.setValue(acceptableValues.get(0), false); + aggregatorListBox.setAcceptableValues(acceptableValues); + + return aggregatorListBox; + } + + private HorizontalPanel surroundAggregatorListBoxWithBraces(ValueListBox aggregatorListBox) { + HorizontalPanel aggregatorPanel = new HorizontalPanel(); + aggregatorPanel.setSpacing(1); + aggregatorPanel.add(new Label("(")); + + aggregatorPanel.add(aggregatorListBox); + aggregatorPanel.add(new Label(")")); + return aggregatorPanel; + } + + @Override + public void applyQueryDefinition(QueryDefinition queryDefinition) { + extractionFunctionListBox.setValue(queryDefinition.getStatisticToCalculate(), false); + aggregatorListBox.setValue(queryDefinition.getAggregatorType(), false); + } + + private void notifyListeners() { + for (StatisticChangedListener listener : listeners) { + listener.statisticChanged(getStatisticToCalculate(), getAggregatorType()); + } + } + + @Override + public void addStatisticChangedListener(StatisticChangedListener listener) { + listeners.add(listener); + } + + @Override + public FunctionDTO getStatisticToCalculate() { + return extractionFunctionListBox.getValue(); + } + + @Override + public AggregatorType getAggregatorType() { + return aggregatorListBox.getValue(); + } + + @Override + public String getLocalizedShortName() { + return stringMessages.statisticProvider(); + } + + @Override + public Widget getEntryWidget() { + return mainPanel; + } + + @Override + public boolean isVisible() { + return mainPanel.isVisible(); + } + + @Override + public void setVisible(boolean visibility) { + mainPanel.setVisible(visibility); + } + + @Override + public boolean hasSettings() { + return false; + } + + @Override + public SettingsDialogComponent getSettingsDialogComponent() { + return null; + } + + @Override + public void updateSettings(Object newSettings) { } + + @Override + public String getDependentCssClassName() { + return "simpleStatisticsProvider"; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/QueryRunnerSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/QueryRunnerSettings.java similarity index 90% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/QueryRunnerSettings.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/QueryRunnerSettings.java index 339eec49651..762bc897859 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/QueryRunnerSettings.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/QueryRunnerSettings.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client.settings; +package com.sap.sailing.gwt.ui.datamining.settings; public class QueryRunnerSettings { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/QueryRunnerSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/QueryRunnerSettingsDialogComponent.java similarity index 96% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/QueryRunnerSettingsDialogComponent.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/QueryRunnerSettingsDialogComponent.java index eabfdcad4f7..6e73946b9a0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/QueryRunnerSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/QueryRunnerSettingsDialogComponent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client.settings; +package com.sap.sailing.gwt.ui.datamining.settings; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlowPanel; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/RefreshingSelectionTablesSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/RefreshingSelectionTablesSettings.java similarity index 95% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/RefreshingSelectionTablesSettings.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/RefreshingSelectionTablesSettings.java index 8b11c65b62d..97e79f9973b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/RefreshingSelectionTablesSettings.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/RefreshingSelectionTablesSettings.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client.settings; +package com.sap.sailing.gwt.ui.datamining.settings; public class RefreshingSelectionTablesSettings { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/RefreshingSelectionTablesSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/RefreshingSelectionTablesSettingsDialogComponent.java similarity index 98% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/RefreshingSelectionTablesSettingsDialogComponent.java rename to java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/RefreshingSelectionTablesSettingsDialogComponent.java index 8f3da17c0e3..4586c6ddd60 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/client/settings/RefreshingSelectionTablesSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/datamining/settings/RefreshingSelectionTablesSettingsDialogComponent.java @@ -1,4 +1,4 @@ -package com.sap.sailing.gwt.ui.datamining.client.settings; +package com.sap.sailing.gwt.ui.datamining.settings; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.ValueChangeEvent; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java index 6b48e20db24..4b4c12280af 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java @@ -2,23 +2,25 @@ package com.sap.sailing.gwt.ui.server; import java.util.ArrayList; import java.util.Collection; +import java.util.Locale; +import java.util.Set; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; import com.google.gwt.user.server.rpc.RemoteServiceServlet; -import com.sap.sailing.datamining.data.GPSFixWithContext; -import com.sap.sailing.datamining.data.TrackedLegOfCompetitorWithContext; -import com.sap.sailing.datamining.factories.DataMiningFactory; -import com.sap.sailing.datamining.shared.DataTypes; -import com.sap.sailing.datamining.shared.QueryDefinition; -import com.sap.sailing.gwt.ui.datamining.client.DataMiningService; +import com.sap.sailing.datamining.factories.SailingDataMiningFactory; +import com.sap.sailing.datamining.shared.SailingDataMiningSerializationDummy; +import com.sap.sailing.gwt.ui.datamining.DataMiningService; import com.sap.sailing.server.RacingEventService; import com.sap.sse.datamining.DataMiningServer; import com.sap.sse.datamining.Query; +import com.sap.sse.datamining.factories.FunctionDTOFactory; import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.shared.DataMiningSerializationDummy; +import com.sap.sse.datamining.i18n.DataMiningStringMessages; +import com.sap.sse.datamining.shared.QueryDefinition; import com.sap.sse.datamining.shared.QueryResult; +import com.sap.sse.datamining.shared.SSEDataMiningSerializationDummy; import com.sap.sse.datamining.shared.dto.FunctionDTO; public class DataMiningServiceImpl extends RemoteServiceServlet implements DataMiningService { @@ -37,14 +39,13 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM private ServiceTracker createAndOpenDataMiningServerTracker( BundleContext context) { - ServiceTracker result = - new ServiceTracker( - context, com.sap.sse.datamining.DataMiningServer.class.getName(), null); + ServiceTracker result = new ServiceTracker( + context, DataMiningServer.class.getName(), null); result.open(); return result; } - private com.sap.sse.datamining.DataMiningServer getDataMiningServer() { + private DataMiningServer getDataMiningServer() { return dataMiningServerTracker.getService(); } @@ -58,40 +59,56 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM private RacingEventService getRacingEventService() { return racingEventServiceTracker.getService(); } + + @Override + public Collection getAllStatistics(String localeInfoName) { + Collection> statistics = getDataMiningServer().getFunctionProvider().getAllStatistics(); + return functionsAsFunctionDTOs(statistics, localeInfoName); + } @Override - public Collection getDimensionsFor(DataTypes dataType) { - Class dataTypeBaseClass = getBaseClassFor(dataType); + public Collection getDimensionsFor(FunctionDTO statisticToCalculate, String localeInfoName) { + Class dataTypeBaseClass = getBaseClassFor(statisticToCalculate); Collection> dimensions = getDataMiningServer().getFunctionProvider().getDimensionsFor(dataTypeBaseClass); - return functionsAsFunctionDTOs(dimensions); + return functionsAsFunctionDTOs(dimensions, localeInfoName); } - private Class getBaseClassFor(DataTypes dataType) { - switch (dataType) { - case GPSFix: - return GPSFixWithContext.class; - case TrackedLegOfCompetitor: - return TrackedLegOfCompetitorWithContext.class; - } - throw new IllegalArgumentException("No base class for data type " + dataType); + private Class getBaseClassFor(FunctionDTO statisticToCalculate) { + Function function = getDataMiningServer().getFunctionProvider().getFunctionForDTO(statisticToCalculate); + return function.getDeclaringType(); } - private Collection functionsAsFunctionDTOs(Collection> functions) { + private Collection functionsAsFunctionDTOs(Collection> functions, String localeInfoName) { + Locale locale = DataMiningStringMessages.Util.getLocaleFor(localeInfoName); + DataMiningStringMessages dataMiningStringMessages = getDataMiningServer().getStringMessages(); + Collection functionDTOs = new ArrayList(); for (Function function : functions) { - functionDTOs.add(function.asDTO()); + functionDTOs.add(FunctionDTOFactory.createFunctionDTO(function, locale, dataMiningStringMessages)); } return functionDTOs; } + + @Override + public QueryResult> getDimensionValuesFor(Collection dimensions) throws Exception { + Query> dimensionValuesQuery = SailingDataMiningFactory.createDimensionValuesQuery(getRacingEventService(), dimensions, getDataMiningServer().getFunctionProvider()); + return dimensionValuesQuery.run(); + } @Override public QueryResult runQuery(QueryDefinition queryDefinition) throws Exception { - Query query = DataMiningFactory.createQuery(queryDefinition, getRacingEventService()); + @SuppressWarnings("unchecked") // TODO Fix after the data mining has been cleaned + Query query = (Query) SailingDataMiningFactory.createQuery(getRacingEventService(), queryDefinition, getDataMiningServer().getFunctionProvider()); return query.run(); } @Override - public DataMiningSerializationDummy pseudoMethodSoThatSomeDataMiningClassesAreAddedToTheGWTSerializationPolicy() { + public SSEDataMiningSerializationDummy pseudoMethodSoThatSomeSSEDataMiningClassesAreAddedToTheGWTSerializationPolicy() { + return null; + } + + @Override + public SailingDataMiningSerializationDummy pseudoMethodSoThatSomeSailingDataMiningClassesAreAddedToTheGWTSerializationPolicy() { return null; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml index f3df232ebdf..1d1a7f95cbc 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/DataMining.gwt.xml @@ -25,7 +25,7 @@ - + diff --git a/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch new file mode 100644 index 00000000000..d1bcd2f4153 --- /dev/null +++ b/java/com.sap.sailing.server/SailingServer (No Proxy, Cached MTB).launch @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/MediaLibrary.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/MediaLibrary.java index 1c90fd07722..f2bb71cf9e8 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/MediaLibrary.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/MediaLibrary.java @@ -75,9 +75,7 @@ class MediaLibrary { * @return */ Set findMediaTracksInTimeRange(TimePoint startTime, TimePoint endTime) { - - if (startTime != null) { - + if (startTime != null && (endTime == null || startTime.before(endTime))) { TimeRange interval = new TimeRangeImpl(startTime, endTime); LockUtil.lockForRead(lock); try { diff --git a/java/com.sap.sse.common/META-INF/MANIFEST.MF b/java/com.sap.sse.common/META-INF/MANIFEST.MF index 1f520d6ae51..ebd5881e055 100644 --- a/java/com.sap.sse.common/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.common/META-INF/MANIFEST.MF @@ -8,3 +8,4 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Export-Package: com.sap.sse.common, com.sap.sse.common.filter, com.sap.sse.common.search +Require-Bundle: com.sap.sse.datamining.shared;bundle-version="1.0.0" diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/Named.java b/java/com.sap.sse.common/src/com/sap/sse/common/Named.java index 9f7d6aa268f..4e41b9fa777 100755 --- a/java/com.sap.sse.common/src/com/sap/sse/common/Named.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/Named.java @@ -2,6 +2,9 @@ package com.sap.sse.common; import java.io.Serializable; +import com.sap.sse.datamining.shared.annotations.Dimension; + public interface Named extends Serializable { + @Dimension(messageKey="Name") String getName(); } diff --git a/java/com.sap.sse.datamining.shared/.classpath b/java/com.sap.sse.datamining.shared/.classpath index 8533223089a..098194ca4b7 100644 --- a/java/com.sap.sse.datamining.shared/.classpath +++ b/java/com.sap.sse.datamining.shared/.classpath @@ -1,8 +1,7 @@ - + - diff --git a/java/com.sap.sse.datamining.shared/.settings/org.eclipse.jdt.core.prefs b/java/com.sap.sse.datamining.shared/.settings/org.eclipse.jdt.core.prefs index c537b63063c..f42de363afa 100644 --- a/java/com.sap.sse.datamining.shared/.settings/org.eclipse.jdt.core.prefs +++ b/java/com.sap.sse.datamining.shared/.settings/org.eclipse.jdt.core.prefs @@ -1,7 +1,7 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.compliance=1.7 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/java/com.sap.sse.datamining.shared/META-INF/MANIFEST.MF b/java/com.sap.sse.datamining.shared/META-INF/MANIFEST.MF index 9b07d7f70df..dca4a1a608f 100644 --- a/java/com.sap.sse.datamining.shared/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.datamining.shared/META-INF/MANIFEST.MF @@ -4,10 +4,11 @@ Bundle-Name: Shared Bundle-SymbolicName: com.sap.sse.datamining.shared Bundle-Version: 1.0.0.qualifier Bundle-Vendor: SAP -Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Export-Package: com.sap.sse.datamining.shared, com.sap.sse.datamining.shared.annotations, com.sap.sse.datamining.shared.components, com.sap.sse.datamining.shared.dto, com.sap.sse.datamining.shared.impl, com.sap.sse.datamining.shared.impl.dto +Bundle-ActivationPolicy: lazy diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/AdditionalResultData.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/AdditionalResultData.java index 826b0e9a02c..daa1816f48f 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/AdditionalResultData.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/AdditionalResultData.java @@ -6,8 +6,6 @@ public interface AdditionalResultData extends Serializable { public int getRetrievedDataAmount(); - public int getFilteredDataAmount(); - public double getCalculationTimeInSeconds(); public String getResultSignifier(); diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/Message.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/Message.java index c1e7f225334..b59debeadda 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/Message.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/Message.java @@ -1,6 +1,6 @@ package com.sap.sse.datamining.shared; public enum Message { - Average, Median, Sum, Distance, Speed, Knots, Meters, ResultSignifier, SignifierInUnit + Average, Median, Sum, Distance, Speed, Knots, Meters, ResultSignifier, SignifierInUnit, Collecting } diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/QueryDefinition.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/QueryDefinition.java new file mode 100644 index 00000000000..fc8a48ccd88 --- /dev/null +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/QueryDefinition.java @@ -0,0 +1,22 @@ +package com.sap.sse.datamining.shared; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +import com.sap.sse.datamining.shared.components.AggregatorType; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + +public interface QueryDefinition extends Serializable { + + public String getLocaleInfoName(); + + public Map> getFilterSelection(); + + public List getDimensionsToGroupBy(); + + public FunctionDTO getStatisticToCalculate(); + + public AggregatorType getAggregatorType(); + +} diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/QueryResult.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/QueryResult.java index 59c68557541..e6aea588763 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/QueryResult.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/QueryResult.java @@ -6,7 +6,6 @@ import java.util.Map; public interface QueryResult extends Serializable { int getRetrievedDataAmount(); - public int getFilteredDataAmount(); public double getCalculationTimeInSeconds(); /** diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/DataMiningSerializationDummy.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/SSEDataMiningSerializationDummy.java similarity index 68% rename from java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/DataMiningSerializationDummy.java rename to java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/SSEDataMiningSerializationDummy.java index 93686c379bf..6ea885bc8d9 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/DataMiningSerializationDummy.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/SSEDataMiningSerializationDummy.java @@ -5,11 +5,11 @@ import java.io.Serializable; import com.sap.sse.datamining.shared.impl.GenericGroupKey; @SuppressWarnings("unused") -public final class DataMiningSerializationDummy implements Serializable { +public final class SSEDataMiningSerializationDummy implements Serializable { private static final long serialVersionUID = 1L; private GenericGroupKey groupKey; - private DataMiningSerializationDummy() { } + private SSEDataMiningSerializationDummy() { } } diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/SideEffectFreeValue.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/Connector.java similarity index 73% rename from java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/SideEffectFreeValue.java rename to java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/Connector.java index 40239cbf977..9c58f79821c 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/SideEffectFreeValue.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/Connector.java @@ -2,12 +2,10 @@ package com.sap.sse.datamining.shared.annotations; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; -import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import com.sap.sse.datamining.shared.Unit; - /** * Methods marked with this annotation will be used as function for the data mining framework. Functions can be used by the user to * create new functions and dimensions.
@@ -16,12 +14,10 @@ import com.sap.sse.datamining.shared.Unit; @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface SideEffectFreeValue { +public @interface Connector { - public String messageKey(); - - public Unit resultUnit() default Unit.None; + public String messageKey() default ""; - public int resultDecimals() default 0; + public int ordinal() default Integer.MAX_VALUE; } diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/DataRetriever.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/DataRetriever.java new file mode 100644 index 00000000000..3539a061ba7 --- /dev/null +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/DataRetriever.java @@ -0,0 +1,53 @@ +package com.sap.sse.datamining.shared.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation to mark the concrete data retrievers for a specific domain.
+ * This is necessary to link the base data types with the data retrievers, to be able + * to construct the queries more easily.
+ *
+ * Attributes: + *
    + *
  • dataType The type, that is retrieved. + *
  • groupName The group name for corresponding retrievers. This is used + * for hierarchical base data types. + *
  • level The level of this retriever in the group, where 0 is the highest + * level. This means, that the level 0 retriever retrieves the data, + * that is less specific (e.g. HasTrackedRaceContext is less specific + * than HasTrackedLegContext). + *
+ * + * @author Lennart Hensler (D054527) + */ +@Documented +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface DataRetriever { + + public static final String DEFAULT_GROUP = "Default"; + + /** + * The type, that is retrieved. + */ + public Class dataType(); + + /** + * The group name for corresponding retrievers. This is used for hierarchical base data types.
+ * The default group is specified in {@link #DEFAULT_GROUP}. + */ + public String groupName() default DEFAULT_GROUP; + + /** + * The level of this retriever in the group, where 0 is the highest level. This means, that the level 0 retriever + * retrieves the data, that is less specific (e.g. HasTrackedRaceContext is less specific than HasTrackedLegContext).
+ *
+ * The default level is 0. + */ + public int level() default 0; + +} diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/Dimension.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/Dimension.java index f511540f20a..714d40e1190 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/Dimension.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/Dimension.java @@ -6,8 +6,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import com.sap.sse.datamining.shared.Unit; - /** * Methods marked with this annotation will be used as dimensions for the data mining framework. The method will be called, * if the dimension value of a data element is requested.
@@ -31,9 +29,7 @@ import com.sap.sse.datamining.shared.Unit; public @interface Dimension { public String messageKey(); - - public Unit resultUnit() default Unit.None; - public int resultDecimals() default 0; + public int ordinal() default Integer.MAX_VALUE; } diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/Statistic.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/Statistic.java new file mode 100644 index 00000000000..f4ad10b9ed1 --- /dev/null +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/annotations/Statistic.java @@ -0,0 +1,24 @@ +package com.sap.sse.datamining.shared.annotations; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import com.sap.sse.datamining.shared.Unit; + +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Statistic { + + public String messageKey(); + + public Unit resultUnit() default Unit.None; + + public int resultDecimals() default 0; + + public int ordinal() default Integer.MAX_VALUE; + +} diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/dto/FunctionDTO.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/dto/FunctionDTO.java index 37a7a7cb24d..01935dd8c41 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/dto/FunctionDTO.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/dto/FunctionDTO.java @@ -3,7 +3,7 @@ package com.sap.sse.datamining.shared.dto; import java.io.Serializable; import java.util.List; -public interface FunctionDTO extends Serializable { +public interface FunctionDTO extends Serializable, Comparable { public boolean isDimension(); @@ -14,5 +14,7 @@ public interface FunctionDTO extends Serializable { public String getReturnTypeName(); public String getSourceTypeName(); + + public int getOrdinal(); } diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/AdditionalResultDataImpl.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/AdditionalResultDataImpl.java index ded1c549adc..bbc481aa339 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/AdditionalResultDataImpl.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/AdditionalResultDataImpl.java @@ -7,7 +7,6 @@ public class AdditionalResultDataImpl implements AdditionalResultData { private static final long serialVersionUID = -9054872418326676943L; private int retrievedDataAmount; - private int filteredDataAmount; private String resultSignifier; private Unit unit; private int valueDecimals; @@ -19,10 +18,9 @@ public class AdditionalResultDataImpl implements AdditionalResultData { @Deprecated AdditionalResultDataImpl() { } - public AdditionalResultDataImpl(int retrievedDataAmount, int filteredDataAmount, String resultSignifier, Unit unit, int valueDecimals, + public AdditionalResultDataImpl(int retrievedDataAmount, String resultSignifier, Unit unit, int valueDecimals, long calculationTimeInNanos) { this.retrievedDataAmount = retrievedDataAmount; - this.filteredDataAmount = filteredDataAmount; this.resultSignifier = resultSignifier; this.unit = unit; this.valueDecimals = valueDecimals; @@ -34,14 +32,9 @@ public class AdditionalResultDataImpl implements AdditionalResultData { return retrievedDataAmount; } - @Override - public int getFilteredDataAmount() { - return filteredDataAmount; - } - @Override public double getCalculationTimeInSeconds() { - return calculationTimeInNanos; + return calculationTimeInNanos / 1000000000.0; } @Override diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/GenericGroupKey.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/GenericGroupKey.java index 7bd7b2c65d5..6c04ba3ddb6 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/GenericGroupKey.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/GenericGroupKey.java @@ -17,6 +17,10 @@ public class GenericGroupKey extends AbstractGroupKey { public GenericGroupKey(T value) { this.value = value; } + + public T getValue() { + return value; + } @Override public boolean hasSubKey() { diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/NullAdditionalResultData.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/NullAdditionalResultData.java new file mode 100644 index 00000000000..e9be6fbb5b1 --- /dev/null +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/NullAdditionalResultData.java @@ -0,0 +1,34 @@ +package com.sap.sse.datamining.shared.impl; + +import com.sap.sse.datamining.shared.AdditionalResultData; +import com.sap.sse.datamining.shared.Unit; + +public class NullAdditionalResultData implements AdditionalResultData { + private static final long serialVersionUID = -8129840449690994767L; + + @Override + public int getRetrievedDataAmount() { + return 0; + } + + @Override + public double getCalculationTimeInSeconds() { + return 0; + } + + @Override + public String getResultSignifier() { + return ""; + } + + @Override + public Unit getUnit() { + return Unit.None; + } + + @Override + public int getValueDecimals() { + return 0; + } + +} diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/QueryDefinitionImpl.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/QueryDefinitionImpl.java new file mode 100644 index 00000000000..9ecbdc28f46 --- /dev/null +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/QueryDefinitionImpl.java @@ -0,0 +1,69 @@ +package com.sap.sse.datamining.shared.impl; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.sap.sse.datamining.shared.QueryDefinition; +import com.sap.sse.datamining.shared.components.AggregatorType; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + +public class QueryDefinitionImpl implements QueryDefinition { + private static final long serialVersionUID = -6438771277564908352L; + + private String localeInfoName; + private Map> filterSelection; + private List dimensionsToGroupBy; + private FunctionDTO statisticToCalculate; + private AggregatorType aggregatorType; + + /** + * Constructor for the GWT-Serialization. Don't use this! + */ + @Deprecated + QueryDefinitionImpl() { } + + public QueryDefinitionImpl(String localeInfoName, FunctionDTO statisticToCalculate, AggregatorType aggregatorType) { + this.localeInfoName = localeInfoName; + this.filterSelection = new HashMap>(); + this.dimensionsToGroupBy = new ArrayList(); + this.statisticToCalculate = statisticToCalculate; + this.aggregatorType = aggregatorType; + } + + public void setFilterSelectionFor(FunctionDTO dimension, Iterable selection) { + filterSelection.put(dimension, selection); + } + + public void appendDimensionToGroupBy(FunctionDTO dimensionToGroupBy) { + dimensionsToGroupBy.add(dimensionToGroupBy); + } + + @Override + public String getLocaleInfoName() { + return localeInfoName; + } + + @Override + public Map> getFilterSelection() { + return filterSelection; + } + + @Override + public List getDimensionsToGroupBy() { + return dimensionsToGroupBy; + } + + @Override + public FunctionDTO getStatisticToCalculate() { + return statisticToCalculate; + } + + @Override + public AggregatorType getAggregatorType() { + return aggregatorType; + } + +} diff --git a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/QueryResultImpl.java b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/QueryResultImpl.java index 66c4417d883..980d6a8b3b4 100644 --- a/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/QueryResultImpl.java +++ b/java/com.sap.sse.datamining.shared/src/com/sap/sse/datamining/shared/impl/QueryResultImpl.java @@ -20,6 +20,10 @@ public class QueryResultImpl implements QueryResult results) { + this(results, new NullAdditionalResultData()); + } + public QueryResultImpl(Map results, AdditionalResultData additionalData) { this.results = new HashMap(results); this.additionalData = additionalData; @@ -30,11 +34,6 @@ public class QueryResultImpl implements QueryResult parameterTypeNames; private String displayName; - private boolean isDimension; + private int ordinal; /** * Constructor for the GWT-Serialization. Don't use this! @@ -23,14 +24,16 @@ public class FunctionDTOImpl implements FunctionDTO { FunctionDTOImpl() { } - public FunctionDTOImpl(String functionName, String sourceTypeName, String returnTypeName, List parameterTypeNames, String displayName, boolean isDimension) { + public FunctionDTOImpl(boolean isDimension, String functionName, String sourceTypeName, String returnTypeName, + List parameterTypeNames, String displayName, int ordinal) { + this.isDimension = isDimension; this.functionName = functionName; this.sourceTypeName = sourceTypeName; this.returnTypeName = returnTypeName; this.parameterTypeNames = new ArrayList(parameterTypeNames); this.displayName = displayName; - this.isDimension = isDimension; + this.ordinal = ordinal; } @Override @@ -58,6 +61,16 @@ public class FunctionDTOImpl implements FunctionDTO { return isDimension; } + @Override + public int getOrdinal() { + return ordinal; + } + + @Override + public int compareTo(FunctionDTO f) { + return Integer.compare(this.getOrdinal(), f.getOrdinal()); + } + @Override public String toString() { return (isDimension() ? "Dimension " : "Function ") + sourceTypeName + "." + functionName + "(" + parametersAsString() + ") : " + returnTypeName; diff --git a/java/com.sap.sse.datamining.test/resources/stringmessages/Test_StringMessages_de.properties b/java/com.sap.sse.datamining.test/resources/stringmessages/Test_StringMessages_de.properties index 8106e300b9d..987e8c3ac1c 100644 --- a/java/com.sap.sse.datamining.test/resources/stringmessages/Test_StringMessages_de.properties +++ b/java/com.sap.sse.datamining.test/resources/stringmessages/Test_StringMessages_de.properties @@ -3,4 +3,5 @@ TestMessageWithParameters=Deutsch {0} - {1} dimension = dimension-deutsch value = sideEffectFreeValue-deutsch regattaName = Regatta Name -crossSum = Quersumme \ No newline at end of file +crossSum = Quersumme +Name = Name \ No newline at end of file diff --git a/java/com.sap.sse.datamining.test/resources/stringmessages/Test_StringMessages_en.properties b/java/com.sap.sse.datamining.test/resources/stringmessages/Test_StringMessages_en.properties index 7fdfd002605..83695687336 100644 --- a/java/com.sap.sse.datamining.test/resources/stringmessages/Test_StringMessages_en.properties +++ b/java/com.sap.sse.datamining.test/resources/stringmessages/Test_StringMessages_en.properties @@ -3,4 +3,5 @@ TestMessageWithParameters=English {0} - {1} dimension = dimension-english value = sideEffectFreeValue-english regattaName = Regatta Name -crossSum = Cross Sum \ No newline at end of file +crossSum = Cross Sum +Name = Name \ No newline at end of file diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDataMiningServer.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDataMiningServer.java new file mode 100644 index 00000000000..b026fdb1631 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDataMiningServer.java @@ -0,0 +1,91 @@ +package com.sap.sse.datamining.impl; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.sap.sse.datamining.ClassesWithFunctionsProvider; +import com.sap.sse.datamining.DataMiningServer; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.functions.FunctionProvider; +import com.sap.sse.datamining.functions.FunctionRegistry; +import com.sap.sse.datamining.impl.functions.RegistryFunctionProvider; +import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext; +import com.sap.sse.datamining.test.util.ExpectedFunctionRegistryUtil; +import com.sap.sse.datamining.test.util.TestsUtil; + +public class TestDataMiningServer { + + private static ExpectedFunctionRegistryUtil expectedFunctionRegistryUtil; + + @BeforeClass + public static void intializeExpectedFunctions() throws NoSuchMethodException, SecurityException { + expectedFunctionRegistryUtil = new ExpectedFunctionRegistryUtil(); + } + + @Test + public void testThatTheFunctionRegistryIsAllwaysUpToDate() { + FunctionRegistry registry = new SimpleFunctionRegistry(); + FunctionProvider provider = new RegistryFunctionProvider(registry); + OpenClassesWithFunctionsProvider classesWithFunctionsProvider = new OpenClassesWithFunctionsProvider(); + DataMiningServer server = new DataMiningServerImpl(TestsUtil.getTestStringMessages(), registry, provider, classesWithFunctionsProvider); + + assertThat("The function registry should be empty.", + server.getFunctionRegistry().getAllFunctions().isEmpty(), + is(true)); + + classesWithFunctionsProvider.internalClassesWithMarkedMethods.add(Test_HasLegContext.class); + Collection> expectedFunctions = new HashSet<>(); + expectedFunctions.addAll(expectedFunctionRegistryUtil.getExpectedFunctionsFor(Test_HasLegContext.class)); + expectedFunctions.addAll(expectedFunctionRegistryUtil.getExpectedFunctionsFor(Test_HasRaceContext.class)); + assertThat(server.getFunctionRegistry().getAllFunctions(), is(expectedFunctions)); + + classesWithFunctionsProvider.internalClassesWithMarkedMethods.remove(Test_HasLegContext.class); + classesWithFunctionsProvider.internalClassesWithMarkedMethods.add(Test_HasRaceContext.class); + expectedFunctions = expectedFunctionRegistryUtil.getExpectedFunctionsFor(Test_HasRaceContext.class); + assertThat(server.getFunctionRegistry().getAllFunctions(), is(expectedFunctions)); + } + + @Test + public void testThatTheRegistryUpdateWorksWithNullCollections() { + FunctionRegistry registry = new SimpleFunctionRegistry(); + FunctionProvider provider = new RegistryFunctionProvider(registry); + OpenClassesWithFunctionsProvider classesWithFunctionsProvider = new OpenClassesWithFunctionsProvider(); + DataMiningServer server = new DataMiningServerImpl(TestsUtil.getTestStringMessages(), registry, provider, classesWithFunctionsProvider); + + classesWithFunctionsProvider.internalClassesWithMarkedMethods = null; + classesWithFunctionsProvider.externalLibraryClasses = null; + server.getFunctionRegistry(); + } + + private class OpenClassesWithFunctionsProvider implements ClassesWithFunctionsProvider { + + public Set> internalClassesWithMarkedMethods; + public Set> externalLibraryClasses; + + public OpenClassesWithFunctionsProvider() { + internalClassesWithMarkedMethods = new HashSet<>(); + externalLibraryClasses = new HashSet<>(); + } + + @Override + public Set> getInternalClassesWithMarkedMethods() { + return internalClassesWithMarkedMethods; + } + + @Override + public Set> getExternalLibraryClasses() { + return externalLibraryClasses; + } + + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDimensionsValuesQuery.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDimensionsValuesQuery.java new file mode 100644 index 00000000000..317cbce3e4f --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDimensionsValuesQuery.java @@ -0,0 +1,277 @@ +package com.sap.sse.datamining.impl; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ExecutionException; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sse.datamining.Query; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.factories.FunctionDTOFactory; +import com.sap.sse.datamining.factories.FunctionFactory; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.impl.components.AbstractSimpleRetrievalProcessor; +import com.sap.sse.datamining.impl.components.GroupedDataEntry; +import com.sap.sse.datamining.impl.components.ParallelByDimensionGroupingProcessor; +import com.sap.sse.datamining.impl.components.ParallelGroupedElementsValueExtractionProcessor; +import com.sap.sse.datamining.impl.components.aggregators.ParallelGroupedDataCollectingAsSetProcessor; +import com.sap.sse.datamining.shared.GroupKey; +import com.sap.sse.datamining.shared.dto.FunctionDTO; +import com.sap.sse.datamining.shared.impl.GenericGroupKey; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Boat; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_BoatClass; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Named; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Race; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Team; +import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_BoatClassImpl; +import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_BoatImpl; +import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_CompetitorImpl; +import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_LegImpl; +import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_RaceImpl; +import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_RegattaImpl; +import com.sap.sse.datamining.test.functions.registry.test_classes.impl.Test_TeamImpl; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContextImpl; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContextImpl; +import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil; + +public class TestDimensionsValuesQuery { + + //Test_HasRaceContext dimensions + private Function dimensionRegattaName; + private Function dimensionRaceName; + private Function dimensionBoatClassName; + private Function dimensionYear; + + //Test_HasLegContext dimensions + private Function dimensionLegNumber; + private Function dimensionCompetitorName; + private Function dimensionCompetitorSailID; + + private Collection dataSource; + + @Test + public void testDimensionsValuesQuery() throws InterruptedException, ExecutionException { + Query> dimensionsValueQuery = createDimensionsValuesQuery(); + Map> expectedResultData = buildExpectedResultData(); + ConcurrencyTestsUtil.verifyResultData(dimensionsValueQuery.run().getResults(), (Map>) expectedResultData); + } + + private Query> createDimensionsValuesQuery() { + return new ProcessorQuery, Collection>(ConcurrencyTestsUtil.getExecutor(), dataSource) { + @Override + protected Processor> createFirstProcessor() { + Collection>>> collectorResultReceivers = Arrays.asList(/*query*/ this.getResultReceiver()); + + Processor> resultCollector = new ParallelGroupedDataCollectingAsSetProcessor(ConcurrencyTestsUtil.getExecutor(), collectorResultReceivers); + Collection>> extractionResultReceivers = new ArrayList<>(); + extractionResultReceivers.add(resultCollector); + + Collection> legDimensions = new ArrayList<>(); + legDimensions.add(dimensionLegNumber); + legDimensions.add(dimensionCompetitorName); + legDimensions.add(dimensionCompetitorSailID); + Collection> legRetrieverResultReceivers = createGroupingExtractorsForDimensions(extractionResultReceivers, legDimensions); + Processor legRetriever = new AbstractSimpleRetrievalProcessor(ConcurrencyTestsUtil.getExecutor(), legRetrieverResultReceivers) { + @Override + protected Iterable retrieveData(Test_HasRaceContext raceWithContext) { + Collection legsWithContext = new ArrayList<>(); + int legNumber = 0; + for (Test_Leg leg : raceWithContext.getRace().getLegs()) { + legNumber++; + for (Test_Competitor competitor : raceWithContext.getRace().getCompetitors()) { + legsWithContext.add(new Test_HasLegContextImpl(raceWithContext.getRegatta(), raceWithContext.getRace(), raceWithContext.getBoatClass(), + raceWithContext.getYear(), leg, legNumber, competitor)); + } + } + return legsWithContext; + } + }; + + + Collection> raceDimensions = new ArrayList<>(); + raceDimensions.add(dimensionRegattaName); + raceDimensions.add(dimensionRaceName); + raceDimensions.add(dimensionBoatClassName); + raceDimensions.add(dimensionYear); + Collection> raceRetrieverResultReceivers = createGroupingExtractorsForDimensions(extractionResultReceivers, raceDimensions); + raceRetrieverResultReceivers.add(legRetriever); + return new AbstractSimpleRetrievalProcessor, Test_HasRaceContext>(ConcurrencyTestsUtil.getExecutor(), raceRetrieverResultReceivers) { + @Override + protected Iterable retrieveData(Collection regattas) { + Collection racesWithContext = new ArrayList<>(); + for (Test_Regatta regatta : regattas) { + for (Test_Race race : regatta.getRaces()) { + racesWithContext.add(new Test_HasRaceContextImpl(regatta, race, regatta.getBoatClass(), regatta.getYear())); + } + } + return racesWithContext; + } + }; + } + }; + } + + @SuppressWarnings("unchecked") + private Collection> createGroupingExtractorsForDimensions( + Collection>> extractionResultReceivers, Collection> dimensions) { + Collection> groupingExtractors = new ArrayList<>(); + for (Function dimension : dimensions) { + Processor> dimensionValueExtractor = new ParallelGroupedElementsValueExtractionProcessor(ConcurrencyTestsUtil.getExecutor(), extractionResultReceivers, (Function) dimension); + Processor byDimensionGrouper = new ParallelByDimensionGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(dimensionValueExtractor), dimension); + groupingExtractors.add(byDimensionGrouper); + } + return groupingExtractors; + } + + private Map> buildExpectedResultData() { + Map> expectedResultData = new HashMap<>(); + + //Add empty sets for Test_HasRaceContext dimensions + GroupKey dimensionRegattaNameGroupKey = new GenericGroupKey(FunctionDTOFactory.createFunctionDTO(dimensionRegattaName)); + expectedResultData.put(dimensionRegattaNameGroupKey, new HashSet()); + GroupKey dimensionRaceNameGroupKey = new GenericGroupKey(FunctionDTOFactory.createFunctionDTO(dimensionRaceName)); + expectedResultData.put(dimensionRaceNameGroupKey, new HashSet()); + GroupKey dimensionBoatClassNameGroupKey = new GenericGroupKey(FunctionDTOFactory.createFunctionDTO(dimensionBoatClassName)); + expectedResultData.put(dimensionBoatClassNameGroupKey, new HashSet()); + GroupKey dimensionYearGroupKey = new GenericGroupKey(FunctionDTOFactory.createFunctionDTO(dimensionYear)); + expectedResultData.put(dimensionYearGroupKey, new HashSet()); + + //Add empty sets for Test_HasLegContext dimensions + GroupKey dimensionLegNumberGroupKey = new GenericGroupKey(FunctionDTOFactory.createFunctionDTO(dimensionLegNumber)); + expectedResultData.put(dimensionLegNumberGroupKey, new HashSet()); + GroupKey dimensionCompetitorNameGroupKey = new GenericGroupKey(FunctionDTOFactory.createFunctionDTO(dimensionCompetitorName)); + expectedResultData.put(dimensionCompetitorNameGroupKey, new HashSet()); + GroupKey dimensionCompetitorSailIDGroupKey = new GenericGroupKey(FunctionDTOFactory.createFunctionDTO(dimensionCompetitorSailID)); + expectedResultData.put(dimensionCompetitorSailIDGroupKey, new HashSet()); + + for (Test_Regatta regatta : dataSource) { + expectedResultData.get(dimensionRegattaNameGroupKey).add(regatta.getName()); + expectedResultData.get(dimensionYearGroupKey).add(regatta.getYear()); + expectedResultData.get(dimensionBoatClassNameGroupKey).add(regatta.getBoatClass().getName()); + + for (Test_Race race : regatta.getRaces()) { + expectedResultData.get(dimensionRaceNameGroupKey).add(race.getName()); + + for (int legNumber = 1; legNumber <= race.getLegs().size(); legNumber++) { + expectedResultData.get(dimensionLegNumberGroupKey).add(legNumber); + } + + for (Test_Competitor competitor : race.getCompetitors()) { + expectedResultData.get(dimensionCompetitorNameGroupKey).add(competitor.getTeam().getName()); + expectedResultData.get(dimensionCompetitorSailIDGroupKey).add(competitor.getBoat().getSailID()); + } + } + } + return expectedResultData; + } + + @Before + public void initializeDimensions() throws NoSuchMethodException, SecurityException { + Method getNameMethod = Test_Named.class.getMethod("getName", new Class[0]); + Function getName = FunctionFactory.createMethodWrappingFunction(getNameMethod); + + Method getRegattaMethod = Test_HasRaceContext.class.getMethod("getRegatta", new Class[0]); + Function getRegatta = FunctionFactory.createMethodWrappingFunction(getRegattaMethod); + dimensionRegattaName = FunctionFactory.createCompoundFunction(null, Arrays.asList(getRegatta, getName)); + + Method getRaceMethod = Test_HasRaceContext.class.getMethod("getRace", new Class[0]); + Function getRace = FunctionFactory.createMethodWrappingFunction(getRaceMethod); + dimensionRaceName = FunctionFactory.createCompoundFunction(null, Arrays.asList(getRace, getName)); + + Method getBoatClassMethod = Test_HasRaceContext.class.getMethod("getBoatClass", new Class[0]); + Function getBoatClass = FunctionFactory.createMethodWrappingFunction(getBoatClassMethod); + dimensionBoatClassName = FunctionFactory.createCompoundFunction(null, Arrays.asList(getBoatClass, getName)); + + Method getYearMethod = Test_HasRaceContext.class.getMethod("getYear", new Class[0]); + dimensionYear = FunctionFactory.createMethodWrappingFunction(getYearMethod); + + Method getLegNumberMethod = Test_HasLegContext.class.getMethod("getLegNumber", new Class[0]); + dimensionLegNumber = FunctionFactory.createMethodWrappingFunction(getLegNumberMethod); + + Method getCompetitorMethod = Test_HasLegContext.class.getMethod("getCompetitor", new Class[0]); + Function getCompetitor = FunctionFactory.createMethodWrappingFunction(getCompetitorMethod); + + Method getTeamMethod = Test_Competitor.class.getMethod("getTeam", new Class[0]); + Function getTeam = FunctionFactory.createMethodWrappingFunction(getTeamMethod); + dimensionCompetitorName = FunctionFactory.createCompoundFunction(null, Arrays.asList(getCompetitor, getTeam, getName)); + + Method getBoatMethod = Test_Competitor.class.getMethod("getBoat", new Class[0]); + Function getBoat = FunctionFactory.createMethodWrappingFunction(getBoatMethod); + Method getSailIDMethod = Test_Boat.class.getMethod("getSailID", new Class[0]); + Function getSailID = FunctionFactory.createMethodWrappingFunction(getSailIDMethod); + dimensionCompetitorSailID = FunctionFactory.createCompoundFunction(null, Arrays.asList(getCompetitor, getBoat, getSailID)); + } + + @Before + public void initializeDataSource() { + //Initialize 49er competitors + Test_Team team1_49er = new Test_TeamImpl("49er Team 1"); + Test_Boat boatGER1 = new Test_BoatImpl("GER1"); + Test_Competitor competitor1_49er = new Test_CompetitorImpl(team1_49er, boatGER1); + + Test_Team team2_49er = new Test_TeamImpl("49er Team 2"); + Test_Boat boatGER2 = new Test_BoatImpl("GER2"); + Test_Competitor competitor2_49er = new Test_CompetitorImpl(team2_49er, boatGER2); + + Test_Team team3_49er = new Test_TeamImpl("49er Team 3"); + Test_Boat boatGER3 = new Test_BoatImpl("GER3"); + Test_Competitor competitor3_49er = new Test_CompetitorImpl(team3_49er, boatGER3); + + Test_Team team4_49er = new Test_TeamImpl("49er Team 4"); + Test_Boat boatGER4 = new Test_BoatImpl("GER4"); + Test_Competitor competitor4_49er = new Test_CompetitorImpl(team4_49er, boatGER4); + + Collection competitors49er = Arrays.asList(competitor1_49er, competitor2_49er, competitor3_49er, competitor4_49er); + + //Initialize 505 competitors + Test_Team team1_505 = new Test_TeamImpl("505 Team 1"); + Test_Boat boatENG1 = new Test_BoatImpl("ENG1"); + Test_Competitor competitor1_505 = new Test_CompetitorImpl(team1_505, boatENG1); + + Test_Team team2_505 = new Test_TeamImpl("505 Team 2"); + Test_Boat boatENG2 = new Test_BoatImpl("ENG2"); + Test_Competitor competitor2_505 = new Test_CompetitorImpl(team2_505, boatENG2); + + Test_Team team3_505 = new Test_TeamImpl("505 Team 3"); + Test_Boat boatENG3 = new Test_BoatImpl("ENG3"); + Test_Competitor competitor3_505 = new Test_CompetitorImpl(team3_505, boatENG3); + + Collection competitors505 = Arrays.asList(competitor1_505, competitor2_505, competitor3_505); + + // Test_Leg has only the statistic distance traveled + // This test requires only the dimensions, so only one leg is necessary + Test_Leg leg = new Test_LegImpl(0.0); + Collection legs = Arrays.asList(leg, leg, leg, leg, leg); + + //Initialize races, boat classes and regattas + Test_Race race1_49er = new Test_RaceImpl("Race 1", competitors49er, legs); + Test_Race race2_49er = new Test_RaceImpl("Race 2", competitors49er, legs); + Test_Race race3_49er = new Test_RaceImpl("Race 3", competitors49er, legs); + Test_Race race1_505 = new Test_RaceImpl("Race 1", competitors505, legs); + Test_Race race2_505 = new Test_RaceImpl("Race 2", competitors505, legs); + + Test_BoatClass boatClass49er = new Test_BoatClassImpl("49er"); + Test_BoatClass boatClass505 = new Test_BoatClassImpl("505"); + + Test_Regatta regatta49er = new Test_RegattaImpl("KW 2014 49er", boatClass49er, 2014, race1_49er, race2_49er, race3_49er); + Test_Regatta regatta505 = new Test_RegattaImpl("KW 2014 505", boatClass505, 2014, race1_505, race2_505); + + dataSource = new ArrayList<>(); + dataSource.add(regatta49er); + dataSource.add(regatta505); + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestProcessorQuery.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestProcessorQuery.java index f3e9e24fb30..55c9be0704c 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestProcessorQuery.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestProcessorQuery.java @@ -21,16 +21,16 @@ import org.junit.Test; import com.sap.sse.datamining.AdditionalResultDataBuilder; import com.sap.sse.datamining.Query; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.components.Processor; import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.impl.components.AbstractFilteringRetrievalProcessor; +import com.sap.sse.datamining.impl.components.AbstractSimpleFilteringRetrievalProcessor; import com.sap.sse.datamining.impl.components.AbstractSimpleParallelProcessor; import com.sap.sse.datamining.impl.components.GroupedDataEntry; import com.sap.sse.datamining.impl.components.ParallelGroupedElementsValueExtractionProcessor; -import com.sap.sse.datamining.impl.components.ParallelMultiDimensionalGroupingProcessor; +import com.sap.sse.datamining.impl.components.ParallelMultiDimensionsValueNestingGroupingProcessor; import com.sap.sse.datamining.impl.components.aggregators.ParallelGroupedDoubleDataSumAggregationProcessor; import com.sap.sse.datamining.shared.GroupKey; import com.sap.sse.datamining.shared.QueryResult; @@ -62,7 +62,7 @@ public class TestProcessorQuery { private Collection createDataSource() { Collection dataSource = new ArrayList<>(); - //Results in <1> = 8 + //Should be removed after filtering the data dataSource.add(new Number(1)); dataSource.add(new Number(7)); @@ -98,38 +98,41 @@ public class TestProcessorQuery { * their length, extracts the cross sum and aggregates these as sum. */ private Query createQueryWithStandardWorkflow(Collection dataSource) { - ThreadPoolExecutor executor = ConcurrencyTestsUtil.getExecutor(); + final ThreadPoolExecutor executor = ConcurrencyTestsUtil.getExecutor(); ProcessorQuery> query = new ProcessorQuery>(executor, - dataSource, stringMessages, Locale.ENGLISH); - - Collection>> aggregationResultReceivers = Arrays.asList(query.getResultReceiver()); - Processor> sumAggregator = - new ParallelGroupedDoubleDataSumAggregationProcessor(executor, aggregationResultReceivers); - - Method getCrossSumMethod = FunctionTestsUtil.getMethodFromClass(Number.class, "getCrossSum"); - Function getCrossSumFunction = FunctionFactory.createMethodWrappingFunction(getCrossSumMethod); - Processor> crossSumExtractor = new ParallelGroupedElementsValueExtractionProcessor( - executor, Arrays.asList(sumAggregator), getCrossSumFunction); + dataSource, stringMessages, Locale.ENGLISH) { + @Override + protected Processor> createFirstProcessor() { + Collection>> aggregationResultReceivers = Arrays.asList(/*query*/ this.getResultReceiver()); + Processor> sumAggregator = + new ParallelGroupedDoubleDataSumAggregationProcessor(executor, aggregationResultReceivers); + + Method getCrossSumMethod = FunctionTestsUtil.getMethodFromClass(Number.class, "getCrossSum"); + Function getCrossSumFunction = FunctionFactory.createMethodWrappingFunction(getCrossSumMethod); + Processor> crossSumExtractor = new ParallelGroupedElementsValueExtractionProcessor( + executor, Arrays.asList(sumAggregator), getCrossSumFunction); - Collection> dimensions = new ArrayList<>(); - Function getLengthFunction = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(Number.class, "getLength")); - dimensions.add(getLengthFunction); - Processor lengthGrouper = new ParallelMultiDimensionalGroupingProcessor<>(executor, Arrays.asList(crossSumExtractor), dimensions); - - FilterCriteria retrievalFilterCriteria = new FilterCriteria() { - @Override - public boolean matches(Number element) { - return element.getValue() >= 10; + Collection> dimensions = new ArrayList<>(); + Function getLengthFunction = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(Number.class, "getLength")); + dimensions.add(getLengthFunction); + Processor lengthGrouper = new ParallelMultiDimensionsValueNestingGroupingProcessor<>(executor, Arrays.asList(crossSumExtractor), dimensions); + + FilterCriterion retrievalFilterCriteria = new FilterCriterion() { + @Override + public boolean matches(Number element) { + return element.getValue() >= 10; + } + }; + Processor> filteringRetrievalProcessor = new AbstractSimpleFilteringRetrievalProcessor, Number>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(lengthGrouper), retrievalFilterCriteria) { + @Override + protected Iterable retrieveData(Iterable element) { + return element; + } + }; + + return filteringRetrievalProcessor; } }; - Processor> filteringRetrievalProcessor = new AbstractFilteringRetrievalProcessor, Number>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(lengthGrouper), retrievalFilterCriteria) { - @Override - protected Iterable retrieveData(Iterable element) { - return element; - } - }; - - query.setFirstProcessor(filteringRetrievalProcessor); return query; } @@ -139,14 +142,13 @@ public class TestProcessorQuery { results.put(new GenericGroupKey(3), 3.0); results.put(new GenericGroupKey(4), 10.0); - QueryResultImpl result = new QueryResultImpl<>(results, new AdditionalResultDataImpl(dataSource.size(), 18, "Cross Sum (Sum)", Unit.None, 0, 0)); + QueryResultImpl result = new QueryResultImpl<>(results, new AdditionalResultDataImpl(dataSource.size() - 2, "Cross Sum (Sum)", Unit.None, 0, 0)); return result; } private void verifyResult(QueryResult result, QueryResult expectedResult) { assertThat("Result values aren't correct.", result.getResults(), is(expectedResult.getResults())); assertThat("Retrieved data amount isn't correct.", result.getRetrievedDataAmount(), is(expectedResult.getRetrievedDataAmount())); - assertThat("Filtered data amount isn't correct.", result.getFilteredDataAmount(), is(expectedResult.getFilteredDataAmount())); assertThat("Result signifier isn't correct.", result.getResultSignifier(), is(expectedResult.getResultSignifier())); assertThat("Unit isn't correct.", result.getUnit(), is(expectedResult.getUnit())); assertThat("Value decimals aren't correct.", result.getValueDecimals(), is(expectedResult.getValueDecimals())); @@ -155,26 +157,33 @@ public class TestProcessorQuery { @Test(timeout=2000) public void testQueryTimeouting() throws TimeoutException { ProcessorQuery> query = new ProcessorQuery>( - ConcurrencyTestsUtil.getExecutor(), createDataSource(), stringMessages, Locale.ENGLISH); - Processor resultReceiver = new Processor() { + ConcurrencyTestsUtil.getExecutor(), createDataSource(), stringMessages, Locale.ENGLISH) { @Override - public void onElement(Double element) { - receivedElementOrFinished = true; - } - @Override - public void finish() throws InterruptedException { - receivedElementOrFinished = true; - } - @Override - public void abort() { - receivedAbort = true; - } - @Override - public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) { - return additionalDataBuilder; + protected Processor> createFirstProcessor() { + Processor resultReceiver = new Processor() { + @Override + public void processElement(Double element) { + receivedElementOrFinished = true; + } + @Override + public void onFailure(Throwable failure) { + } + @Override + public void finish() throws InterruptedException { + receivedElementOrFinished = true; + } + @Override + public void abort() { + receivedAbort = true; + } + @Override + public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) { + return additionalDataBuilder; + } + }; + return new BlockingProcessor, Double>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(resultReceiver), (long) 1000); } }; - query.setFirstProcessor(new BlockingProcessor, Double>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(resultReceiver), (long) 1000)); try { query.run(500, TimeUnit.MILLISECONDS); @@ -190,10 +199,14 @@ public class TestProcessorQuery { @Test public void testQueryWithTimeoutAndNonBlockingProcess() throws TimeoutException { + final String keyValue = "Sum"; ProcessorQuery> query = new ProcessorQuery>( - ConcurrencyTestsUtil.getExecutor(), createDataSource(), stringMessages, Locale.ENGLISH); - String keyValue = "Sum"; - query.setFirstProcessor(createSumBuildingProcessor(query, keyValue)); + ConcurrencyTestsUtil.getExecutor(), createDataSource(), stringMessages, Locale.ENGLISH) { + @Override + protected Processor> createFirstProcessor() { + return createSumBuildingProcessor(/*query*/ this, keyValue); + } + }; Map expectedResult = new HashMap<>(); expectedResult.put(new GenericGroupKey(keyValue), 10358.0); diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractFilteringRetrievalProcessor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractFilteringRetrievalProcessor.java index b27f636411a..fc3214592cd 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractFilteringRetrievalProcessor.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractFilteringRetrievalProcessor.java @@ -3,15 +3,18 @@ package com.sap.sse.datamining.impl.components; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.junit.Before; import org.junit.Test; import com.sap.sse.datamining.AdditionalResultDataBuilder; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.components.Processor; import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil; @@ -20,43 +23,81 @@ public class TestAbstractFilteringRetrievalProcessor { private Processor> filteringRetrievalProcessor; private Collection dataSource; - private Collection receivedResults = new HashSet<>(); + private Collection receivedResults = new ArrayList<>(); + + @Before + public void setUpDataSource() { + dataSource = Arrays.asList(-2, -1, 0, 1, 2); + } @Test public void testFiltration() throws InterruptedException { - filteringRetrievalProcessor.onElement(dataSource); + filteringRetrievalProcessor.processElement(dataSource); filteringRetrievalProcessor.finish(); ConcurrencyTestsUtil.sleepFor(500); //Giving the processor time to finish - Collection expectedResults = new HashSet<>(Arrays.asList(0, 1, 2)); - assertThat(receivedResults, is(expectedResults)); + Collection expectedResults = Arrays.asList(0, 1, 2); + assertThatResultsAreEqualIgnoringOrder(receivedResults, expectedResults); } + private void assertThatResultsAreEqualIgnoringOrder(Collection receivedResults, + Collection expectedResults) { + Set receivedResultsAsSet = new HashSet<>(receivedResults); + Set expectedResultsAsSet = new HashSet<>(expectedResults); + assertThat(receivedResultsAsSet, is(expectedResultsAsSet)); + } + @Test public void testProvidedAdditionalData() throws InterruptedException { - filteringRetrievalProcessor.onElement(dataSource); + filteringRetrievalProcessor.processElement(dataSource); filteringRetrievalProcessor.finish(); ConcurrencyTestsUtil.sleepFor(500); //Giving the processor time to finish - int expectedRetrievedDataAmount = 5; - int expectedFilteredDataAmount = 3; + int expectedRetrievedDataAmount = receivedResults.size(); - SumBuildingAndOverwritingResultDataBuilder resultDataBuilder = new SumBuildingAndOverwritingResultDataBuilder(); + OverwritingResultDataBuilder resultDataBuilder = new OverwritingResultDataBuilder(); filteringRetrievalProcessor.getAdditionalResultData(resultDataBuilder); assertThat(resultDataBuilder.getRetrievedDataAmount(), is(expectedRetrievedDataAmount)); - assertThat(resultDataBuilder.getFilteredDataAmount(), is(expectedFilteredDataAmount)); + } + + @Test + public void testProvidedAdditionalDataWithMultipleRetrievalLayers() throws InterruptedException { + List> layeredDataSource = new ArrayList<>(); + layeredDataSource.add(dataSource); + layeredDataSource.add(dataSource); + layeredDataSource.add(dataSource); + + Processor>> layeredRetrievalProcessor = new AbstractSimpleRetrievalProcessor>, Iterable>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(filteringRetrievalProcessor)) { + @Override + protected Iterable> retrieveData(Iterable> element) { + return element; + } + }; + + layeredRetrievalProcessor.processElement(layeredDataSource); + layeredRetrievalProcessor.finish(); + ConcurrencyTestsUtil.sleepFor(500); //Giving the processor time to finish + + int expectedRetrievedDataAmount = receivedResults.size(); + + OverwritingResultDataBuilder resultDataBuilder = new OverwritingResultDataBuilder(); + layeredRetrievalProcessor.getAdditionalResultData(resultDataBuilder); + assertThat(resultDataBuilder.getRetrievedDataAmount(), is(expectedRetrievedDataAmount)); } @Before public void setUpResultReceiverAndProcessor() { Processor resultReceiver = new Processor() { @Override - public void onElement(Integer element) { + public void processElement(Integer element) { synchronized (receivedResults) { receivedResults.add(element); } } @Override + public void onFailure(Throwable failure) { + } + @Override public void finish() throws InterruptedException { } @Override @@ -68,23 +109,18 @@ public class TestAbstractFilteringRetrievalProcessor { } }; - FilterCriteria filterCriteria = new FilterCriteria() { + FilterCriterion elementGreaterZeroFilterCriteria = new FilterCriterion() { @Override public boolean matches(Integer element) { return element >= 0; } }; - filteringRetrievalProcessor = new AbstractFilteringRetrievalProcessor, Integer>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(resultReceiver), filterCriteria) { + filteringRetrievalProcessor = new AbstractSimpleFilteringRetrievalProcessor, Integer>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(resultReceiver), elementGreaterZeroFilterCriteria) { @Override protected Iterable retrieveData(Iterable element) { return element; } }; } - - @Before - public void setUpDataSource() { - dataSource = Arrays.asList(-2, -1, 0, 1, 2); - } } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractParallelProcessorFinishing.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractParallelProcessorFinishing.java index 4880e120dbc..35295e635b6 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractParallelProcessorFinishing.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractParallelProcessorFinishing.java @@ -37,7 +37,7 @@ public class TestAbstractParallelProcessorFinishing { @Test public void testProcessFinishing() { - processor.onElement(1); + processor.processElement(1); ConcurrencyTestsUtil.tryToFinishTheProcessorInAnotherThread(processor); ConcurrencyTestsUtil.sleepFor(100); //Wait till the processor tries to finish assertThat(receiverWasToldToFinish, is(false)); @@ -50,7 +50,9 @@ public class TestAbstractParallelProcessorFinishing { private Processor createReceiver() { return new Processor() { @Override - public void onElement(Integer element) { } + public void processElement(Integer element) { } + @Override + public void onFailure(Throwable failure) { } @Override public void finish() throws InterruptedException { receiverWasToldToFinish = true; diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractParallelProcessorWithManySimpleInstructions.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractParallelProcessorWithManySimpleInstructions.java index d1119adfaf5..0220f2b3dc3 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractParallelProcessorWithManySimpleInstructions.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractParallelProcessorWithManySimpleInstructions.java @@ -25,10 +25,13 @@ public class TestAbstractParallelProcessorWithManySimpleInstructions { public void initializeProcessor() { Processor receiver = new Processor() { @Override - public void onElement(Integer element) { + public void processElement(Integer element) { incrementSum(element); } @Override + public void onFailure(Throwable failure) { + } + @Override public void finish() throws InterruptedException { receiverWasToldToFinish = true; } @@ -80,7 +83,7 @@ public class TestAbstractParallelProcessorWithManySimpleInstructions { int expectedSum = 0; for (int instructionNumber = 0; instructionNumber < elementAmount ; instructionNumber++) { Integer value = (int) (Math.random() * valueExclusiveUpperBound); - processor.onElement(value); + processor.processElement(value); expectedSum += value; } return expectedSum; diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractProcessor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractProcessor.java index 5d75ec01103..c1a165928a2 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractProcessor.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestAbstractProcessor.java @@ -21,7 +21,10 @@ public class TestAbstractProcessor { public void initializeReceivers() { Processor receiver = new Processor() { @Override - public void onElement(Integer element) { + public void processElement(Integer element) { + } + @Override + public void onFailure(Throwable failure) { } @Override public void finish() throws InterruptedException { @@ -44,7 +47,7 @@ public class TestAbstractProcessor { public void testFinishing() throws InterruptedException { Processor processor = new AbstractProcessor(receivers) { @Override - protected Integer processElement(Integer element) { + protected Integer handleElement(Integer element) { return null; } @Override diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestFilteringProcessors.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestFilteringProcessors.java index 83d839f68f2..b79192afb07 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestFilteringProcessors.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestFilteringProcessors.java @@ -13,8 +13,7 @@ import org.junit.Before; import org.junit.Test; import com.sap.sse.datamining.AdditionalResultDataBuilder; -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.components.NonFilteringProcessor; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.components.Processor; import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil; @@ -28,7 +27,7 @@ public class TestFilteringProcessors { @Test public void testFilteringProcessor() { - FilterCriteria elementIsEvenCriteria = new FilterCriteria() { + FilterCriterion elementIsEvenCriteria = new FilterCriterion() { @Override public boolean matches(Integer element) { return element % 2 == 0; @@ -56,7 +55,7 @@ public class TestFilteringProcessors { } @Test - public void testNonFilteringProcessor() { + public void testNonFilteringProcessorFiltration() { Processor nonFilteringProcessor = new NonFilteringProcessor(receivers); processElements(nonFilteringProcessor, createElementsToProcess()); verifyThatExpectedElementsHasBeenReceived(createElementsToProcess()); @@ -64,7 +63,7 @@ public class TestFilteringProcessors { private void processElements(Processor processor, Collection elements) { for (Integer element : elements) { - processor.onElement(element); + processor.processElement(element); } } @@ -89,7 +88,7 @@ public class TestFilteringProcessors { Processor receiver = new Processor() { @Override - public void onElement(Integer element) { + public void processElement(Integer element) { if (!receivedElements.containsKey(element)) { receivedElements.put(element, 0); } @@ -97,6 +96,9 @@ public class TestFilteringProcessors { receivedElements.put(element, elementAmount); } @Override + public void onFailure(Throwable failure) { + } + @Override public void finish() throws InterruptedException { } @Override diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelExtractionProcessor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelExtractionProcessor.java index ecaa1f4b73d..8693aa2d751 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelExtractionProcessor.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelExtractionProcessor.java @@ -41,10 +41,13 @@ public class TestParallelExtractionProcessor { Processor> receiver = new Processor>() { @Override - public void onElement(GroupedDataEntry element) { + public void processElement(GroupedDataEntry element) { receivedValues.put(element.getKey(), element.getDataEntry()); } @Override + public void onFailure(Throwable failure) { + } + @Override public void finish() throws InterruptedException { } @Override @@ -106,7 +109,7 @@ public class TestParallelExtractionProcessor { private void processElements(Processor> processor, Collection> elements) { for (GroupedDataEntry element : elements) { - processor.onElement(element); + processor.processElement(element); } } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelMultiDimensionalGroupingProcessor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelMultiDimensionalGroupingProcessor.java index 14090d8f29a..f9992fa5bd9 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelMultiDimensionalGroupingProcessor.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestParallelMultiDimensionalGroupingProcessor.java @@ -33,10 +33,12 @@ public class TestParallelMultiDimensionalGroupingProcessor { public void intializeProcessor() throws IllegalArgumentException, NoSuchMethodException, SecurityException { Processor> receiver = new Processor>() { @Override - public void onElement(GroupedDataEntry element) { + public void processElement(GroupedDataEntry element) { groupedElement = element; } @Override + public void onFailure(Throwable failure) { } + @Override public void finish() throws InterruptedException { } @Override public void abort() { } @@ -53,18 +55,18 @@ public class TestParallelMultiDimensionalGroupingProcessor { dimensions.add(new MethodWrappingFunction<>(Number.class.getMethod("getLength", new Class[0]), int.class)); dimensions.add(new MethodWrappingFunction<>(Number.class.getMethod("getCrossSum", new Class[0]), int.class)); - processor = new ParallelMultiDimensionalGroupingProcessor(ConcurrencyTestsUtil.getExecutor(), receivers, dimensions); + processor = new ParallelMultiDimensionsValueNestingGroupingProcessor(ConcurrencyTestsUtil.getExecutor(), receivers, dimensions); } @Test(expected=IllegalArgumentException.class) public void testConstructionWithNullDimensions() { - new ParallelMultiDimensionalGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), receivers, null); + new ParallelMultiDimensionsValueNestingGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), receivers, null); } @Test(expected=IllegalArgumentException.class) public void testConstructionWithEmptyDimensions() { Iterable> dimensions = new ArrayList<>(); - new ParallelMultiDimensionalGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), receivers, dimensions); + new ParallelMultiDimensionsValueNestingGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), receivers, dimensions); } @Test(expected=IllegalArgumentException.class) @@ -72,13 +74,13 @@ public class TestParallelMultiDimensionalGroupingProcessor { Collection> functions = new ArrayList<>(); Method method = FunctionTestsUtil.getMethodFromSimpleClassWithMarkedMethod("sideEffectFreeValue"); functions.add(FunctionFactory.createMethodWrappingFunction(method)); - new ParallelMultiDimensionalGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), receivers, functions); + new ParallelMultiDimensionsValueNestingGroupingProcessor<>(ConcurrencyTestsUtil.getExecutor(), receivers, functions); } @Test public void testGroupKeyGeneration() { Number number = new Number(1111); - processor.onElement(number); + processor.processElement(number); ConcurrencyTestsUtil.sleepFor(200); //Giving the processor time to finish the instruction verifyGroupedElement(number); } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestPartitioningOfAbstractSimpleParallelProcessor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestPartitioningOfAbstractSimpleParallelProcessor.java index 7d7c5fbf3fb..f194fc43bc0 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestPartitioningOfAbstractSimpleParallelProcessor.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestPartitioningOfAbstractSimpleParallelProcessor.java @@ -41,7 +41,7 @@ public class TestPartitioningOfAbstractSimpleParallelProcessor { } }; - processor.onElement(1); + processor.processElement(1); ConcurrencyTestsUtil.sleepFor(200); //Giving the processor time to execute the instruction verifyPartitionedElements(1); } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestAbstractStoringParallelAggregationProcessor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestAbstractStoringParallelAggregationProcessor.java index 5f32b1ab7c0..850f82ef7a8 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestAbstractStoringParallelAggregationProcessor.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestAbstractStoringParallelAggregationProcessor.java @@ -27,10 +27,13 @@ public class TestAbstractStoringParallelAggregationProcessor { public void initializeReceivers() { Processor receiver = new Processor() { @Override - public void onElement(Integer element) { + public void processElement(Integer element) { receivedElement = element; } @Override + public void onFailure(Throwable failure) { + } + @Override public void finish() throws InterruptedException { receiverWasToldToFinish = true; } @@ -74,7 +77,7 @@ public class TestAbstractStoringParallelAggregationProcessor { } private void processElementAndVerifyThatItWasStored(Processor processor, int element) { - processor.onElement(element); + processor.processElement(element); ConcurrencyTestsUtil.sleepFor(100); //Giving the processor time to process the instructions assertThat("The element store doesn't contain the previously processed element '" + element + "'", elementStore.contains(element), is(true)); } @@ -99,9 +102,9 @@ public class TestAbstractStoringParallelAggregationProcessor { } }; - processor.onElement(-1); - processor.onElement(42); - processor.onElement(7); + processor.processElement(-1); + processor.processElement(42); + processor.processElement(7); processor.finish(); assertThat("The receiver wasn't told to finish", receiverWasToldToFinish, is(true)); diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestParallelDoubleAggregationProcessors.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestParallelDoubleAggregationProcessors.java index 3bd8c4c4289..c50e360e06a 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestParallelDoubleAggregationProcessors.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestParallelDoubleAggregationProcessors.java @@ -1,9 +1,5 @@ package com.sap.sse.datamining.impl.components.aggregators; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertThat; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -31,11 +27,11 @@ public class TestParallelDoubleAggregationProcessors { public void testSumAggregationProcessor() throws InterruptedException { Processor> sumAggregationProcessor = new ParallelGroupedDoubleDataSumAggregationProcessor(ConcurrencyTestsUtil.getExecutor(), receivers); Collection> elements = createElements(); - processElements(sumAggregationProcessor, elements); + ConcurrencyTestsUtil.processElements(sumAggregationProcessor, elements); sumAggregationProcessor.finish(); Map expectedReceivedAggregations = computeExpectedSumAggregations(elements); - verifyReceivedAggregations(expectedReceivedAggregations); + ConcurrencyTestsUtil.verifyResultData(receivedAggregations, expectedReceivedAggregations); } private Map computeExpectedSumAggregations(Collection> elements) { @@ -55,11 +51,11 @@ public class TestParallelDoubleAggregationProcessors { public void testAverageAggregationProcessor() throws InterruptedException { Processor> averageAggregationProcessor = new ParallelGroupedDoubleDataAverageAggregationProcessor(ConcurrencyTestsUtil.getExecutor(), receivers); Collection> elements = createElements(); - processElements(averageAggregationProcessor, elements); + ConcurrencyTestsUtil.processElements(averageAggregationProcessor, elements); averageAggregationProcessor.finish(); Map expectedReceivedAggregations = computeExpectedAverageAggregations(elements); - verifyReceivedAggregations(expectedReceivedAggregations); + ConcurrencyTestsUtil.verifyResultData(receivedAggregations, expectedReceivedAggregations); } private Map computeExpectedAverageAggregations(Collection> elements) { @@ -91,11 +87,11 @@ public class TestParallelDoubleAggregationProcessors { public void testMedianAggregationProcessor() throws InterruptedException { Processor> medianAggregationProcessor = new ParallelGroupedDoubleDataMedianAggregationProcessor(ConcurrencyTestsUtil.getExecutor(), receivers); Collection> elements = createElements(); - processElements(medianAggregationProcessor, elements); + ConcurrencyTestsUtil.processElements(medianAggregationProcessor, elements); medianAggregationProcessor.finish(); Map expectedReceivedAggregations = computeExpectedMedianAggregations(elements); - verifyReceivedAggregations(expectedReceivedAggregations); + ConcurrencyTestsUtil.verifyResultData(receivedAggregations, expectedReceivedAggregations); } private Map computeExpectedMedianAggregations(Collection> elements) { @@ -158,32 +154,18 @@ public class TestParallelDoubleAggregationProcessors { return elements; } - - private void processElements(Processor> processor, Collection> elements) { - for (GroupedDataEntry element : elements) { - processor.onElement(element); - } - } - - private void verifyReceivedAggregations(Map expectedReceivedAggregations) { - assertThat("No aggregation has been received.", receivedAggregations, notNullValue()); - - for (Entry expectedReceivedAggregationEntry : expectedReceivedAggregations.entrySet()) { - assertThat("The expected aggregation entry '" + expectedReceivedAggregationEntry + "' wasn't received.", - receivedAggregations.containsKey(expectedReceivedAggregationEntry.getKey()), is(true)); - assertThat("The result for group '" + expectedReceivedAggregationEntry.getKey() + "' isn't correct.", - receivedAggregations.get(expectedReceivedAggregationEntry.getKey()), is(expectedReceivedAggregationEntry.getValue())); - } - } @Before public void initializeResultReceivers() { Processor> receiver = new Processor>() { @Override - public void onElement(Map element) { + public void processElement(Map element) { receivedAggregations = element; } @Override + public void onFailure(Throwable failure) { + } + @Override public void finish() throws InterruptedException { } @Override diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestParallelGroupedDataCollectingAsSetProcessor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestParallelGroupedDataCollectingAsSetProcessor.java new file mode 100644 index 00000000000..37044a828b6 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/aggregators/TestParallelGroupedDataCollectingAsSetProcessor.java @@ -0,0 +1,96 @@ +package com.sap.sse.datamining.impl.components.aggregators; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sse.datamining.AdditionalResultDataBuilder; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.impl.components.GroupedDataEntry; +import com.sap.sse.datamining.shared.GroupKey; +import com.sap.sse.datamining.shared.impl.GenericGroupKey; +import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil; + +public class TestParallelGroupedDataCollectingAsSetProcessor { + + private Collection>>> receivers; + private Map> receivedData = null; + + @Before + public void initializeReceivers() { + Processor>> receiver = new Processor>>() { + @Override + public void processElement(Map> element) { + receivedData = element; + } + @Override + public void onFailure(Throwable failure) { + } + @Override + public void finish() throws InterruptedException { + } + @Override + public void abort() { + } + @Override + public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) { + return additionalDataBuilder; + } + }; + + receivers = new HashSet<>(); + receivers.add(receiver); + } + + @Test + public void testDataCollecting() throws InterruptedException { + Processor> collectingProcessor = new ParallelGroupedDataCollectingAsSetProcessor(ConcurrencyTestsUtil.getExecutor(), receivers); + Collection> elements = createElements(); + + ConcurrencyTestsUtil.processElements(collectingProcessor, elements); + collectingProcessor.finish(); + + Map> expectedReceivedData = buildExpectedReceivedData(elements); + ConcurrencyTestsUtil.verifyResultData(receivedData, expectedReceivedData); + } + + private Collection> createElements() { + Collection> elements = new ArrayList<>(); + + GroupKey firstGroupKey = new GenericGroupKey(1); + elements.add(new GroupedDataEntry(firstGroupKey, 5.0)); + elements.add(new GroupedDataEntry(firstGroupKey, 10.0)); + elements.add(new GroupedDataEntry(firstGroupKey, 7.0)); + + GroupKey secondGroupKey = new GenericGroupKey(2); + elements.add(new GroupedDataEntry(secondGroupKey, 5.0)); + elements.add(new GroupedDataEntry(secondGroupKey, 3.0)); + elements.add(new GroupedDataEntry(secondGroupKey, 7.0)); + elements.add(new GroupedDataEntry(secondGroupKey, 7.0)); + + GroupKey thirdGroupKey = new GenericGroupKey(3); + elements.add(new GroupedDataEntry(thirdGroupKey, 5.0)); + elements.add(new GroupedDataEntry(thirdGroupKey, 5.0)); + elements.add(new GroupedDataEntry(thirdGroupKey, 5.0)); + + return elements; + } + + private Map> buildExpectedReceivedData(Collection> elements) { + Map> expectedReceivedData = new HashMap<>(); + for (GroupedDataEntry element : elements) { + if (!expectedReceivedData.containsKey(element.getKey())) { + expectedReceivedData.put(element.getKey(), new HashSet()); + } + expectedReceivedData.get(element.getKey()).add(element.getDataEntry()); + } + return expectedReceivedData; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/criterias/TestFilterCriterias.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/criterias/TestFilterCriterias.java index 497f6396f11..666e85b454e 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/criterias/TestFilterCriterias.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/criterias/TestFilterCriterias.java @@ -10,66 +10,50 @@ import java.util.Collection; import org.junit.Test; -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.data.deprecated.ClusterOfComparable; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.impl.criterias.deprecated.SimpleRangeFilterCriteria; -import com.sap.sse.datamining.impl.data.deprecated.ClusterOfComparableImpl; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContext; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextImpl; +import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext; +import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContextImpl; import com.sap.sse.datamining.test.util.FunctionTestsUtil; -import com.sap.sse.datamining.test.util.StringRegexFilterCriteria; +import com.sap.sse.datamining.test.util.StringRegexFilterCriterion; public class TestFilterCriterias { @Test public void testRegexFilterCriteria() { - FilterCriteria regexFilterCriteria = new StringRegexFilterCriteria(".*"); + FilterCriterion regexFilterCriteria = new StringRegexFilterCriterion(".*"); assertTrue(regexFilterCriteria.matches("some Random stuff")); assertFalse(regexFilterCriteria.matches(null)); String[] stringsToMatch = new String[] {"Regatta", "Other Regatta", "Third Regatta"}; - regexFilterCriteria = new StringRegexFilterCriteria(stringsToMatch[0] + "|" + stringsToMatch[1] + "|" + stringsToMatch[2]); + regexFilterCriteria = new StringRegexFilterCriterion(stringsToMatch[0] + "|" + stringsToMatch[1] + "|" + stringsToMatch[2]); for (String stringToMatch : stringsToMatch) { assertTrue("Failed to match " + stringToMatch, regexFilterCriteria.matches(stringToMatch)); } assertFalse("'Fourth Regatta' shouldn't be matched", regexFilterCriteria.matches("Fourth Regatta")); - regexFilterCriteria = new StringRegexFilterCriteria(".*Regatta"); + regexFilterCriteria = new StringRegexFilterCriterion(".*Regatta"); for (String stringToMatch : stringsToMatch) { assertTrue("Failed to match " + stringToMatch, regexFilterCriteria.matches(stringToMatch)); } assertFalse("'Regatta (29ER)' shouldn't be matched", regexFilterCriteria.matches("Regatta (29ER)")); } - @Test - public void testRangeFilterCriteria() { - ClusterOfComparable cluster = new ClusterOfComparableImpl("Test", 3, 1); - FilterCriteria rangeFilterCriteria = new SimpleRangeFilterCriteria(cluster); - - assertTrue(rangeFilterCriteria.matches(1)); - assertTrue(rangeFilterCriteria.matches(2)); - assertTrue(rangeFilterCriteria.matches(3)); - - assertFalse(rangeFilterCriteria.matches(0)); - assertFalse(rangeFilterCriteria.matches(4)); - } - @Test public void testCompoundFilterCriterias() { - StringRegexFilterCriteria startsWithBar = new StringRegexFilterCriteria("Bar.*"); - StringRegexFilterCriteria endWithFoo = new StringRegexFilterCriteria(".*Foo"); + StringRegexFilterCriterion startsWithBar = new StringRegexFilterCriterion("Bar.*"); + StringRegexFilterCriterion endWithFoo = new StringRegexFilterCriterion(".*Foo"); - CompoundFilterCriteria compoundCriteria = new AndCompoundFilterCriteria(); + CompoundFilterCriterion compoundCriteria = new AndCompoundFilterCriterion(); compoundCriteria.addCriteria(startsWithBar); compoundCriteria.addCriteria(endWithFoo); assertTrue(compoundCriteria.matches("BarAndFoo")); assertFalse(compoundCriteria.matches("BarFo")); - compoundCriteria = new OrCompoundFilterCriteria(); + compoundCriteria = new OrCompoundFilterCriterion(); compoundCriteria.addCriteria(startsWithBar); compoundCriteria.addCriteria(endWithFoo); @@ -82,7 +66,7 @@ public class TestFilterCriterias { public void testNullaryFunctionValuesFilterCriteria() { Function getRegattaName = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeWithContext.class, "getRegattaName")); Collection valuesToMatch = Arrays.asList("Regatta", "Other Regatta"); - FilterCriteria nullaryFunctionFilterCriteria = new NullaryFunctionValuesFilterCriteria<>(getRegattaName, valuesToMatch); + FilterCriterion nullaryFunctionFilterCriteria = new NullaryFunctionValuesFilterCriterion<>(getRegattaName, valuesToMatch); DataTypeWithContext regatta = new DataTypeWithContextImpl("Regatta", "Race Name", 7); assertThat(nullaryFunctionFilterCriteria.matches(regatta), is(true)); diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/data/TestClustersWithBoundaries.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/data/TestClustersWithBoundaries.java index 4fb5d578bc4..06f0206f6a4 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/data/TestClustersWithBoundaries.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/data/TestClustersWithBoundaries.java @@ -1,7 +1,7 @@ package com.sap.sse.datamining.impl.data; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.*; +import static org.junit.Assert.assertThat; import java.util.Comparator; diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionProvider.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionProvider.java deleted file mode 100644 index 33f3e27d566..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionProvider.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.sap.sse.datamining.impl.function; - -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.nullValue; -import static org.junit.Assert.assertThat; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Locale; - -import org.junit.Before; -import org.junit.Test; - -import com.sap.sse.datamining.factories.FunctionFactory; -import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.functions.FunctionProvider; -import com.sap.sse.datamining.functions.FunctionRegistry; -import com.sap.sse.datamining.functions.ParallelFunctionRetriever; -import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.impl.functions.PartitionParallelExternalFunctionRetriever; -import com.sap.sse.datamining.impl.functions.PartitioningParallelMarkedFunctionRetriever; -import com.sap.sse.datamining.impl.functions.RegistryFunctionsProvider; -import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry; -import com.sap.sse.datamining.shared.dto.FunctionDTO; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContext; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextImpl; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextProcessor; -import com.sap.sse.datamining.test.function.test_classes.ExtendingInterface; -import com.sap.sse.datamining.test.function.test_classes.ExternalLibraryClass; -import com.sap.sse.datamining.test.function.test_classes.SimpleClassWithMarkedMethods; -import com.sap.sse.datamining.test.util.FunctionTestsUtil; -import com.sap.sse.datamining.test.util.TestsUtil; - -public class TestFunctionProvider { - - private static final DataMiningStringMessages stringMessages = TestsUtil.getTestStringMessagesWithProductiveMessages(); - - private FunctionRegistry functionRegistry; - - @Before - public void initializeFunctionRegistry() { - functionRegistry = new SimpleFunctionRegistry(); - - Collection> classesToScan = new HashSet<>(); - classesToScan.add(SimpleClassWithMarkedMethods.class); - classesToScan.add(DataTypeWithContext.class); - classesToScan.add(DataTypeWithContextProcessor.class); - classesToScan.add(ExtendingInterface.class); - ParallelFunctionRetriever markedFunctionRetriever = new PartitioningParallelMarkedFunctionRetriever(classesToScan, FunctionTestsUtil.getExecutor()); - functionRegistry.registerFunctionsRetrievedBy(markedFunctionRetriever); - - Collection> externalClasses = new HashSet<>(); - externalClasses.add(ExternalLibraryClass.class); - ParallelFunctionRetriever externalFunctionRetriever = new PartitionParallelExternalFunctionRetriever(externalClasses, FunctionTestsUtil.getExecutor()); - functionRegistry.registerFunctionsRetrievedBy(externalFunctionRetriever); - } - - @Test - public void testGetDimensionsForType() { - FunctionProvider functionProvider = new RegistryFunctionsProvider(functionRegistry, FunctionTestsUtil.getExecutor()); - - Collection> expectedDimensions = FunctionTestsUtil.getDimensionsFor(DataTypeWithContext.class); - - Collection> providedDimensions = new HashSet<>(functionProvider.getDimensionsFor(DataTypeWithContext.class)); - assertThat(providedDimensions, is(expectedDimensions)); - - providedDimensions = new HashSet<>(functionProvider.getDimensionsFor(DataTypeWithContextImpl.class)); - assertThat(providedDimensions, is(expectedDimensions)); - } - - @Test - public void testGetFunctionsForType() { - FunctionProvider functionProvider = new RegistryFunctionsProvider(functionRegistry, FunctionTestsUtil.getExecutor()); - Method getRegattaAndRaceName = FunctionTestsUtil.getMethodFromClass(DataTypeWithContextProcessor.class, "getRegattaAndRaceName", DataTypeWithContext.class); - - Collection> expectedFunctions = FunctionTestsUtil.getMarkedMethodsOfDataTypeWithContextAndItsSupertypes(); - expectedFunctions.add(FunctionFactory.createMethodWrappingFunction(getRegattaAndRaceName)); - - Collection> providedFunctions = new HashSet<>(functionProvider.getFunctionsFor(DataTypeWithContext.class)); - assertThat(providedFunctions, is(expectedFunctions)); - - expectedFunctions = FunctionTestsUtil.getMarkedMethodsOfDataTypeWithContextImplAndItsSupertypes(); - expectedFunctions.add(FunctionFactory.createMethodWrappingFunction(getRegattaAndRaceName)); - - providedFunctions = new HashSet<>(functionProvider.getFunctionsFor(DataTypeWithContextImpl.class)); - assertThat(providedFunctions, is(expectedFunctions)); - } - - @Test - public void testGetFunctionForDTO() { - Method getRegattaNameMethod = FunctionTestsUtil.getMethodFromClass(DataTypeWithContext.class, "getRegattaName"); - Function getRegattaName = FunctionFactory.createMethodWrappingFunction(getRegattaNameMethod); - FunctionDTO getRegattaNameDTO = getRegattaName.asDTO(Locale.ENGLISH, stringMessages); - - FunctionProvider functionProvider = new RegistryFunctionsProvider(functionRegistry, FunctionTestsUtil.getExecutor()); - @SuppressWarnings("unchecked") // Hamcrest requires type matching of actual and expected type, so the Functions have to be specific (without ) - Function providedFunction = (Function) functionProvider.getFunctionFor(getRegattaNameDTO); - assertThat(providedFunction, is(getRegattaName)); - } - - @Test - public void testGetFunctionForUnregisteredDTO() { - Method incrementMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "increment", int.class); - Function increment = FunctionFactory.createMethodWrappingFunction(incrementMethod); - FunctionDTO incrementDTO = increment.asDTO(Locale.ENGLISH, stringMessages); - - FunctionProvider functionProvider = new RegistryFunctionsProvider(functionRegistry, FunctionTestsUtil.getExecutor()); - assertThat(functionProvider.getFunctionFor(incrementDTO), is(nullValue())); - } - - @Test - public void testGetFunctionForNullDTO() { - FunctionProvider functionProvider = new RegistryFunctionsProvider(functionRegistry, FunctionTestsUtil.getExecutor()); - assertThat(functionProvider.getFunctionFor(null), is(nullValue())); - } - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionRetrievers.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionRetrievers.java deleted file mode 100644 index 976d8cd9fd0..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionRetrievers.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.sap.sse.datamining.impl.function; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.concurrent.ExecutionException; - -import org.junit.Test; - -import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.functions.ParallelFunctionRetriever; -import com.sap.sse.datamining.impl.functions.FunctionRetrievalWorker; -import com.sap.sse.datamining.impl.functions.PartitioningParallelMarkedFunctionRetriever; -import com.sap.sse.datamining.test.function.test_classes.ExternalLibraryClass; -import com.sap.sse.datamining.test.function.test_classes.SimpleClassWithMarkedMethods; -import com.sap.sse.datamining.test.util.FunctionTestsUtil; -import com.sap.sse.datamining.test.util.OpenDataReceiver; - -public class TestFunctionRetrievers { - - @Test - public void testMarkedFunctionRetrievalWorker() { - Collection> classesToScan = new ArrayList<>(); - classesToScan.add(SimpleClassWithMarkedMethods.class); - OpenDataReceiver>> receiver = new OpenDataReceiver<>(); - - FunctionRetrievalWorker worker = FunctionRetrievalWorker.Util.createMarkedFunctionRetrievalWorker(classesToScan, receiver); - - Collection> expectedFunctions = FunctionTestsUtil.getMarkedMethodsOfSimpleClassWithMarkedMethod(); - worker.run(); - assertThat(receiver.result, is(expectedFunctions)); - } - - @Test - public void testExternalFunctionRetrievalWorker() { - Collection> classesToScan = new ArrayList<>(); - classesToScan.add(ExternalLibraryClass.class); - OpenDataReceiver>> receiver = new OpenDataReceiver<>(); - - FunctionRetrievalWorker worker = FunctionRetrievalWorker.Util.createExternalFunctionRetrievalWorker(classesToScan, receiver); - - Collection> expectedFunctions = FunctionTestsUtil.getMethodsOfExternalLibraryClass(); - worker.run(); - assertThat(receiver.result, is(expectedFunctions)); - } - - @Test - public void testFunctionRetrievalWithManyClassesToScan() { - Collection> classesToScan = getManyClassesToScan(); - classesToScan.add(SimpleClassWithMarkedMethods.class); - assertThat("Not enough classes to scan for this test.", classesToScan.size() >= getMaximumWorkerAmount(), is(true)); - - ParallelFunctionRetriever functionRetriever = new PartitioningParallelMarkedFunctionRetriever(classesToScan , FunctionTestsUtil.getExecutor()); - - Collection> expectedFunctions = FunctionTestsUtil.getMarkedMethodsOfSimpleClassWithMarkedMethod(); - try { - Collection> retrievedFunctions = new HashSet<>(functionRetriever.start(null).get()); - assertThat(retrievedFunctions, is(expectedFunctions)); - } catch (InterruptedException | ExecutionException e) { - fail("Error during the function retrieving"); - } - } - - private int getMaximumWorkerAmount() { - return (int) (FunctionTestsUtil.getExecutor().getCorePoolSize() * 0.5); - } - - private Collection> getManyClassesToScan() { - Collection> classesToScan = new ArrayList<>(); - classesToScan.add(Math.class); - classesToScan.add(Integer.class); - classesToScan.add(String.class); - classesToScan.add(Double.class); - classesToScan.add(Long.class); - classesToScan.add(Float.class); - classesToScan.add(ExternalLibraryClass.class); - return classesToScan; - } - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestSimpleFunctionRegistryAccess.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestSimpleFunctionRegistryAccess.java deleted file mode 100644 index bece3ce3d32..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestSimpleFunctionRegistryAccess.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.sap.sse.datamining.impl.function; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -import java.util.Collection; -import java.util.HashSet; - -import org.junit.Before; -import org.junit.Test; - -import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.functions.FunctionRegistry; -import com.sap.sse.datamining.functions.ParallelFunctionRetriever; -import com.sap.sse.datamining.impl.functions.PartitionParallelExternalFunctionRetriever; -import com.sap.sse.datamining.impl.functions.PartitioningParallelMarkedFunctionRetriever; -import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContext; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextProcessor; -import com.sap.sse.datamining.test.function.test_classes.ExternalLibraryClass; -import com.sap.sse.datamining.test.function.test_classes.SimpleClassWithMarkedMethods; -import com.sap.sse.datamining.test.util.FunctionTestsUtil; - -public class TestSimpleFunctionRegistryAccess { - - private FunctionRegistry functionRegistry; - - @Before - public void initializeTheFunctionRegistry() { - functionRegistry = new SimpleFunctionRegistry(); - - Collection> classesToScan = new HashSet<>(); - classesToScan.add(SimpleClassWithMarkedMethods.class); - classesToScan.add(DataTypeWithContext.class); - classesToScan.add(DataTypeWithContextProcessor.class); - ParallelFunctionRetriever markedFunctionRetriever = new PartitioningParallelMarkedFunctionRetriever(classesToScan, FunctionTestsUtil.getExecutor()); - functionRegistry.registerFunctionsRetrievedBy(markedFunctionRetriever); - - Collection> externalClasses = new HashSet<>(); - externalClasses.add(ExternalLibraryClass.class); - ParallelFunctionRetriever externalFunctionRetriever = new PartitionParallelExternalFunctionRetriever(externalClasses, FunctionTestsUtil.getExecutor()); - functionRegistry.registerFunctionsRetrievedBy(externalFunctionRetriever); - } - - @Test - public void testGetAllDimensions() { - Collection> modifiableExpectedDimensions = FunctionTestsUtil.getDimensionsFor(DataTypeWithContext.class); - modifiableExpectedDimensions.addAll(FunctionTestsUtil.getDimensionsFor(SimpleClassWithMarkedMethods.class)); - Iterable> expectedDimensions = modifiableExpectedDimensions; - assertThat(functionRegistry.getAllDimensions(), is(expectedDimensions)); - } - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestSimpleFunctionRegistryRegistrations.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestSimpleFunctionRegistryRegistrations.java deleted file mode 100644 index 0d7da633a77..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestSimpleFunctionRegistryRegistrations.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.sap.sse.datamining.impl.function; - -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import org.junit.Test; - -import com.sap.sse.datamining.factories.FunctionFactory; -import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.functions.FunctionRegistry; -import com.sap.sse.datamining.functions.ParallelFunctionRetriever; -import com.sap.sse.datamining.impl.functions.PartitionParallelExternalFunctionRetriever; -import com.sap.sse.datamining.impl.functions.PartitioningParallelMarkedFunctionRetriever; -import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry; -import com.sap.sse.datamining.test.function.test_classes.ExternalLibraryClass; -import com.sap.sse.datamining.test.function.test_classes.SimpleClassWithMarkedMethods; -import com.sap.sse.datamining.test.util.FunctionTestsUtil; - -public class TestSimpleFunctionRegistryRegistrations { - - @Test - public void testSimpleRegistration() { - Method dimension = FunctionTestsUtil.getMethodFromSimpleClassWithMarkedMethod("dimension"); - - FunctionRegistry registry = new SimpleFunctionRegistry(); - registry.register(dimension); - - Set> expectedRegisteredFunctionsAsSet = new HashSet<>(); - expectedRegisteredFunctionsAsSet.add(FunctionFactory.createMethodWrappingFunction(dimension)); - Iterable> expectedRegisteredFunctions = expectedRegisteredFunctionsAsSet; - assertThat(registry.getAllRegisteredFunctions(), is(expectedRegisteredFunctions)); - assertThat(registry.getRegisteredFunctionsOf(SimpleClassWithMarkedMethods.class), is(expectedRegisteredFunctions)); - } - - @Test - public void testRegistrationByFunctionRetrievers() { - FunctionRegistry registry = new SimpleFunctionRegistry(); - registerMethodsOfTestClassesViaFunctionRetrieversTo(registry); - - Set> expectedRegisteredFunctionsAsSet = new HashSet<>(); - expectedRegisteredFunctionsAsSet.addAll(FunctionTestsUtil.getMarkedMethodsOfSimpleClassWithMarkedMethod()); - expectedRegisteredFunctionsAsSet.addAll(FunctionTestsUtil.getMethodsOfExternalLibraryClass()); - Iterable> expectedRegisteredFunctions = expectedRegisteredFunctionsAsSet; - assertThat(registry.getAllRegisteredFunctions(), is(expectedRegisteredFunctions)); - } - - private void registerMethodsOfTestClassesViaFunctionRetrieversTo(FunctionRegistry registry) { - Collection> classesToScan = new HashSet<>(); - classesToScan.add(SimpleClassWithMarkedMethods.class); - ParallelFunctionRetriever markedFunctionRetriever = new PartitioningParallelMarkedFunctionRetriever(classesToScan, FunctionTestsUtil.getExecutor()); - registry.registerFunctionsRetrievedBy(markedFunctionRetriever); - - Collection> externalClasses = new HashSet<>(); - externalClasses.add(ExternalLibraryClass.class); - ParallelFunctionRetriever externalFunctionRetriever = new PartitionParallelExternalFunctionRetriever(externalClasses, FunctionTestsUtil.getExecutor()); - registry.registerFunctionsRetrievedBy(externalFunctionRetriever); - } - - @Test - public void testTheMultipleRegistrationOfTheSameFunction() { - Method dimension = FunctionTestsUtil.getMethodFromSimpleClassWithMarkedMethod("dimension"); - - FunctionRegistry registry = new SimpleFunctionRegistry(); - registry.register(dimension); - registry.register(dimension); - registry.register(dimension); - - Set> expectedRegisteredFunctionsAsSet = new HashSet<>(); - expectedRegisteredFunctionsAsSet.add(FunctionFactory.createMethodWrappingFunction(dimension)); - Iterable> expectedRegisteredFunctions = expectedRegisteredFunctionsAsSet; - assertThat(registry.getAllRegisteredFunctions(), is(expectedRegisteredFunctions)); - } - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestCompoundFunction.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestCompoundFunction.java new file mode 100644 index 00000000000..f9f8e23cfb2 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestCompoundFunction.java @@ -0,0 +1,69 @@ +package com.sap.sse.datamining.impl.functions; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sse.datamining.factories.FunctionFactory; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.shared.Unit; +import com.sap.sse.datamining.test.functions.test_classes.ContainerElement; +import com.sap.sse.datamining.test.functions.test_classes.ContainerElementImpl; +import com.sap.sse.datamining.test.functions.test_classes.MarkedContainer; +import com.sap.sse.datamining.test.functions.test_classes.MarkedContainerImpl; +import com.sap.sse.datamining.test.util.TestsUtil; + +public class TestCompoundFunction { + + private Function getContainerElementFunction; + private Function getNameFunction; + + private Function compoundFunction; + + @Before + public void initializeCompoundFunction() throws ClassCastException, NoSuchMethodException, SecurityException { + List> functions = new ArrayList<>(); + getContainerElementFunction = FunctionFactory.createMethodWrappingFunction(MarkedContainer.class.getMethod("getContainerElement", new Class[0])); + functions.add(getContainerElementFunction); + getNameFunction = FunctionFactory.createMethodWrappingFunction(ContainerElement.class.getMethod("getName", new Class[0])); + functions.add(getNameFunction); + + compoundFunction = FunctionFactory.createCompoundFunction("TestCompoundFunction", functions); + } + + @Test(expected=IllegalArgumentException.class) + public void testConstruction() { + List> functions = new ArrayList<>(); + functions.add(getContainerElementFunction); + new ConcatenatingCompoundFunction("IllegalCompoundFunction", functions, String.class); + } + + @Test + public void testInitialValues() { + assertThat(compoundFunction.isDimension(), is(true)); + //This is a workaround, because the assertion, that to types are equal checks for an instance of the given class instead. + assertThat("The actual declaring class did'nt match the expected one.", + compoundFunction.getDeclaringType().equals(MarkedContainer.class), is(true)); + assertThat(compoundFunction.getSimpleName(), is("TestCompoundFunction")); + assertThat(compoundFunction.getLocalizedName(Locale.ENGLISH, TestsUtil.getTestStringMessages()), is("TestCompoundFunction")); + assertThat(compoundFunction.getResultUnit(), is(Unit.None)); + assertThat(compoundFunction.getResultDecimals(), is(0)); + } + + @Test + public void testInvocation() { + String containerElementName = "TestElement"; + ContainerElement element = new ContainerElementImpl(containerElementName); + MarkedContainer container = new MarkedContainerImpl(element); + + String result = compoundFunction.tryToInvoke(container); + assertThat(result, is(containerElementName)); + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionDTOConstruction.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionDTOConstruction.java similarity index 61% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionDTOConstruction.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionDTOConstruction.java index 39b384bcda9..2332ad23f41 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionDTOConstruction.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionDTOConstruction.java @@ -1,4 +1,4 @@ -package com.sap.sse.datamining.impl.function; +package com.sap.sse.datamining.impl.functions; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; @@ -11,13 +11,14 @@ import java.util.Locale; import org.junit.Before; import org.junit.Test; +import com.sap.sse.datamining.factories.FunctionDTOFactory; import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.i18n.DataMiningStringMessages; import com.sap.sse.datamining.shared.dto.FunctionDTO; import com.sap.sse.datamining.shared.impl.dto.FunctionDTOImpl; -import com.sap.sse.datamining.test.function.test_classes.ExternalLibraryClass; -import com.sap.sse.datamining.test.function.test_classes.SimpleClassWithMarkedMethods; +import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedMethods; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; import com.sap.sse.datamining.test.util.FunctionTestsUtil; import com.sap.sse.datamining.test.util.TestsUtil; @@ -34,7 +35,7 @@ public class TestFunctionDTOConstruction { public void initializeMethods() { dimensionMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "dimension"); sideEffectFreeValueMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "sideEffectFreeValue"); - externalLibraryMethod = FunctionTestsUtil.getMethodFromClass(ExternalLibraryClass.class, "foo"); + externalLibraryMethod = FunctionTestsUtil.getMethodFromClass(Test_ExternalLibraryClass.class, "foo"); incrementMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "increment", int.class); } @@ -43,9 +44,9 @@ public class TestFunctionDTOConstruction { Function dimension = FunctionFactory.createMethodWrappingFunction(dimensionMethod); FunctionDTO expectedDimensionDTO = createExpectedDimensionDTO(); - assertThat(dimension.asDTO(), is(expectedDimensionDTO)); - assertThat(dimension.asDTO(Locale.ENGLISH, stringMessages), is(expectedDimensionDTO)); - assertThat(dimension.asDTO(Locale.GERMAN, stringMessages), is(expectedDimensionDTO)); + assertThat(FunctionDTOFactory.createFunctionDTO(dimension), is(expectedDimensionDTO)); + assertThat(FunctionDTOFactory.createFunctionDTO(dimension, Locale.ENGLISH, stringMessages), is(expectedDimensionDTO)); + assertThat(FunctionDTOFactory.createFunctionDTO(dimension, Locale.GERMAN, stringMessages), is(expectedDimensionDTO)); } public FunctionDTOImpl createExpectedDimensionDTO() { @@ -56,8 +57,9 @@ public class TestFunctionDTOConstruction { String displayName = functionName; boolean isDimension = true; + int ordinal = 0; - return new FunctionDTOImpl(functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, isDimension); + return new FunctionDTOImpl(isDimension, functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, ordinal); } @Test @@ -65,8 +67,8 @@ public class TestFunctionDTOConstruction { Function sideEffectFreeValue = FunctionFactory.createMethodWrappingFunction(sideEffectFreeValueMethod); FunctionDTO expectedDTO = createExpectedNullarySideEffectFreeValueDTO(); - assertThat(sideEffectFreeValue.asDTO(Locale.ENGLISH, stringMessages), is(expectedDTO)); - assertThat(sideEffectFreeValue.asDTO(Locale.GERMAN, stringMessages), is(expectedDTO)); + assertThat(FunctionDTOFactory.createFunctionDTO(sideEffectFreeValue, Locale.ENGLISH, stringMessages), is(expectedDTO)); + assertThat(FunctionDTOFactory.createFunctionDTO(sideEffectFreeValue, Locale.GERMAN, stringMessages), is(expectedDTO)); } private FunctionDTO createExpectedNullarySideEffectFreeValueDTO() { @@ -77,8 +79,9 @@ public class TestFunctionDTOConstruction { String displayName = functionName; boolean isDimension = false; + int ordinal = 0; - return new FunctionDTOImpl(functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, isDimension); + return new FunctionDTOImpl(isDimension, functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, ordinal); } @Test @@ -86,8 +89,8 @@ public class TestFunctionDTOConstruction { Function externalLibraryFunction = FunctionFactory.createMethodWrappingFunction(externalLibraryMethod); FunctionDTO expectedDTO = createExpectedExternalLibraryFunctionDTO(); - assertThat(externalLibraryFunction.asDTO(Locale.ENGLISH, stringMessages), is(expectedDTO)); - assertThat(externalLibraryFunction.asDTO(Locale.GERMAN, stringMessages), is(expectedDTO)); + assertThat(FunctionDTOFactory.createFunctionDTO(externalLibraryFunction, Locale.ENGLISH, stringMessages), is(expectedDTO)); + assertThat(FunctionDTOFactory.createFunctionDTO(externalLibraryFunction, Locale.GERMAN, stringMessages), is(expectedDTO)); } private FunctionDTO createExpectedExternalLibraryFunctionDTO() { @@ -98,8 +101,9 @@ public class TestFunctionDTOConstruction { String displayName = functionName; boolean isDimension = false; + int ordinal = 0; - return new FunctionDTOImpl(functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, isDimension); + return new FunctionDTOImpl(isDimension, functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, ordinal); } @Test @@ -107,8 +111,8 @@ public class TestFunctionDTOConstruction { Function increment = FunctionFactory.createMethodWrappingFunction(incrementMethod); FunctionDTO expectedDTO = createFunctionDTOWithParameters(); - assertThat(increment.asDTO(Locale.ENGLISH, stringMessages), is(expectedDTO)); - assertThat(increment.asDTO(Locale.GERMAN, stringMessages), is(expectedDTO)); + assertThat(FunctionDTOFactory.createFunctionDTO(increment, Locale.ENGLISH, stringMessages), is(expectedDTO)); + assertThat(FunctionDTOFactory.createFunctionDTO(increment, Locale.GERMAN, stringMessages), is(expectedDTO)); } private FunctionDTO createFunctionDTOWithParameters() { @@ -120,8 +124,21 @@ public class TestFunctionDTOConstruction { String displayName = functionName; boolean isDimension = false; + int ordinal = 0; - return new FunctionDTOImpl(functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, isDimension); + return new FunctionDTOImpl(isDimension, functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, ordinal); + } + + @Test + public void testThatLocalizedFunctionDTOAndUnlocalizedAreEqual() { + Function dimension = FunctionFactory.createMethodWrappingFunction(dimensionMethod); + + FunctionDTO unlocalizedDimensionDTO = FunctionDTOFactory.createFunctionDTO(dimension); + FunctionDTO englishDimensionDTO = FunctionDTOFactory.createFunctionDTO(dimension, Locale.ENGLISH, TestsUtil.getTestStringMessages()); + FunctionDTO germanDimensionDTO = FunctionDTOFactory.createFunctionDTO(dimension, Locale.GERMAN, TestsUtil.getTestStringMessages()); + + assertThat(unlocalizedDimensionDTO, is(englishDimensionDTO)); + assertThat(englishDimensionDTO, is(germanDimensionDTO)); } } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java new file mode 100644 index 00000000000..ad6281c3b72 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java @@ -0,0 +1,116 @@ +package com.sap.sse.datamining.impl.functions; + +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; +import static org.junit.Assert.assertThat; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Locale; + +import org.junit.Before; +import org.junit.Test; + +import com.sap.sse.datamining.factories.FunctionDTOFactory; +import com.sap.sse.datamining.factories.FunctionFactory; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.functions.FunctionProvider; +import com.sap.sse.datamining.functions.FunctionRegistry; +import com.sap.sse.datamining.i18n.DataMiningStringMessages; +import com.sap.sse.datamining.shared.dto.FunctionDTO; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Named; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContextImpl; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContextImpl; +import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedMethods; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; +import com.sap.sse.datamining.test.util.ExpectedFunctionRegistryUtil; +import com.sap.sse.datamining.test.util.FunctionTestsUtil; +import com.sap.sse.datamining.test.util.TestsUtil; + +public class TestFunctionProvider { + + private static final DataMiningStringMessages stringMessages = TestsUtil.getTestStringMessagesWithProductiveMessages(); + + private ExpectedFunctionRegistryUtil functionRegistryUtil; + private FunctionRegistry functionRegistry; + + @Before + public void initializeFunctionRegistry() throws NoSuchMethodException, SecurityException { + functionRegistryUtil = new ExpectedFunctionRegistryUtil(); + functionRegistry = new SimpleFunctionRegistry(); + + Collection> internalClassesToScan = new HashSet<>(); + internalClassesToScan.add(Test_HasLegContext.class); + internalClassesToScan.add(Test_HasRaceContext.class); + functionRegistry.registerAllWithInternalFunctionPolicy(internalClassesToScan); + + Collection> externalClassesToScan = new HashSet<>(); + externalClassesToScan.add(Test_ExternalLibraryClass.class); + functionRegistry.registerAllWithExternalFunctionPolicy(externalClassesToScan); + } + + @Test + public void testGetAllStatistics() { + FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry); + Collection> expectedFunctions = functionRegistryUtil.getAllExpectedStatistics(); + assertThat(functionProvider.getAllStatistics(), is(expectedFunctions)); + } + + @Test + public void testGetDimensionsForType() { + FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry); + + Collection> expectedDimensions = functionRegistryUtil.getExpectedDimensionsFor(Test_HasRaceContext.class); + assertThat(functionProvider.getDimensionsFor(Test_HasRaceContext.class), is(expectedDimensions)); + assertThat(functionProvider.getDimensionsFor(Test_HasRaceContextImpl.class), is(expectedDimensions)); + + expectedDimensions.addAll(functionRegistryUtil.getExpectedDimensionsFor(Test_HasLegContext.class)); + assertThat(functionProvider.getDimensionsFor(Test_HasLegContext.class), is(expectedDimensions)); + assertThat(functionProvider.getDimensionsFor(Test_HasLegContextImpl.class), is(expectedDimensions)); + } + + @Test + public void testGetStatisticsForType() { + FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry); + Collection> expectedFunctions = functionRegistryUtil.getExpectedStatisticsFor(Test_HasLegContext.class); + assertThat(functionProvider.getStatisticsFor(Test_HasLegContext.class), is(expectedFunctions)); + assertThat(functionProvider.getStatisticsFor(Test_HasLegContextImpl.class), is(expectedFunctions)); + } + + @Test + public void testGetFunctionForDTO() throws NoSuchMethodException, SecurityException { + Method getRegattaMethod = Test_HasRaceContext.class.getMethod("getRace", new Class[0]); + Function getRegatta = FunctionFactory.createMethodWrappingFunction(getRegattaMethod); + Method getNameMethod = Test_Named.class.getMethod("getName", new Class[0]); + Function getName = FunctionFactory.createMethodWrappingFunction(getNameMethod); + Function getRegattaName = FunctionFactory.createCompoundFunction(Arrays.asList(getRegatta, getName)); + + FunctionDTO getRegattaNameDTO = FunctionDTOFactory.createFunctionDTO(getRegattaName, Locale.ENGLISH, stringMessages); + + FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry); + @SuppressWarnings("unchecked") // Hamcrest requires type matching of actual and expected type, so the Functions have to be specific (without ) + Function providedFunction = (Function) functionProvider.getFunctionForDTO(getRegattaNameDTO); + assertThat(providedFunction, is(getRegattaName)); + } + + @Test + public void testGetFunctionForUnregisteredDTO() { + Method incrementMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "increment", int.class); + Function increment = FunctionFactory.createMethodWrappingFunction(incrementMethod); + FunctionDTO incrementDTO = FunctionDTOFactory.createFunctionDTO(increment, Locale.ENGLISH, stringMessages); + + FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry); + assertThat(functionProvider.getFunctionForDTO(incrementDTO), is(nullValue())); + } + + @Test + public void testGetFunctionForNullDTO() { + FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry); + assertThat(functionProvider.getFunctionForDTO(null), is(nullValue())); + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestMethodWrappingFunction.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestMethodWrappingFunction.java similarity index 91% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestMethodWrappingFunction.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestMethodWrappingFunction.java index 42b155a0966..5bad8610ed9 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestMethodWrappingFunction.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestMethodWrappingFunction.java @@ -1,4 +1,4 @@ -package com.sap.sse.datamining.impl.function; +package com.sap.sse.datamining.impl.functions; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; @@ -12,9 +12,8 @@ import org.junit.Test; import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.impl.functions.MethodWrappingFunction; -import com.sap.sse.datamining.test.function.test_classes.ExternalLibraryClass; -import com.sap.sse.datamining.test.function.test_classes.SimpleClassWithMarkedMethods; +import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedMethods; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; import com.sap.sse.datamining.test.util.FunctionTestsUtil; import com.sap.sse.datamining.test.util.TestsUtil; @@ -28,7 +27,7 @@ public class TestMethodWrappingFunction { public void initializeMethods() { dimensionMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "dimension"); sideEffectFreeValueMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "sideEffectFreeValue"); - externalLibraryMethod = FunctionTestsUtil.getMethodFromClass(ExternalLibraryClass.class, "foo"); + externalLibraryMethod = FunctionTestsUtil.getMethodFromClass(Test_ExternalLibraryClass.class, "foo"); } @Test(expected=IllegalArgumentException.class) diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestMethodWrappingFunctionInvocation.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestMethodWrappingFunctionInvocation.java similarity index 86% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestMethodWrappingFunctionInvocation.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestMethodWrappingFunctionInvocation.java index 4e24323ca98..8bb5bc7913d 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestMethodWrappingFunctionInvocation.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestMethodWrappingFunctionInvocation.java @@ -1,4 +1,4 @@ -package com.sap.sse.datamining.impl.function; +package com.sap.sse.datamining.impl.functions; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; @@ -9,9 +9,9 @@ import org.junit.Test; import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContext; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextImpl; -import com.sap.sse.datamining.test.function.test_classes.SimpleClassWithMarkedMethods; +import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext; +import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContextImpl; +import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedMethods; import com.sap.sse.datamining.test.util.FunctionTestsUtil; public class TestMethodWrappingFunctionInvocation { diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestSimpleFunctionRegistry.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestSimpleFunctionRegistry.java new file mode 100644 index 00000000000..832a1781221 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestSimpleFunctionRegistry.java @@ -0,0 +1,90 @@ +package com.sap.sse.datamining.impl.functions; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.functions.FunctionRegistry; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasContextWithDeadConnectorEnd; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; +import com.sap.sse.datamining.test.util.ExpectedFunctionRegistryUtil; + + +public class TestSimpleFunctionRegistry { + + private static ExpectedFunctionRegistryUtil expectedFunctionRegistryUtil; + + private Set> internalClassesToScan; + private HashSet> externalClassesToScan; + + @BeforeClass + public static void intializeExpectedFunctions() throws NoSuchMethodException, SecurityException { + expectedFunctionRegistryUtil = new ExpectedFunctionRegistryUtil(); + } + + @Before + public void initializeClassesToScan() { + internalClassesToScan = new HashSet<>(); + internalClassesToScan.add(Test_HasLegContext.class); + internalClassesToScan.add(Test_HasRaceContext.class); + internalClassesToScan.add(Test_HasContextWithDeadConnectorEnd.class); + + externalClassesToScan = new HashSet<>(); + externalClassesToScan.add(Test_ExternalLibraryClass.class); + } + + @Test + public void testRegistration() throws NoSuchMethodException, SecurityException { + FunctionRegistry registry = new SimpleFunctionRegistry(); + registry.registerAllWithInternalFunctionPolicy(internalClassesToScan); + registry.registerAllWithExternalFunctionPolicy(externalClassesToScan); + + Collection> expectedDimensions = new HashSet<>(); + expectedDimensions.addAll(expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasLegContext.class)); + expectedDimensions.addAll(expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasRaceContext.class)); + assertThat(registry.getDimensions(), is(expectedDimensions)); + + Collection> expectedStatistics = expectedFunctionRegistryUtil.getExpectedStatisticsFor(Test_HasLegContext.class); + assertThat(registry.getStatistics(), is(expectedStatistics)); + + Collection> expectedExternalFunctions = expectedFunctionRegistryUtil.getExpectedExternalFunctionsFor(Test_ExternalLibraryClass.class); + assertThat(registry.getExternalFunctions(), is(expectedExternalFunctions)); + } + + @Test + public void testUnregistration() { + FunctionRegistry registry = new SimpleFunctionRegistry(); + registry.registerAllWithInternalFunctionPolicy(internalClassesToScan); + + Collection> expectedDimensions = new HashSet<>(); + expectedDimensions.addAll(expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasLegContext.class)); + expectedDimensions.addAll(expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasRaceContext.class)); + assertThat(registry.getDimensions(), is(expectedDimensions)); + + Set> classesToUnregister = new HashSet<>(); + classesToUnregister.add(Test_HasLegContext.class); + registry.unregisterAllFunctionsOf(classesToUnregister); + + expectedDimensions = expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasRaceContext.class); + assertThat(registry.getDimensions(), is(expectedDimensions)); + + registry.registerAllWithInternalFunctionPolicy(internalClassesToScan); + classesToUnregister = new HashSet<>(); + classesToUnregister.add(Test_HasRaceContext.class); + registry.unregisterAllFunctionsOf(classesToUnregister); + + expectedDimensions = expectedFunctionRegistryUtil.getExpectedDimensionsFor(Test_HasLegContext.class); + assertThat(registry.getDimensions(), is(expectedDimensions)); + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestDeclaringTypeOrParameterTypeCriteria.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/criterias/TestDeclaringTypeOrParameterTypeCriteria.java similarity index 66% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestDeclaringTypeOrParameterTypeCriteria.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/criterias/TestDeclaringTypeOrParameterTypeCriteria.java index 96c30fbe048..0683726b41d 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestDeclaringTypeOrParameterTypeCriteria.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/criterias/TestDeclaringTypeOrParameterTypeCriteria.java @@ -1,4 +1,4 @@ -package com.sap.sse.datamining.impl.function; +package com.sap.sse.datamining.impl.functions.criterias; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; @@ -6,15 +6,14 @@ import static org.junit.Assert.assertThat; import org.junit.Before; import org.junit.Test; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.impl.functions.DeclaringTypeOrParameterTypeCriteria; -import com.sap.sse.datamining.test.function.test_classes.DataTypeInterface; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContext; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextImpl; -import com.sap.sse.datamining.test.function.test_classes.ExtendingInterface; -import com.sap.sse.datamining.test.function.test_classes.ExternalLibraryClass; +import com.sap.sse.datamining.test.functions.test_classes.DataTypeInterface; +import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext; +import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContextImpl; +import com.sap.sse.datamining.test.functions.test_classes.ExtendingInterface; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; import com.sap.sse.datamining.test.util.FunctionTestsUtil; public class TestDeclaringTypeOrParameterTypeCriteria { @@ -31,12 +30,12 @@ public class TestDeclaringTypeOrParameterTypeCriteria { getRaceNameLengthValue = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(ExtendingInterface.class, "getRaceNameLength")); getRegattaNameDimension = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeWithContext.class, "getRegattaName")); - libraryFunction = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(ExternalLibraryClass.class, "foo")); + libraryFunction = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(Test_ExternalLibraryClass.class, "foo")); } @Test public void testMatchingTypeWithBigHierarchy() { - FilterCriteria> criteria = new DeclaringTypeOrParameterTypeCriteria(DataTypeWithContextImpl.class); + FilterCriterion> criteria = new IsDeclaringTypeFilterCriterion(DataTypeWithContextImpl.class); assertThat(criteria.matches(getSpeedInKnotsValue), is(true)); assertThat(criteria.matches(getRaceNameLengthValue), is(true)); diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionFilterCriterias.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/criterias/TestFunctionFilterCriterias.java similarity index 72% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionFilterCriterias.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/criterias/TestFunctionFilterCriterias.java index b55274d3dd3..da79edfe1a1 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/function/TestFunctionFilterCriterias.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/criterias/TestFunctionFilterCriterias.java @@ -1,4 +1,4 @@ -package com.sap.sse.datamining.impl.function; +package com.sap.sse.datamining.impl.functions.criterias; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; @@ -7,17 +7,14 @@ import java.lang.reflect.Method; import org.junit.Test; -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.impl.functions.MethodIsCorrectDimensionFilterCriteria; -import com.sap.sse.datamining.impl.functions.MethodIsCorrectExternalFunctionFilterCriteria; -import com.sap.sse.datamining.impl.functions.MethodIsCorrectSideEffectFreeValueFilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.test.util.FunctionTestsUtil; public class TestFunctionFilterCriterias { @Test public void testMethodIsCorrectDimensionFilterCriteria() { - FilterCriteria filterCriteria = new MethodIsCorrectDimensionFilterCriteria(); + FilterCriterion filterCriteria = new MethodIsCorrectDimensionFilterCriterion(); Method dimension = FunctionTestsUtil.getMethodFromSimpleClassWithMarkedMethod("dimension"); assertThat(filterCriteria.matches(dimension), is(true)); @@ -31,7 +28,7 @@ public class TestFunctionFilterCriterias { @Test public void testMethodIsCorrectSideEffectFreeValueFilterCriteria() { - FilterCriteria filterCriteria = new MethodIsCorrectSideEffectFreeValueFilterCriteria(); + FilterCriterion filterCriteria = new MethodIsCorrectStatisticFilterCriterion(); Method sideEffectFreeValue = FunctionTestsUtil.getMethodFromSimpleClassWithMarkedMethod("sideEffectFreeValue"); assertThat(filterCriteria.matches(sideEffectFreeValue), is(true)); @@ -42,7 +39,7 @@ public class TestFunctionFilterCriterias { @Test public void testMethodIsCorrectExternalLibraryFunctionFilterCriteria() { - FilterCriteria filterCriteria = new MethodIsCorrectExternalFunctionFilterCriteria(); + FilterCriterion filterCriteria = new MethodIsCorrectExternalFunctionFilterCriterion(); Method foo = FunctionTestsUtil.getMethodFromExternalLibraryClass("foo"); assertThat(filterCriteria.matches(foo), is(true)); diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/i18n/TestI18N.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/i18n/TestI18N.java index 736bb3bc13a..c583bc5d74e 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/i18n/TestI18N.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/i18n/TestI18N.java @@ -34,5 +34,14 @@ public class TestI18N { assertThat(bundleManager.get(Locale.ENGLISH, TEST_MESSAGE_WITH_PARAMETERS, "Param0", "Param1"), is("English Param0 - Param1")); assertThat(bundleManager.get(Locale.GERMAN, TEST_MESSAGE_WITH_PARAMETERS, "Param0", "Param1"), is("Deutsch Param0 - Param1")); } + + @Test + public void testGetLocaleForLocaleInfoName() { + assertThat(DataMiningStringMessages.Util.getLocaleFor("default"), is(Locale.ENGLISH)); + assertThat(DataMiningStringMessages.Util.getLocaleFor("en"), is(Locale.ENGLISH)); + assertThat(DataMiningStringMessages.Util.getLocaleFor("de"), is(Locale.GERMAN)); + + assertThat(DataMiningStringMessages.Util.getLocaleFor("Unsupported locale info name"), is(Locale.ENGLISH)); + } } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/TestDimensionGroupers.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/TestDimensionGroupers.java deleted file mode 100644 index 4d7c24012ee..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/TestDimensionGroupers.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.sap.sse.datamining.impl.workers; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import org.junit.Test; - -import com.sap.sse.datamining.data.deprecated.Dimension; -import com.sap.sse.datamining.impl.data.deprecated.AbstractDimension; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.shared.impl.CompoundGroupKey; -import com.sap.sse.datamining.shared.impl.GenericGroupKey; -import com.sap.sse.datamining.test.util.OpenDataReceiver; -import com.sap.sse.datamining.test.util.OpenGrouper; -import com.sap.sse.datamining.workers.GroupingWorker; - -public class TestDimensionGroupers { - - @Test - public void testGroupByDimension() { - Dimension crossSum = createCrossSumDimension(); - GroupingWorker groupByDimension = new OpenGrouper(Arrays.asList(crossSum)); - - OpenDataReceiver>> receiver = new OpenDataReceiver<>(); - groupByDimension.setReceiver(receiver); - - Collection data = Arrays.asList(11, 2, 13, 4, 22, 3, 21, 111); - groupByDimension.setDataToGroup(data); - - Map> expectedGroups = new HashMap>(); - Collection group = new ArrayList(); - group.add(11); - group.add(2); - expectedGroups.put(new GenericGroupKey("2"), group); - group = new ArrayList(); - group.add(3); - group.add(21); - group.add(111); - expectedGroups.put(new GenericGroupKey("3"), group); - group = new ArrayList(); - group.add(13); - group.add(4); - group.add(22); - expectedGroups.put(new GenericGroupKey("4"), group); - - groupByDimension.run(); - assertEquals(expectedGroups, receiver.result); - } - - @Test - public void testGroupKeyGeneration() { - Dimension first = new AbstractDimension("First") { - @Override - public String getDimensionValueFrom(Integer data) { - return "First"; - } - }; - Dimension second = new AbstractDimension("Second") { - @Override - public String getDimensionValueFrom(Integer data) { - return "Second"; - } - }; - Dimension third = new AbstractDimension("Third") { - @Override - public String getDimensionValueFrom(Integer data) { - return "Third"; - } - }; - - OpenGrouper grouper = new OpenGrouper(Arrays.asList(first, second, third)); - GroupKey expectedGroupKey = new CompoundGroupKey(new GenericGroupKey("First"), new CompoundGroupKey(new GenericGroupKey("Second"), new GenericGroupKey("Third"))); - assertEquals(expectedGroupKey, grouper.getGroupKey(1)); - } - - @Test - public void testGroupByMultipleDimensions() { - Dimension crossSum = createCrossSumDimension(); - Dimension signum = createSignumDimension(); - GroupingWorker groupByDimensions = new OpenGrouper(Arrays.asList(crossSum, signum)); - - OpenDataReceiver>> receiver = new OpenDataReceiver<>(); - groupByDimensions.setReceiver(receiver); - - Collection data = Arrays.asList(13, -4, 22, -3, 21, -111); - groupByDimensions.setDataToGroup(data); - - Map> expectedGroups = new HashMap>(); - Collection expectedGroup = new ArrayList(); - expectedGroup.add(-3); - expectedGroup.add(-111); - expectedGroups.put(new CompoundGroupKey(new GenericGroupKey("3"), new GenericGroupKey("-1")), expectedGroup); - expectedGroup = new ArrayList(); - expectedGroup.add(13); - expectedGroup.add(22); - expectedGroups.put(new CompoundGroupKey(new GenericGroupKey("4"), new GenericGroupKey("1")), expectedGroup); - expectedGroup = new ArrayList(); - expectedGroup.add(21); - expectedGroups.put(new CompoundGroupKey(new GenericGroupKey("3"), new GenericGroupKey("1")), expectedGroup); - expectedGroup = new ArrayList(); - expectedGroup.add(-4); - expectedGroups.put(new CompoundGroupKey(new GenericGroupKey("4"), new GenericGroupKey("-1")), expectedGroup); - - groupByDimensions.run(); - Map> groups = receiver.result; - for (Entry> expectedGroupEntry : expectedGroups.entrySet()) { - Collection group = groups.get(expectedGroupEntry.getKey()); - assertNotNull("No group for key: " + expectedGroupEntry.getKey().asString(), group); - assertEquals(expectedGroupEntry.getValue(), group); - } - } - - private Dimension createCrossSumDimension() { - return new AbstractDimension("Cross Sum") { - @Override - public String getDimensionValueFrom(Integer data) { - int crossSum = 0; - int value = Math.abs(data); - while (value > 0) { - crossSum += value % 10; - value /= 10; - } - return crossSum + ""; - } - }; - } - - private AbstractDimension createSignumDimension() { - return new AbstractDimension("Signum") { - @Override - public String getDimensionValueFrom(Integer data) { - return ((int) Math.signum(data)) + ""; - } - }; - } - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/TestExtractors.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/TestExtractors.java deleted file mode 100644 index 5812757a77f..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/TestExtractors.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.sap.sse.datamining.impl.workers; - -import static org.junit.Assert.assertEquals; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import org.junit.Test; - -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.shared.impl.GenericGroupKey; -import com.sap.sse.datamining.test.util.OpenDataReceiver; -import com.sap.sse.datamining.test.util.StringLengthExtractor; -import com.sap.sse.datamining.workers.ExtractionWorker; - -public class TestExtractors { - - @Test - public void testAbstractExtractor() { - ExtractionWorker lengthExtractor = new StringLengthExtractor(); - OpenDataReceiver>> receiver = new OpenDataReceiver>>(); - lengthExtractor.setReceiver(receiver); - - Collection dataEntries = Arrays.asList("Fu", "Bar", "Blub"); - Map> data = new HashMap>(); - data.put(new GenericGroupKey(100), dataEntries); - lengthExtractor.setDataToExtractFrom(data); - - - Collection expectedExtractedDataEntries = Arrays.asList(2, 3, 4); - Map> expectedExtractedData = new HashMap>(); - expectedExtractedData.put(new GenericGroupKey(100), expectedExtractedDataEntries); - lengthExtractor.run(); - assertEquals(expectedExtractedData, receiver.result); - } - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/TestFilters.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/TestFilters.java deleted file mode 100644 index 550973e9607..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/TestFilters.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sap.sse.datamining.impl.workers; - -import static org.junit.Assert.assertEquals; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import org.junit.Test; - -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.data.deprecated.ClusterOfComparable; -import com.sap.sse.datamining.impl.criterias.deprecated.SimpleRangeFilterCriteria; -import com.sap.sse.datamining.impl.data.deprecated.ClusterOfComparableImpl; -import com.sap.sse.datamining.test.util.OpenDataReceiver; -import com.sap.sse.datamining.workers.FiltrationWorker; - -public class TestFilters { - - @Test - public void testFilterByCriteria() { - List data = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); - - ClusterOfComparable cluster = new ClusterOfComparableImpl("Test", 5, 1); - FilterCriteria criteria = new SimpleRangeFilterCriteria(cluster); - FiltrationWorker filter = new CriteriaFiltrationWorker(criteria); - filter.setDataToFilter(data); - - OpenDataReceiver> receiver = new OpenDataReceiver<>(); - filter.setReceiver(receiver); - - filter.run(); - Collection expectedFilteredData = Arrays.asList(1, 2, 3, 4, 5); - assertEquals(expectedFilteredData, receiver.result); - } - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/aggregators/TestAggregators.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/aggregators/TestAggregators.java deleted file mode 100644 index b8f0d038616..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/workers/aggregators/TestAggregators.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - -import static org.junit.Assert.assertEquals; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import org.junit.Test; - -import com.sap.sse.datamining.impl.workers.aggregators.helpers.SimpleIntegerSumAggregationHelper; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.shared.impl.GenericGroupKey; -import com.sap.sse.datamining.test.util.OpenDataReceiver; -import com.sap.sse.datamining.workers.AggregationWorker; - -public class TestAggregators { - - @Test - public void testSumAggregator() { - AggregationWorker sumAggregator = new SumAggregationWorker(new SimpleIntegerSumAggregationHelper()); - Map> data = asDataToAggregate(1, 7, 6, 3); - sumAggregator.setDataToAggregate(data); - OpenDataReceiver> receiver = new OpenDataReceiver<>(); - sumAggregator.setReceiver(receiver); - - sumAggregator.run(); - Map expectedAggregation = asAggregatedData(17); - assertEquals(expectedAggregation, receiver.result); - - data = asDataToAggregate(7); - sumAggregator.setDataToAggregate(data); - sumAggregator.run(); - expectedAggregation = asAggregatedData(7); - assertEquals(expectedAggregation, receiver.result); - } - - @Test - public void testAverageAggregator() { - AggregationWorker averageAggregator = new SimpleIntegerArithmeticAverageAggregationWorker(); - Map> data = asDataToAggregate(1, 7, 6, 3); - averageAggregator.setDataToAggregate(data); - OpenDataReceiver> receiver = new OpenDataReceiver<>(); - averageAggregator.setReceiver(receiver); - - averageAggregator.run(); - Map expectedAggregation = asAggregatedData(4); - assertEquals(expectedAggregation, receiver.result); - } - - private Map> asDataToAggregate(Integer... values) { - Collection dataEntries = Arrays.asList(values); - Map> data = new HashMap>(); - data.put(new GenericGroupKey(100), dataEntries); - return data; - } - - private Map asAggregatedData(Integer value) { - Map data = new HashMap(); - data.put(new GenericGroupKey(100), value); - return data; - } - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeInterface.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeInterface.java deleted file mode 100644 index f30a8df504d..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeInterface.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sse.datamining.test.function.test_classes; - -import com.sap.sse.datamining.shared.Unit; -import com.sap.sse.datamining.shared.annotations.SideEffectFreeValue; - -public interface DataTypeInterface { - - @SideEffectFreeValue(messageKey="speedInKnots", resultUnit=Unit.Knots, resultDecimals=2) - public int getSpeedInKnots(); - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeWithContextProcessor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeWithContextProcessor.java deleted file mode 100644 index f8fdd19999d..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeWithContextProcessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sap.sse.datamining.test.function.test_classes; - -import com.sap.sse.datamining.shared.annotations.Dimension; - -public class DataTypeWithContextProcessor { - - @Dimension(messageKey="regattaAndRaceName") - public String getRegattaAndRaceName(DataTypeWithContext dataEntry) { - return dataEntry.getRegattaName() + " - " + dataEntry.getRaceName(); - } - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/ExtendingInterface.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/ExtendingInterface.java deleted file mode 100644 index 86a38d5d4a3..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/ExtendingInterface.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sap.sse.datamining.test.function.test_classes; - -import com.sap.sse.datamining.shared.annotations.SideEffectFreeValue; - -public interface ExtendingInterface { - - @SideEffectFreeValue(messageKey="raceNameLength") - public int getRaceNameLength(); - -} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Boat.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Boat.java new file mode 100644 index 00000000000..523d684b03f --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Boat.java @@ -0,0 +1,10 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes; + +import com.sap.sse.datamining.shared.annotations.Dimension; + +public interface Test_Boat { + + @Dimension(messageKey="SailID") + public String getSailID(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_BoatClass.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_BoatClass.java new file mode 100644 index 00000000000..a4026e7a51e --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_BoatClass.java @@ -0,0 +1,5 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes; + +public interface Test_BoatClass extends Test_Named { + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Competitor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Competitor.java new file mode 100644 index 00000000000..fdddb882e2e --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Competitor.java @@ -0,0 +1,13 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes; + +import com.sap.sse.datamining.shared.annotations.Connector; + +public interface Test_Competitor { + + @Connector + public Test_Team getTeam(); + + @Connector + public Test_Boat getBoat(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_DeadConnectorEnd.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_DeadConnectorEnd.java new file mode 100644 index 00000000000..a1e051a96cd --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_DeadConnectorEnd.java @@ -0,0 +1,7 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes; + +public interface Test_DeadConnectorEnd { + + public int notAnnotatedMethod(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Leg.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Leg.java new file mode 100644 index 00000000000..94ced93e59e --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Leg.java @@ -0,0 +1,11 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes; + +import com.sap.sse.datamining.shared.Unit; +import com.sap.sse.datamining.shared.annotations.Statistic; + +public interface Test_Leg { + + @Statistic(messageKey="DistanceTraveled", resultUnit=Unit.Meters, resultDecimals=0) + public double getDistanceTraveled(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Named.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Named.java new file mode 100644 index 00000000000..564973aee62 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Named.java @@ -0,0 +1,10 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes; + +import com.sap.sse.datamining.shared.annotations.Dimension; + +public interface Test_Named { + + @Dimension(messageKey="Name") + public String getName(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Race.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Race.java new file mode 100644 index 00000000000..7efb1c6058d --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Race.java @@ -0,0 +1,11 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes; + +import java.util.Collection; + +public interface Test_Race extends Test_Named { + + public Collection getCompetitors(); + + public Collection getLegs(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Regatta.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Regatta.java new file mode 100644 index 00000000000..f43ecf94819 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Regatta.java @@ -0,0 +1,13 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes; + +import java.util.Collection; + +public interface Test_Regatta extends Test_Named { + + public Test_BoatClass getBoatClass(); + + public int getYear(); + + public Collection getRaces(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Team.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Team.java new file mode 100644 index 00000000000..75b9b9ee838 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/Test_Team.java @@ -0,0 +1,5 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes; + +public interface Test_Team extends Test_Named { + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_BoatClassImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_BoatClassImpl.java new file mode 100644 index 00000000000..1b986ebd8ff --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_BoatClassImpl.java @@ -0,0 +1,11 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes.impl; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_BoatClass; + +public class Test_BoatClassImpl extends Test_NamedImpl implements Test_BoatClass { + + public Test_BoatClassImpl(String name) { + super(name); + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_BoatImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_BoatImpl.java new file mode 100644 index 00000000000..c8b9fa25295 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_BoatImpl.java @@ -0,0 +1,18 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes.impl; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Boat; + +public class Test_BoatImpl implements Test_Boat { + + private String sailID; + + public Test_BoatImpl(String sailID) { + this.sailID = sailID; + } + + @Override + public String getSailID() { + return sailID; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_CompetitorImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_CompetitorImpl.java new file mode 100644 index 00000000000..090c81a7eb2 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_CompetitorImpl.java @@ -0,0 +1,27 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes.impl; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Boat; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Team; + +public class Test_CompetitorImpl implements Test_Competitor { + + private Test_Team team; + private Test_Boat boat; + + public Test_CompetitorImpl(Test_Team team, Test_Boat boat) { + this.team = team; + this.boat = boat; + } + + @Override + public Test_Team getTeam() { + return team; + } + + @Override + public Test_Boat getBoat() { + return boat; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_DeadConnectorEndImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_DeadConnectorEndImpl.java new file mode 100644 index 00000000000..9c98dd9510d --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_DeadConnectorEndImpl.java @@ -0,0 +1,12 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes.impl; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_DeadConnectorEnd; + +public class Test_DeadConnectorEndImpl implements Test_DeadConnectorEnd { + + @Override + public int notAnnotatedMethod() { + return 0; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_LegImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_LegImpl.java new file mode 100644 index 00000000000..30180fa47f5 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_LegImpl.java @@ -0,0 +1,18 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes.impl; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg; + +public class Test_LegImpl implements Test_Leg { + + private double distanceTraveled; + + public Test_LegImpl(double distanceTraveled) { + this.distanceTraveled = distanceTraveled; + } + + @Override + public double getDistanceTraveled() { + return distanceTraveled; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_NamedImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_NamedImpl.java new file mode 100644 index 00000000000..4a0777cad36 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_NamedImpl.java @@ -0,0 +1,18 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes.impl; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Named; + +public abstract class Test_NamedImpl implements Test_Named { + + private String name; + + public Test_NamedImpl(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_RaceImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_RaceImpl.java new file mode 100644 index 00000000000..4e88f5b8fa3 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_RaceImpl.java @@ -0,0 +1,30 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes.impl; + +import java.util.Collection; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Race; + +public class Test_RaceImpl extends Test_NamedImpl implements Test_Race { + + private Collection competitors; + private Collection legs; + + public Test_RaceImpl(String name, Collection competitors, Collection legs) { + super(name); + this.competitors = competitors; + this.legs = legs; + } + + @Override + public Collection getCompetitors() { + return competitors; + } + + @Override + public Collection getLegs() { + return legs; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_RegattaImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_RegattaImpl.java new file mode 100644 index 00000000000..9eac64cc278 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_RegattaImpl.java @@ -0,0 +1,38 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes.impl; + +import java.util.Arrays; +import java.util.Collection; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_BoatClass; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Race; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta; + +public class Test_RegattaImpl extends Test_NamedImpl implements Test_Regatta { + + private Test_BoatClass boatClass; + private int year; + private Collection races; + + public Test_RegattaImpl(String name, Test_BoatClass boatClass, int year, Test_Race... races) { + super(name); + this.boatClass = boatClass; + this.year = year; + this.races = Arrays.asList(races); + } + + @Override + public Test_BoatClass getBoatClass() { + return boatClass; + } + + @Override + public int getYear() { + return year; + } + + @Override + public Collection getRaces() { + return races; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_TeamImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_TeamImpl.java new file mode 100644 index 00000000000..f1778c823b2 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_classes/impl/Test_TeamImpl.java @@ -0,0 +1,11 @@ +package com.sap.sse.datamining.test.functions.registry.test_classes.impl; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Team; + +public class Test_TeamImpl extends Test_NamedImpl implements Test_Team { + + public Test_TeamImpl(String name) { + super(name); + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasContextWithDeadConnectorEnd.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasContextWithDeadConnectorEnd.java new file mode 100644 index 00000000000..99c27219562 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasContextWithDeadConnectorEnd.java @@ -0,0 +1,26 @@ +package com.sap.sse.datamining.test.functions.registry.test_contexts; + +import com.sap.sse.datamining.functions.FunctionRegistry; +import com.sap.sse.datamining.shared.annotations.Connector; +import com.sap.sse.datamining.shared.annotations.Dimension; +import com.sap.sse.datamining.shared.annotations.Statistic; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_DeadConnectorEnd; + +/** + * This class is used to test the case, that some as {@link Connector} annotated methods could + * lead to nothing usable. This shouldn't occur, but could when Connectors were missed, after + * some {@link Dimension Dimensions} or {@link Statistic Statistics} have been removed. + * + * @author Lennart Hensler (D054527) + */ +public interface Test_HasContextWithDeadConnectorEnd { + + /** + * This "connection" method doesn't lead to anything usable (like Dimensions or Statistics), + * so the methods of {@link Test_DeadConnectorEnd} (which aren't annotated) + * should be ignored by {@link FunctionRegistry FunctionRegistries}. + */ + @Connector + public Test_DeadConnectorEnd getDeadConnectorEnd(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasContextWithDeadConnectorEndImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasContextWithDeadConnectorEndImpl.java new file mode 100644 index 00000000000..907ab163535 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasContextWithDeadConnectorEndImpl.java @@ -0,0 +1,12 @@ +package com.sap.sse.datamining.test.functions.registry.test_contexts; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_DeadConnectorEnd; + +public class Test_HasContextWithDeadConnectorEndImpl implements Test_HasContextWithDeadConnectorEnd { + + @Override + public Test_DeadConnectorEnd getDeadConnectorEnd() { + return null; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasLegContext.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasLegContext.java new file mode 100644 index 00000000000..b5be40e6a22 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasLegContext.java @@ -0,0 +1,19 @@ +package com.sap.sse.datamining.test.functions.registry.test_contexts; + +import com.sap.sse.datamining.shared.annotations.Connector; +import com.sap.sse.datamining.shared.annotations.Dimension; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg; + +public interface Test_HasLegContext extends Test_HasRaceContext { + + @Connector + public Test_Leg getLeg(); + + @Dimension(messageKey="LegNumber") + public int getLegNumber(); + + @Connector + public Test_Competitor getCompetitor(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasLegContextImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasLegContextImpl.java new file mode 100644 index 00000000000..d2415ee3bb8 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasLegContextImpl.java @@ -0,0 +1,38 @@ +package com.sap.sse.datamining.test.functions.registry.test_contexts; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_BoatClass; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Race; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta; + +public class Test_HasLegContextImpl extends Test_HasRaceContextImpl implements Test_HasLegContext { + + private Test_Leg leg; + private int legNumber; + private Test_Competitor competitor; + + public Test_HasLegContextImpl(Test_Regatta regatta, Test_Race race, Test_BoatClass boatClass, int year, + Test_Leg leg, int legNumber, Test_Competitor competitor) { + super(regatta, race, boatClass, year); + this.leg = leg; + this.legNumber = legNumber; + this.competitor = competitor; + } + + @Override + public Test_Leg getLeg() { + return leg; + } + + @Override + public int getLegNumber() { + return legNumber; + } + + @Override + public Test_Competitor getCompetitor() { + return competitor; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasRaceContext.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasRaceContext.java new file mode 100644 index 00000000000..3277faed0b0 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasRaceContext.java @@ -0,0 +1,23 @@ +package com.sap.sse.datamining.test.functions.registry.test_contexts; + +import com.sap.sse.datamining.shared.annotations.Connector; +import com.sap.sse.datamining.shared.annotations.Dimension; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_BoatClass; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Race; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta; + +public interface Test_HasRaceContext { + + @Connector + public Test_Regatta getRegatta(); + + @Connector + public Test_Race getRace(); + + @Connector + public Test_BoatClass getBoatClass(); + + @Dimension(messageKey="Year") + public int getYear(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasRaceContextImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasRaceContextImpl.java new file mode 100644 index 00000000000..5b60bae553d --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/registry/test_contexts/Test_HasRaceContextImpl.java @@ -0,0 +1,41 @@ +package com.sap.sse.datamining.test.functions.registry.test_contexts; + +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_BoatClass; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Race; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Regatta; + +public class Test_HasRaceContextImpl implements Test_HasRaceContext { + + private Test_Regatta regatta; + private Test_Race race; + private Test_BoatClass boatClass; + private int year; + + public Test_HasRaceContextImpl(Test_Regatta regatta, Test_Race race, Test_BoatClass boatClass, int year) { + this.regatta = regatta; + this.race = race; + this.boatClass = boatClass; + this.year = year; + } + + @Override + public Test_Regatta getRegatta() { + return regatta; + } + + @Override + public Test_Race getRace() { + return race; + } + + @Override + public Test_BoatClass getBoatClass() { + return boatClass; + } + + @Override + public int getYear() { + return year; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ContainerElement.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ContainerElement.java new file mode 100644 index 00000000000..c46d2076ac7 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ContainerElement.java @@ -0,0 +1,10 @@ +package com.sap.sse.datamining.test.functions.test_classes; + +import com.sap.sse.datamining.shared.annotations.Dimension; + +public interface ContainerElement { + + @Dimension(messageKey="name") + public String getName(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ContainerElementImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ContainerElementImpl.java new file mode 100644 index 00000000000..bbaf7e02800 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ContainerElementImpl.java @@ -0,0 +1,16 @@ +package com.sap.sse.datamining.test.functions.test_classes; + +public class ContainerElementImpl implements ContainerElement { + + private String name; + + public ContainerElementImpl(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/DataTypeInterface.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/DataTypeInterface.java new file mode 100644 index 00000000000..1dded621f10 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/DataTypeInterface.java @@ -0,0 +1,11 @@ +package com.sap.sse.datamining.test.functions.test_classes; + +import com.sap.sse.datamining.shared.Unit; +import com.sap.sse.datamining.shared.annotations.Statistic; + +public interface DataTypeInterface { + + @Statistic(messageKey="speedInKnots", resultUnit=Unit.Knots, resultDecimals=2) + public int getSpeedInKnots(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeWithContext.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/DataTypeWithContext.java similarity index 88% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeWithContext.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/DataTypeWithContext.java index 48be7950e1f..cbdb8853fd1 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeWithContext.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/DataTypeWithContext.java @@ -1,4 +1,4 @@ -package com.sap.sse.datamining.test.function.test_classes; +package com.sap.sse.datamining.test.functions.test_classes; import com.sap.sse.datamining.shared.annotations.Dimension; diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeWithContextImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/DataTypeWithContextImpl.java similarity index 93% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeWithContextImpl.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/DataTypeWithContextImpl.java index 5f225e00715..542d6bdf994 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/DataTypeWithContextImpl.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/DataTypeWithContextImpl.java @@ -1,4 +1,4 @@ -package com.sap.sse.datamining.test.function.test_classes; +package com.sap.sse.datamining.test.functions.test_classes; public class DataTypeWithContextImpl implements DataTypeWithContext, ExtendingInterface { diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ExtendingInterface.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ExtendingInterface.java new file mode 100644 index 00000000000..25bcd1d6157 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ExtendingInterface.java @@ -0,0 +1,10 @@ +package com.sap.sse.datamining.test.functions.test_classes; + +import com.sap.sse.datamining.shared.annotations.Connector; + +public interface ExtendingInterface { + + @Connector + public int getRaceNameLength(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/MarkedContainer.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/MarkedContainer.java new file mode 100644 index 00000000000..9bdcccb1fef --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/MarkedContainer.java @@ -0,0 +1,10 @@ +package com.sap.sse.datamining.test.functions.test_classes; + +import com.sap.sse.datamining.shared.annotations.Connector; + +public interface MarkedContainer { + + @Connector + public ContainerElement getContainerElement(); + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/MarkedContainerImpl.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/MarkedContainerImpl.java new file mode 100644 index 00000000000..34ed2e3a220 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/MarkedContainerImpl.java @@ -0,0 +1,16 @@ +package com.sap.sse.datamining.test.functions.test_classes; + +public class MarkedContainerImpl implements MarkedContainer { + + private ContainerElement containerElement; + + public MarkedContainerImpl(ContainerElement containerElement) { + this.containerElement = containerElement; + } + + @Override + public ContainerElement getContainerElement() { + return containerElement; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/SimpleClassWithMarkedMethods.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/SimpleClassWithMarkedMethods.java similarity index 80% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/SimpleClassWithMarkedMethods.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/SimpleClassWithMarkedMethods.java index 6d0f02703d7..35cc17cec34 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/SimpleClassWithMarkedMethods.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/SimpleClassWithMarkedMethods.java @@ -1,7 +1,7 @@ -package com.sap.sse.datamining.test.function.test_classes; +package com.sap.sse.datamining.test.functions.test_classes; import com.sap.sse.datamining.shared.annotations.Dimension; -import com.sap.sse.datamining.shared.annotations.SideEffectFreeValue; +import com.sap.sse.datamining.shared.annotations.Statistic; /* * DON'T CHANGE THE METHOD/CLASS NAMES! @@ -21,7 +21,7 @@ public class SimpleClassWithMarkedMethods { } - @SideEffectFreeValue(messageKey="value") + @Statistic(messageKey="value") public int sideEffectFreeValue() { return 1; } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/ExternalLibraryClass.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/Test_ExternalLibraryClass.java similarity index 74% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/ExternalLibraryClass.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/Test_ExternalLibraryClass.java index e829109147a..87e886985ff 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/function/test_classes/ExternalLibraryClass.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/Test_ExternalLibraryClass.java @@ -1,11 +1,11 @@ -package com.sap.sse.datamining.test.function.test_classes; +package com.sap.sse.datamining.test.functions.test_classes; /* * DON'T CHANGE THE METHOD/CLASS NAMES! * The tests will fail, because they are reflected via constant strings. */ -public class ExternalLibraryClass { +public class Test_ExternalLibraryClass { //This method shouldn't be retrieved, because it has no return type public void fooVoid() { diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/ConcurrencyTestsUtil.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/ConcurrencyTestsUtil.java index 258233493eb..4f44feb45ea 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/ConcurrencyTestsUtil.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/ConcurrencyTestsUtil.java @@ -1,12 +1,19 @@ package com.sap.sse.datamining.test.util; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; +import java.util.Collection; +import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.shared.GroupKey; public class ConcurrencyTestsUtil extends TestsUtil { @@ -32,6 +39,23 @@ public class ConcurrencyTestsUtil extends TestsUtil { } } + public static void processElements(Processor processor, Collection elements) { + for (T element : elements) { + processor.processElement(element); + } + } + + public static void verifyResultData(Map resultData, Map expectedResultData) { + assertThat("No aggregation has been received.", resultData, notNullValue()); + + for (Entry expectedReceivedAggregationEntry : expectedResultData.entrySet()) { + assertThat("The expected aggregation entry '" + expectedReceivedAggregationEntry + "' wasn't received.", + resultData.containsKey(expectedReceivedAggregationEntry.getKey()), is(true)); + assertThat("The result for group '" + expectedReceivedAggregationEntry.getKey() + "' isn't correct.", + resultData.get(expectedReceivedAggregationEntry.getKey()), is(expectedReceivedAggregationEntry.getValue())); + } + } + public static void tryToFinishTheProcessorInAnotherThread(final Processor processor) { Runnable finishingRunnable = new Runnable() { @Override diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/ExpectedFunctionRegistryUtil.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/ExpectedFunctionRegistryUtil.java new file mode 100644 index 00000000000..29b86fc2231 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/ExpectedFunctionRegistryUtil.java @@ -0,0 +1,146 @@ +package com.sap.sse.datamining.test.util; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +import com.sap.sse.datamining.factories.FunctionFactory; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Boat; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Competitor; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg; +import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Named; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; + +public class ExpectedFunctionRegistryUtil { + + private final HashMap, Collection>> expectedDimensions; + private final HashMap, Collection>> expectedStatistics; + private final HashMap, Collection>> expectedExternalFunctions; + + public ExpectedFunctionRegistryUtil() throws NoSuchMethodException, SecurityException { + expectedDimensions = new HashMap<>(); + expectedStatistics = new HashMap<>(); + expectedExternalFunctions = new HashMap<>(); + + buildExpectedFunctions(); + } + + private void buildExpectedFunctions() throws NoSuchMethodException, SecurityException { + buildExpectedDimensions(); + buildExpectedStatistics(); + buildExpectedExternalFunctions(); + } + + private void buildExpectedDimensions() throws NoSuchMethodException, SecurityException { + Method getNameMethod = Test_Named.class.getMethod("getName", new Class[0]); + Function getName = FunctionFactory.createMethodWrappingFunction(getNameMethod); + + Method getRegattaMethod = Test_HasRaceContext.class.getMethod("getRegatta", new Class[0]); + Function getRegatta = FunctionFactory.createMethodWrappingFunction(getRegattaMethod); + addExpectedDimension(FunctionFactory.createCompoundFunction(null, Arrays.asList(getRegatta, getName))); + + Method getRaceMethod = Test_HasRaceContext.class.getMethod("getRace", new Class[0]); + Function getRace = FunctionFactory.createMethodWrappingFunction(getRaceMethod); + addExpectedDimension(FunctionFactory.createCompoundFunction(null, Arrays.asList(getRace, getName))); + + Method getBoatClassMethod = Test_HasRaceContext.class.getMethod("getBoatClass", new Class[0]); + Function getBoatClass = FunctionFactory.createMethodWrappingFunction(getBoatClassMethod); + addExpectedDimension(FunctionFactory.createCompoundFunction(null, Arrays.asList(getBoatClass, getName))); + + Method getYearMethod = Test_HasRaceContext.class.getMethod("getYear", new Class[0]); + addExpectedDimension(FunctionFactory.createMethodWrappingFunction(getYearMethod)); + + Method getLegNumberMethod = Test_HasLegContext.class.getMethod("getLegNumber", new Class[0]); + addExpectedDimension(FunctionFactory.createMethodWrappingFunction(getLegNumberMethod)); + + Method getCompetitorMethod = Test_HasLegContext.class.getMethod("getCompetitor", new Class[0]); + Function getCompetitor = FunctionFactory.createMethodWrappingFunction(getCompetitorMethod); + + Method getTeamMethod = Test_Competitor.class.getMethod("getTeam", new Class[0]); + Function getTeam = FunctionFactory.createMethodWrappingFunction(getTeamMethod); + addExpectedDimension(FunctionFactory.createCompoundFunction(null, Arrays.asList(getCompetitor, getTeam, getName))); + + Method getBoatMethod = Test_Competitor.class.getMethod("getBoat", new Class[0]); + Function getBoat = FunctionFactory.createMethodWrappingFunction(getBoatMethod); + Method getSailIDMethod = Test_Boat.class.getMethod("getSailID", new Class[0]); + Function getSailID = FunctionFactory.createMethodWrappingFunction(getSailIDMethod); + addExpectedDimension(FunctionFactory.createCompoundFunction(null, Arrays.asList(getCompetitor, getBoat, getSailID))); + } + + private void addExpectedDimension(Function dimension) { + Class declaringType = dimension.getDeclaringType(); + if (!expectedDimensions.containsKey(declaringType)) { + expectedDimensions.put(declaringType, new HashSet>()); + } + expectedDimensions.get(declaringType).add(dimension); + } + + private void buildExpectedStatistics() throws NoSuchMethodException, SecurityException { + Method getLegMethod = Test_HasLegContext.class.getMethod("getLeg", new Class[0]); + Function getLeg = FunctionFactory.createMethodWrappingFunction(getLegMethod); + Method getDistanceTraveledMethod = Test_Leg.class.getMethod("getDistanceTraveled", new Class[0]); + Function getDistanceTraveled = FunctionFactory.createMethodWrappingFunction(getDistanceTraveledMethod); + addExpectedStatistic(FunctionFactory.createCompoundFunction(null, Arrays.asList(getLeg, getDistanceTraveled))); + } + + private void addExpectedStatistic(Function statistic) { + Class declaringType = statistic.getDeclaringType(); + if (!expectedStatistics.containsKey(declaringType)) { + expectedStatistics.put(declaringType, new HashSet>()); + } + expectedStatistics.get(declaringType).add(statistic); + } + + private void buildExpectedExternalFunctions() throws NoSuchMethodException, SecurityException { + Method fooMethod = Test_ExternalLibraryClass.class.getMethod("foo", new Class[0]); + Function foo = FunctionFactory.createMethodWrappingFunction(fooMethod); + addExpectedExternalFunction(foo); + } + + private void addExpectedExternalFunction(Function externalFunction) { + Class declaringType = externalFunction.getDeclaringType(); + if (!expectedExternalFunctions.containsKey(declaringType)) { + expectedExternalFunctions.put(declaringType, new HashSet>()); + } + expectedExternalFunctions.get(declaringType).add(externalFunction); + } + + public Collection> getAllExpectedStatistics() { + Collection> expectedStatistics = new HashSet<>(); + for (Collection> statisticsForType : this.expectedStatistics.values()) { + expectedStatistics.addAll(statisticsForType); + } + return expectedStatistics; + } + + public Collection> getExpectedDimensionsFor(Class declaringType) { + Collection> expectedDimensions = this.expectedDimensions.get(declaringType); + return expectedDimensions != null ? expectedDimensions : new ArrayList>(); + } + + public Collection> getExpectedStatisticsFor(Class declaringType) { + Collection> expectedStatistics = this.expectedStatistics.get(declaringType); + return expectedStatistics != null ? expectedStatistics : new ArrayList>(); + } + + public Collection> getExpectedExternalFunctionsFor(Class declaringType) { + Collection> expectedExternalFunctions = this.expectedExternalFunctions.get(declaringType); + return expectedExternalFunctions != null ? expectedExternalFunctions : new ArrayList>(); + } + + public Set> getExpectedFunctionsFor(Class declaringType) { + Set> expectedFunctions = new HashSet<>(); + expectedFunctions.addAll(getExpectedDimensionsFor(declaringType)); + expectedFunctions.addAll(getExpectedStatisticsFor(declaringType)); + expectedFunctions.addAll(getExpectedExternalFunctionsFor(declaringType)); + return expectedFunctions; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/FunctionTestsUtil.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/FunctionTestsUtil.java index 41fc7c9cfad..5f74065a60f 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/FunctionTestsUtil.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/FunctionTestsUtil.java @@ -9,13 +9,12 @@ import java.util.Set; import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.test.function.test_classes.DataTypeInterface; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContext; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextImpl; -import com.sap.sse.datamining.test.function.test_classes.DataTypeWithContextProcessor; -import com.sap.sse.datamining.test.function.test_classes.ExtendingInterface; -import com.sap.sse.datamining.test.function.test_classes.ExternalLibraryClass; -import com.sap.sse.datamining.test.function.test_classes.SimpleClassWithMarkedMethods; +import com.sap.sse.datamining.test.functions.test_classes.DataTypeInterface; +import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext; +import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContextImpl; +import com.sap.sse.datamining.test.functions.test_classes.ExtendingInterface; +import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedMethods; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; public class FunctionTestsUtil extends ConcurrencyTestsUtil { @@ -37,7 +36,7 @@ public class FunctionTestsUtil extends ConcurrencyTestsUtil { } public static Method getMethodFromExternalLibraryClass(String name) { - return getMethodFromClass(ExternalLibraryClass.class, name); + return getMethodFromClass(Test_ExternalLibraryClass.class, name); } public static Collection> getMarkedMethodsOfDataTypeWithContextImplAndItsSupertypes() { @@ -90,7 +89,6 @@ public class FunctionTestsUtil extends ConcurrencyTestsUtil { dimensions.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getRegattaName"))); dimensions.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getRaceName"))); dimensions.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContext.class, "getLegNumber"))); - dimensions.add(FunctionFactory.createMethodWrappingFunction(getMethodFromClass(DataTypeWithContextProcessor.class, "getRegattaAndRaceName", DataTypeWithContext.class))); return dimensions; } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/OpenDataReceiver.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/OpenDataReceiver.java deleted file mode 100644 index a564868808a..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/OpenDataReceiver.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sap.sse.datamining.test.util; - -import com.sap.sse.datamining.workers.WorkReceiver; - -public class OpenDataReceiver implements WorkReceiver { - - public ResultType result; - - @Override - public void receiveWork(ResultType result) { - this.result = result; - } - -} \ No newline at end of file diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/OpenGrouper.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/OpenGrouper.java deleted file mode 100644 index 4790f0e22e2..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/OpenGrouper.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sap.sse.datamining.test.util; - -import java.util.Collection; - -import com.sap.sse.datamining.data.deprecated.Dimension; -import com.sap.sse.datamining.impl.workers.MultiDimensionalGroupingWorker; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.shared.impl.GenericGroupKey; - -public class OpenGrouper extends MultiDimensionalGroupingWorker { - - public OpenGrouper(Collection> dimensions) { - super(dimensions); - } - - @Override - protected GroupKey createGroupKeyFor(DataType dataEntry, Dimension dimension) { - return new GenericGroupKey(dimension.getDimensionValueFrom(dataEntry)); - } - - public GroupKey getGroupKey(DataType dataEntry) { - return getGroupKeyFor(dataEntry); - } - -} \ No newline at end of file diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/StringLengthExtractor.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/StringLengthExtractor.java deleted file mode 100644 index c7fbfd296f4..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/StringLengthExtractor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sap.sse.datamining.test.util; - -import com.sap.sse.datamining.impl.workers.extractors.AbstractExtractionWorker; - -public class StringLengthExtractor extends AbstractExtractionWorker { - - @Override - public Integer extract(String dataEntry) { - return dataEntry.length(); - } - -} \ No newline at end of file diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/StringRegexFilterCriteria.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/StringRegexFilterCriteria.java deleted file mode 100644 index 7bf9a089d70..00000000000 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/StringRegexFilterCriteria.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sap.sse.datamining.test.util; - -import com.sap.sse.datamining.impl.criterias.RegexFilterCriteria; - -public class StringRegexFilterCriteria extends RegexFilterCriteria { - - public StringRegexFilterCriteria(String regex) { - super(regex); - } - - @Override - protected String getValueToMatch(String data) { - return data; - } - -} \ No newline at end of file diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/StringRegexFilterCriterion.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/StringRegexFilterCriterion.java new file mode 100644 index 00000000000..906e70f0bf5 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/StringRegexFilterCriterion.java @@ -0,0 +1,16 @@ +package com.sap.sse.datamining.test.util; + +import com.sap.sse.datamining.impl.criterias.RegexFilterCriterion; + +public class StringRegexFilterCriterion extends RegexFilterCriterion { + + public StringRegexFilterCriterion(String regex) { + super(regex); + } + + @Override + protected String getValueToMatch(String data) { + return data; + } + +} \ No newline at end of file diff --git a/java/com.sap.sse.datamining/META-INF/MANIFEST.MF b/java/com.sap.sse.datamining/META-INF/MANIFEST.MF index 5c92692f649..69be7c41808 100644 --- a/java/com.sap.sse.datamining/META-INF/MANIFEST.MF +++ b/java/com.sap.sse.datamining/META-INF/MANIFEST.MF @@ -6,33 +6,20 @@ Bundle-Version: 1.0.0.qualifier Bundle-Vendor: SAP Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Import-Package: org.osgi.framework;version="1.7.0" -Export-Package: com.sap.sse.datamining;uses:="com.sap.sse.datamining.functions,com.sap.sse.datamining.shared", - com.sap.sse.datamining.components;uses:="com.sap.sse.datamining.shared", - com.sap.sse.datamining.data.deprecated, - com.sap.sse.datamining.factories;uses:="com.sap.sse.datamining.impl.functions", - com.sap.sse.datamining.functions;uses:="com.sap.sse.datamining.shared.dto,com.sap.sse.datamining.i18n,com.sap.sse.datamining.components", - com.sap.sse.datamining.i18n;uses:="com.sap.sse.datamining.shared", - com.sap.sse.datamining.impl; - uses:="com.sap.sse.datamining, - com.sap.sse.datamining.functions, - org.osgi.framework, - com.sap.sse.datamining.shared, - com.sap.sse.datamining.i18n, - com.sap.sse.datamining.components", - com.sap.sse.datamining.impl.components;uses:="com.sap.sse.datamining.workers,com.sap.sse.datamining.shared,com.sap.sse.datamining.components", - com.sap.sse.datamining.impl.components.deprecated, - com.sap.sse.datamining.impl.criterias;uses:="com.sap.sse.datamining.data,com.sap.sse.datamining.functions,com.sap.sse.datamining.components", - com.sap.sse.datamining.impl.criterias.deprecated, - com.sap.sse.datamining.impl.data.deprecated;uses:="com.sap.sse.datamining.data", - com.sap.sse.datamining.impl.deprecated, - com.sap.sse.datamining.impl.i18n;uses:="com.sap.sse.datamining.shared,com.sap.sse.datamining.i18n", - com.sap.sse.datamining.impl.workers, - com.sap.sse.datamining.impl.workers.aggregators, - com.sap.sse.datamining.impl.workers.aggregators.helpers, - com.sap.sse.datamining.impl.workers.builders;uses:="com.sap.sse.datamining.workers,com.sap.sse.datamining.components", - com.sap.sse.datamining.impl.workers.extractors, - com.sap.sse.datamining.impl.workers.retrievers, - com.sap.sse.datamining.workers -Require-Bundle: com.sap.sse.datamining.shared;bundle-version="1.0.0", - com.sap.sailing.domain.common;bundle-version="1.0.0" +Export-Package: com.sap.sse.datamining, + com.sap.sse.datamining.components, + com.sap.sse.datamining.data, + com.sap.sse.datamining.factories, + com.sap.sse.datamining.functions, + com.sap.sse.datamining.i18n, + com.sap.sse.datamining.impl, + com.sap.sse.datamining.impl.components, + com.sap.sse.datamining.impl.components.aggregators, + com.sap.sse.datamining.impl.criterias, + com.sap.sse.datamining.impl.data, + com.sap.sse.datamining.impl.functions, + com.sap.sse.datamining.impl.functions.criterias, + com.sap.sse.datamining.impl.i18n +Require-Bundle: com.sap.sse.datamining.shared;bundle-version="1.0.0" Bundle-Activator: com.sap.sse.datamining.impl.DataMiningActivator +Bundle-ActivationPolicy: lazy diff --git a/java/com.sap.sse.datamining/resources/stringmessages/StringMessages_de.properties b/java/com.sap.sse.datamining/resources/stringmessages/StringMessages_de.properties index bbfd6455b07..35fbe039cba 100644 --- a/java/com.sap.sse.datamining/resources/stringmessages/StringMessages_de.properties +++ b/java/com.sap.sse.datamining/resources/stringmessages/StringMessages_de.properties @@ -5,5 +5,22 @@ Distance=Distanz Speed=Geschwindigkeit Meters=Metern Knots=Knoten +InKnots=in Knoten +DistanceTraveled=zurückgelegte Distanz +Collecting=Sammlung ResultSignifier={0} ({1}) -SignifierInUnit={0} in {1} \ No newline at end of file +SignifierInUnit={0} in {1} +Name=Name +LegType=Art des Schenkels +SailID=Segelnummer +Year=Jahr +LegNumber=Nummer des Schenkels +NationalityAcronym=Nationalität +Regatta=Regatta +CourseArea=Regattabahn +BoatClass=Bootsklasse +Fleet=Flotte +Race=Rennen +Competitor=Teilnehmer +Boat=Boot +Team=Team \ No newline at end of file diff --git a/java/com.sap.sse.datamining/resources/stringmessages/StringMessages_en.properties b/java/com.sap.sse.datamining/resources/stringmessages/StringMessages_en.properties index f8d9259363f..109c1cbc2fe 100644 --- a/java/com.sap.sse.datamining/resources/stringmessages/StringMessages_en.properties +++ b/java/com.sap.sse.datamining/resources/stringmessages/StringMessages_en.properties @@ -5,5 +5,22 @@ Distance=Distance Speed=Speed Meters=meters Knots=knots +InKnots=in knots +DistanceTraveled=Distance Traveled +Collecting=Collection ResultSignifier={0} ({1}) -SignifierInUnit={0} in {1} \ No newline at end of file +SignifierInUnit={0} in {1} +Name=Name +LegType=Leg Type +SailID=Sail Number +Year=Year +LegNumber=Leg Number +NationalityAcronym=Nationality +Regatta=Regatta +CourseArea=Course Area +BoatClass=Boat Class +Fleet=Fleet +Race=Race +Competitor=Competitor +Boat=Boat +Team=Team \ No newline at end of file diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/AdditionalResultDataBuilder.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/AdditionalResultDataBuilder.java index 017a8a44838..ffcc6a6d907 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/AdditionalResultDataBuilder.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/AdditionalResultDataBuilder.java @@ -16,8 +16,6 @@ public interface AdditionalResultDataBuilder { public void setRetrievedDataAmount(int retrievedDataAmount); - public void setFilteredDataAmount(int filteredDataAmount); - public void setExtractionFunction(Function extractionFunction); public void setAggregationNameMessageKey(String aggregationNameMessageKey); diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/ClassesWithFunctionsProvider.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/ClassesWithFunctionsProvider.java new file mode 100644 index 00000000000..cebfee30ab8 --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/ClassesWithFunctionsProvider.java @@ -0,0 +1,10 @@ +package com.sap.sse.datamining; + +import java.util.Set; + +public interface ClassesWithFunctionsProvider { + + public Set> getInternalClassesWithMarkedMethods(); + public Set> getExternalLibraryClasses(); + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/ClassesWithFunctionsService.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/ClassesWithFunctionsService.java new file mode 100644 index 00000000000..d73a74abd2a --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/ClassesWithFunctionsService.java @@ -0,0 +1,10 @@ +package com.sap.sse.datamining; + +import java.util.Set; + +public interface ClassesWithFunctionsService { + + public Set> getInternalClassesWithMarkedMethods(); + public Set> getExternalLibraryClasses(); + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataMiningServer.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataMiningServer.java index 3530db2c5e5..15baf498577 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataMiningServer.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataMiningServer.java @@ -2,6 +2,7 @@ package com.sap.sse.datamining; import com.sap.sse.datamining.functions.FunctionProvider; import com.sap.sse.datamining.functions.FunctionRegistry; +import com.sap.sse.datamining.i18n.DataMiningStringMessages; public interface DataMiningServer { @@ -9,4 +10,6 @@ public interface DataMiningServer { public FunctionProvider getFunctionProvider(); + public DataMiningStringMessages getStringMessages(); + } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/FilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/FilterCriterion.java similarity index 70% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/FilterCriteria.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/FilterCriterion.java index dda313de13e..96f594d0b8b 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/FilterCriteria.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/FilterCriterion.java @@ -1,6 +1,6 @@ package com.sap.sse.datamining.components; -public interface FilterCriteria { +public interface FilterCriterion { public boolean matches(T element); diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelAggregator.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelAggregator.java deleted file mode 100644 index 6c2d45a6f7a..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelAggregator.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sap.sse.datamining.components; - -import java.util.Collection; -import java.util.Map; - -import com.sap.sse.datamining.shared.GroupKey; - -public interface ParallelAggregator extends ParallelComponent>, - Map> { - - public String getName(); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelComponent.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelComponent.java deleted file mode 100644 index 2f91f214029..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelComponent.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sse.datamining.components; - -import java.util.concurrent.Future; - -public interface ParallelComponent extends Future { - /** - * @return this object - */ - public ParallelComponent start(WorkingType data); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelDataRetriever.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelDataRetriever.java deleted file mode 100644 index c1ce09a9e45..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelDataRetriever.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.sap.sse.datamining.components; - -import java.util.Collection; - - -public interface ParallelDataRetriever extends ParallelComponent> { - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelExtractor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelExtractor.java deleted file mode 100644 index 1b2f597b5e8..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelExtractor.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.sap.sse.datamining.components; - -import java.util.Collection; -import java.util.Map; - -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.shared.Unit; - -public interface ParallelExtractor extends ParallelComponent>, - Map>> { - - public Unit getUnit(); - - public int getValueDecimals(); - - public String getSignifier(); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelFilter.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelFilter.java deleted file mode 100644 index c7d20abc29c..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelFilter.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sap.sse.datamining.components; - -import java.util.Collection; - -public interface ParallelFilter extends ParallelComponent, Collection> { - -} \ No newline at end of file diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelGrouper.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelGrouper.java deleted file mode 100644 index b4a0b2e08fc..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/ParallelGrouper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sap.sse.datamining.components; - -import java.util.Collection; -import java.util.Map; - -import com.sap.sse.datamining.shared.GroupKey; - -public interface ParallelGrouper extends ParallelComponent, Map>> { - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/Processor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/Processor.java index ea41e69ecbd..2b4250c4a57 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/Processor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/Processor.java @@ -4,16 +4,34 @@ import com.sap.sse.datamining.AdditionalResultDataBuilder; public interface Processor { - public void onElement(InputType element); + /** + * Processes the given element and forwards the result. + * @param element The element to process. + */ + public void processElement(InputType element); /** - * Tells this Processor, that there will be no incoming data.
+ * This method handles the throwing of Throwables, so they don't get lost because of the + * multi-threading.
+ * The standard implementation is forwarding them to the last processor, + * that collects the failures, until the processing is finished. Than the failures will be + * handled. + * @param failure The thrown failure. + */ + void onFailure(Throwable failure); + + /** + * Tells this Processor, that there won't be data incoming anymore.
* The called Processor will finish his work and call finish() on all subsequent processors. * * @throws InterruptedException */ public void finish() throws InterruptedException; + /** + * Aborts the processing immediately. The result will be null, incomplete or undefined.
+ * To shut down the process cleanly use {@link #finish()}. + */ public void abort(); /** diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/data/deprecated/Cluster.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/data/deprecated/Cluster.java deleted file mode 100644 index aa2b0d7f4a1..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/data/deprecated/Cluster.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sap.sse.datamining.data.deprecated; - -import java.util.Comparator; - -public interface Cluster { - - public String getName(); - public ValueType getUpperRange(); - public ValueType getLowerRange(); - - public boolean isInRange(ValueType value, Comparator comparator); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/data/deprecated/ClusterOfComparable.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/data/deprecated/ClusterOfComparable.java deleted file mode 100644 index 023512605e6..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/data/deprecated/ClusterOfComparable.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sap.sse.datamining.data.deprecated; - -public interface ClusterOfComparable> extends Cluster { - - public boolean isInRange(ValueType value); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/data/deprecated/Dimension.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/data/deprecated/Dimension.java deleted file mode 100644 index a6b2b56105d..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/data/deprecated/Dimension.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sse.datamining.data.deprecated; - -public interface Dimension { - - public String getName(); - - public ValueType getDimensionValueFrom(DataType dataEntry); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/AggregatorFactory.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/AggregatorFactory.java deleted file mode 100644 index 0695142ab68..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/AggregatorFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sap.sse.datamining.factories; - -import java.util.Locale; -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sse.datamining.components.ParallelAggregator; -import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.impl.components.deprecated.GroupDividingParallelAggregator; -import com.sap.sse.datamining.impl.workers.builders.AggregationWorkerBuilder; -import com.sap.sse.datamining.shared.components.AggregatorType; -import com.sap.sse.datamining.shared.components.ElementType; -import com.sap.sse.datamining.workers.AggregationWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public final class AggregatorFactory { - - private AggregatorFactory() { } - - public static ParallelAggregator createAggregator(DataMiningStringMessages stringMessages, - Locale locale, - ElementType valueType, AggregatorType aggregatorType, ThreadPoolExecutor executor) { - WorkerBuilder> workerBuilder = new AggregationWorkerBuilder(valueType, aggregatorType); - return new GroupDividingParallelAggregator(stringMessages.get(locale, aggregatorType.getNameMessage()), workerBuilder, executor); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionDTOFactory.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionDTOFactory.java new file mode 100644 index 00000000000..6d5e1d7dccf --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionDTOFactory.java @@ -0,0 +1,52 @@ +package com.sap.sse.datamining.factories; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.i18n.DataMiningStringMessages; +import com.sap.sse.datamining.shared.annotations.Connector; +import com.sap.sse.datamining.shared.annotations.Dimension; +import com.sap.sse.datamining.shared.dto.FunctionDTO; +import com.sap.sse.datamining.shared.impl.dto.FunctionDTOImpl; + +public class FunctionDTOFactory { + + /** + * Creates the corresponding DTO for the given function, with the functions simple name as display name. + */ + public static FunctionDTO createFunctionDTO(Function function) { + return createFunctionDTO(function, function.getSimpleName()); + } + + /** + * Creates the corresponding DTO for the given function, with the retrieved string message for the given locale and the + * contained message key as display name. The message key is provided with the {@link Dimension} or {@link Connector} + * annotation.
+ * If the function has no message key, the function name is used as display name. + */ + public static FunctionDTO createFunctionDTO(Function function, Locale locale, DataMiningStringMessages stringMessages) { + return createFunctionDTO(function, function.getLocalizedName(locale, stringMessages)); + } + + private static FunctionDTO createFunctionDTO(Function function, String displayName) { + String functionName = function.getSimpleName(); + String sourceTypeName = function.getDeclaringType().getSimpleName(); + String returnTypeName = function.getReturnType().getSimpleName(); + List parameterTypeNames = getParameterTypeNames(function); + return new FunctionDTOImpl(function.isDimension(), functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, function.getOrdinal()); + } + + private static List getParameterTypeNames(Function function) { + List parameterTypeNames = new ArrayList<>(); + for (Class parameterType : function.getParameters()) { + parameterTypeNames.add(parameterType.getSimpleName()); + } + return parameterTypeNames; + } + + + private FunctionDTOFactory() { } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionFactory.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionFactory.java index 395faf20b7b..9f80e9faa12 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionFactory.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/FunctionFactory.java @@ -1,13 +1,17 @@ package com.sap.sse.datamining.factories; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.impl.functions.ConcatenatingCompoundFunction; import com.sap.sse.datamining.impl.functions.MethodWrappingFunction; public class FunctionFactory { private FunctionFactory() { } - + /** * Creates a {@link MethodWrappingFunction} for the given method.
* Throws a {@link ClassCastException}, if the return type of the method doesn't match the generic ReturnType parameter. @@ -18,5 +22,27 @@ public class FunctionFactory { public static MethodWrappingFunction createMethodWrappingFunction(Method method) throws ClassCastException { return new MethodWrappingFunction(method, (Class) method.getReturnType()); } + + public static Function createCompoundFunction(List> functions) { + return createCompoundFunction(null, functions); + } + + /** + * Creates a {@link ConcatenatingCompoundFunction} for the given functions.
+ * Throws a {@link ClassCastException}, if the return type of the last function doesn't match the generic ReturnType parameter. + * + * @throws ClassCastException + */ + @SuppressWarnings("unchecked") + public static Function createCompoundFunction(String name, List> functions) throws ClassCastException { + return new ConcatenatingCompoundFunction(name, functions, (Class) functions.get(functions.size() - 1).getReturnType()); + } + + public static Function createCompoundFunction(String name, List> previousFunctions, + Function lastFunction) { + List> functions = new ArrayList<>(previousFunctions); + functions.add(lastFunction); + return createCompoundFunction(name, functions); + } } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/ProcessorFactory.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/ProcessorFactory.java new file mode 100644 index 00000000000..49584a97811 --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/factories/ProcessorFactory.java @@ -0,0 +1,130 @@ +package com.sap.sse.datamining.factories; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ExecutorService; + +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.impl.DataMiningActivator; +import com.sap.sse.datamining.impl.ProcessorQuery; +import com.sap.sse.datamining.impl.components.GroupedDataEntry; +import com.sap.sse.datamining.impl.components.ParallelByDimensionGroupingProcessor; +import com.sap.sse.datamining.impl.components.ParallelGroupedElementsValueExtractionProcessor; +import com.sap.sse.datamining.impl.components.ParallelMultiDimensionsValueNestingGroupingProcessor; +import com.sap.sse.datamining.impl.components.aggregators.ParallelGroupedDataCollectingAsSetProcessor; +import com.sap.sse.datamining.impl.components.aggregators.ParallelGroupedDoubleDataAverageAggregationProcessor; +import com.sap.sse.datamining.impl.components.aggregators.ParallelGroupedDoubleDataMedianAggregationProcessor; +import com.sap.sse.datamining.impl.components.aggregators.ParallelGroupedDoubleDataSumAggregationProcessor; +import com.sap.sse.datamining.shared.GroupKey; +import com.sap.sse.datamining.shared.components.AggregatorType; + +public class ProcessorFactory { + + private ProcessorFactory() { + } + + /** + * Creates a aggregation processor of the given aggregator type, with the given ProcessorQuery as result receiver.
+ * The {@link DataMiningActivator} will be used to get the missing objects for the construction (like + * the executor). + */ + public static Processor> createAggregationProcessor(ProcessorQuery query, AggregatorType aggregatorType) { + Collection>> resultReceivers = Arrays.asList(query.getResultReceiver()); + return createAggregationProcessor(resultReceivers, aggregatorType); + } + + + /** + * Creates an aggregation processor.
+ * The {@link DataMiningActivator} will be used to get the missing objects for the construction (like + * the executor). + */ + public static Processor> createAggregationProcessor(Collection>> resultReceivers, AggregatorType aggregatorType) { + ExecutorService executor = DataMiningActivator.getExecutor(); + switch (aggregatorType) { + case Average: + return new ParallelGroupedDoubleDataAverageAggregationProcessor(executor, resultReceivers); + case Median: + return new ParallelGroupedDoubleDataMedianAggregationProcessor(executor, resultReceivers); + case Sum: + return new ParallelGroupedDoubleDataSumAggregationProcessor(executor, resultReceivers); + default: + throw new IllegalArgumentException("No aggregation processor implemented for the aggregation type '" + aggregatorType + "'"); + } + } + + /** + * Creates a collecting processor with the given ProcessorQuery as result receiver, that stores all received grouped + * data in a Set.
+ * The {@link DataMiningActivator} will be used to get the missing objects for the construction (like the executor). + */ + public static Processor> createGroupedDataCollectingAsSetProcessor(ProcessorQuery, ?> query) { + Collection>>> resultReceivers = Arrays.asList(query.getResultReceiver()); + return new ParallelGroupedDataCollectingAsSetProcessor<>(DataMiningActivator.getExecutor(), resultReceivers); + } + + /** + * Creates an extraction processor with the given aggregation processor as result receiver.
+ * The {@link DataMiningActivator} will be used to get the missing objects for the construction (like + * the executor). + */ + public static Processor> createExtractionProcessor( + Processor> aggregationProcessor, Function extractionFunction) { + return createExtractionProcessor(Arrays.asList(aggregationProcessor), extractionFunction); + } + + /** + * Creates a extraction processor.
+ * The {@link DataMiningActivator} will be used to get the missing objects for the construction (like + * the executor). + */ + public static Processor> createExtractionProcessor( + Collection>> resultReceivers, Function extractionFunction) { + return new ParallelGroupedElementsValueExtractionProcessor(DataMiningActivator.getExecutor(), + resultReceivers, extractionFunction); + } + + /** + * Creates a grouping processor with the given extraction processor as result receiver.
+ * The {@link DataMiningActivator} will be used to get the missing objects for the construction (like + * the executor). + */ + public static Processor createGroupingProcessor(Processor> extractionProcessor, List> dimensionsToGroupBy) { + return createGroupingProcessor(Arrays.asList(extractionProcessor), dimensionsToGroupBy); + } + + /** + * Creates a grouping processor.
+ * The {@link DataMiningActivator} will be used to get the missing objects for the construction (like + * the executor). + */ + public static Processor createGroupingProcessor(Collection>> resultReceivers, List> dimensionsToGroupBy) { + return new ParallelMultiDimensionsValueNestingGroupingProcessor<>(DataMiningActivator.getExecutor(), resultReceivers, dimensionsToGroupBy); + } + + /** + * Creates a dimension grouping processor followed by a function value extraction processor for each given dimension.
+ * The {@link DataMiningActivator} will be used to get the missing objects for the construction (like + * the executor). + */ + @SuppressWarnings("unchecked") + public static Collection> createGroupingExtractorsForDimensions( + Processor> valueCollector, Collection> dimensions) { + Collection>> extractionResultReceivers = new ArrayList<>(); + extractionResultReceivers.add(valueCollector); + + Collection> groupingExtractors = new ArrayList<>(); + for (Function dimension : dimensions) { + Processor> dimensionValueExtractor = new ParallelGroupedElementsValueExtractionProcessor(DataMiningActivator.getExecutor(), extractionResultReceivers, (Function) dimension); + Processor byDimensionGrouper = new ParallelByDimensionGroupingProcessor<>(DataMiningActivator.getExecutor(), Arrays.asList(dimensionValueExtractor), dimension); + groupingExtractors.add(byDimensionGrouper); + } + return groupingExtractors; + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/ClassesWithFunctionsService.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/ClassesWithFunctionsService.java deleted file mode 100644 index 04a3b25fb03..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/ClassesWithFunctionsService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sap.sse.datamining.functions; - -import java.util.Collection; - -public interface ClassesWithFunctionsService { - - public boolean hasInternalClassesWithMarkedMethods(); - public Collection> getInternalClassesWithMarkedMethods(); - - public boolean hasExternalLibraryClasses(); - public Collection> getExternalLibraryClasses(); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/Function.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/Function.java index e21354e9ead..1c6ba362ef0 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/Function.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/Function.java @@ -5,17 +5,23 @@ import java.util.Locale; import com.sap.sse.datamining.i18n.DataMiningStringMessages; import com.sap.sse.datamining.shared.Unit; -import com.sap.sse.datamining.shared.annotations.Dimension; -import com.sap.sse.datamining.shared.annotations.SideEffectFreeValue; -import com.sap.sse.datamining.shared.dto.FunctionDTO; public interface Function { - public Class getDeclaringClass(); + public Class getDeclaringType(); public Iterable> getParameters(); + public Class getReturnType(); public boolean isDimension(); + public String getSimpleName(); + + /** + * @return true, if the method {@link #getLocalizedName(Locale, DataMiningStringMessages) getLocalizedName} would return something + * other than the method {@link #getSimpleName() getSimpleName}. + */ + public boolean isLocatable(); + public String getLocalizedName(Locale locale, DataMiningStringMessages stringMessages); /** @@ -33,22 +39,11 @@ public interface Function { * {@link IllegalAccessException} or {@link IllegalArgumentException} was thrown. */ public ReturnType tryToInvoke(Object instance, Object... parameters); - - /** - * Creates the corresponding DTO for this function, with the function name as display name. - */ - public FunctionDTO asDTO(); - - /** - * Creates the corresponding DTO for this function, with the retrieved string message for the given locale and the - * contained message key. The message key is provided with the {@link Dimension} or {@link SideEffectFreeValue} - * annotation.
- * If the function has no message key, the function name is used as display name. - */ - public FunctionDTO asDTO(Locale locale, DataMiningStringMessages stringMessages); public Unit getResultUnit(); public int getResultDecimals(); + + public int getOrdinal(); } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionProvider.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionProvider.java index 55f6dffab4a..2d62b06d690 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionProvider.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionProvider.java @@ -6,13 +6,17 @@ import com.sap.sse.datamining.shared.dto.FunctionDTO; public interface FunctionProvider { - public Collection> getDimensionsFor(Class dataType); - + public Collection> getAllStatistics(); + public Collection> getFunctionsFor(Class sourceType); + + public Collection> getStatisticsFor(Class sourceType); + + public Collection> getDimensionsFor(Class sourceType); /** * @return The first function, that matches the given DTO or null */ - public Function getFunctionFor(FunctionDTO functionDTO); + public Function getFunctionForDTO(FunctionDTO functionDTO); } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRegistry.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRegistry.java index 147051180b4..82f68e297d4 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRegistry.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRegistry.java @@ -1,17 +1,21 @@ package com.sap.sse.datamining.functions; -import java.lang.reflect.Method; import java.util.Collection; public interface FunctionRegistry { - public void register(Method method); - public void register(Function function); - public void registerFunctionsRetrievedBy(ParallelFunctionRetriever functionRetriever); - public void registerAll(Iterable> functions); + public void registerAllWithInternalFunctionPolicy(Collection> classesToScan); + public void registerAllWithExternalFunctionPolicy(Collection> externalClassesToScan); - public Collection> getAllRegisteredFunctions(); - public Iterable> getRegisteredFunctionsOf(Class declaringClass); - public Collection> getAllDimensions(); + public void unregisterAllFunctionsOf(Collection> classesToUnregister); + + public Collection> getAllFunctions(); + public Collection> getAllFunctionsOf(Class declaringType); + public Collection> getStatistics(); + public Collection> getStatisticsOf(Class declaringType); + public Collection> getDimensions(); + public Collection> getDimensionsOf(Class declaringType); + public Collection> getExternalFunctions(); + public Collection> getExternalFunctionsOf(Class declaringType); } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRetrievalProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRetrievalProcessor.java new file mode 100644 index 00000000000..8b8b5b09a6d --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRetrievalProcessor.java @@ -0,0 +1,9 @@ +package com.sap.sse.datamining.functions; + +import java.util.Collection; + +import com.sap.sse.datamining.components.Processor; + +public interface FunctionRetrievalProcessor extends Processor>> { + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/ParallelFunctionRetriever.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/ParallelFunctionRetriever.java deleted file mode 100644 index 5ac44d0de81..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/ParallelFunctionRetriever.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sap.sse.datamining.functions; - -import com.sap.sse.datamining.components.ParallelDataRetriever; - -public interface ParallelFunctionRetriever extends ParallelDataRetriever> { - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/i18n/DataMiningStringMessages.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/i18n/DataMiningStringMessages.java index 0a208ff1b31..8f55bff9c18 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/i18n/DataMiningStringMessages.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/i18n/DataMiningStringMessages.java @@ -8,16 +8,11 @@ import java.util.Map; import com.sap.sse.datamining.impl.i18n.CompoundDataMiningStringMessages; import com.sap.sse.datamining.impl.i18n.DataMiningStringMessagesImpl; -import com.sap.sse.datamining.shared.Message; public interface DataMiningStringMessages { public String getResourceBaseName(); - public String get(Locale locale, Message message); - public String get(Locale locale, Message message, String... parameters); - public String get(Locale locale, Message message, Message... parameters); - public String get(Locale locale, String messageKey); public String get(Locale locale, String messageKey, String... parameters); @@ -26,6 +21,7 @@ public interface DataMiningStringMessages { private static boolean supportedLocalesHaveBeenInitialized = false; private static final String DEFAULT_LOCALE_NAME = "default"; + private static final Locale DEFAULT_LOCALE = Locale.ENGLISH; private static final Map supportedLocalesMappedByLocaleInfo = new HashMap<>(); private static final String DEFAULT_STRING_MESSAGES_BASE_NAME = "stringmessages/StringMessages"; @@ -61,19 +57,21 @@ public interface DataMiningStringMessages { return new CompoundDataMiningStringMessages(stringMessages); } - public static Locale getLocaleFrom(String localeInfoName) { + public static Locale getLocaleFor(String localeInfoName) { if (!supportedLocalesHaveBeenInitialized) { initializeSupportedLocales(); } Locale locale = Util.supportedLocalesMappedByLocaleInfo.get(localeInfoName); - return locale != null ? locale : Util.supportedLocalesMappedByLocaleInfo.get(DEFAULT_LOCALE_NAME); + return locale != null ? locale : DEFAULT_LOCALE; } private static void initializeSupportedLocales() { - supportedLocalesMappedByLocaleInfo.put(DEFAULT_LOCALE_NAME, Locale.ENGLISH); + supportedLocalesMappedByLocaleInfo.put(DEFAULT_LOCALE_NAME, DEFAULT_LOCALE); supportedLocalesMappedByLocaleInfo.put("en", Locale.ENGLISH); supportedLocalesMappedByLocaleInfo.put("de", Locale.GERMAN); + + supportedLocalesHaveBeenInitialized = true; } private Util () { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningActivator.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningActivator.java index 969d5ba55ae..7373bd43224 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningActivator.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningActivator.java @@ -1,6 +1,9 @@ package com.sap.sse.datamining.impl; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -12,18 +15,16 @@ import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; +import com.sap.sse.datamining.ClassesWithFunctionsProvider; +import com.sap.sse.datamining.ClassesWithFunctionsService; import com.sap.sse.datamining.DataMiningServer; -import com.sap.sse.datamining.functions.ClassesWithFunctionsService; import com.sap.sse.datamining.functions.FunctionProvider; import com.sap.sse.datamining.functions.FunctionRegistry; -import com.sap.sse.datamining.functions.ParallelFunctionRetriever; import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.impl.functions.PartitionParallelExternalFunctionRetriever; -import com.sap.sse.datamining.impl.functions.PartitioningParallelMarkedFunctionRetriever; -import com.sap.sse.datamining.impl.functions.RegistryFunctionsProvider; +import com.sap.sse.datamining.impl.functions.RegistryFunctionProvider; import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry; -public class DataMiningActivator implements BundleActivator { +public class DataMiningActivator implements BundleActivator, ClassesWithFunctionsProvider { private static final Logger LOGGER = Logger.getLogger(DataMiningActivator.class.getName()); private static final int THREAD_POOL_SIZE = Math.max(Runtime.getRuntime().availableProcessors(), 3); @@ -37,15 +38,13 @@ public class DataMiningActivator implements BundleActivator { @Override public void start(BundleContext context) throws Exception { DataMiningActivator.context = context; - stringMessages = DataMiningStringMessages.Util.getDefaultStringMessages(); executor = new ThreadPoolExecutor(THREAD_POOL_SIZE, THREAD_POOL_SIZE, 60, TimeUnit.SECONDS, new LinkedBlockingQueue()); - FunctionRegistry functionRegistry = createAndBuildFunctionRegistry(); - FunctionProvider functionProvider = new RegistryFunctionsProvider(functionRegistry, getExecutor()); - - dataMiningServer = new DataMiningServerImpl(functionRegistry, functionProvider); + FunctionRegistry functionRegistry = new SimpleFunctionRegistry(); + FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry); + dataMiningServer = new DataMiningServerImpl(stringMessages, functionRegistry, functionProvider, this); registerDataMiningServer(); } @@ -53,69 +52,8 @@ public class DataMiningActivator implements BundleActivator { context.registerService(DataMiningServer.class, dataMiningServer, null); } - private FunctionRegistry createAndBuildFunctionRegistry() { - FunctionRegistry functionRegistry = new SimpleFunctionRegistry(); - for (ServiceReference serviceReference : getAllClassesWithMarkedMethodsServices()) { - registerServiceTo(serviceReference, functionRegistry); - } - return functionRegistry; - } - - private ServiceReference[] getAllClassesWithMarkedMethodsServices() { - try { - ServiceReference[] serviceReferences = context.getServiceReferences(ClassesWithFunctionsService.class.getName(), null); - if (serviceReferences != null) { - return serviceReferences; - } - } catch (InvalidSyntaxException e) { - LOGGER.log(Level.SEVERE, "Error getting the service references. Data mining won't work.", e); - } - LOGGER.log(Level.SEVERE, "There were no " + ClassesWithFunctionsService.class.getName() + "-Services registered. Data mining won't work."); - return new ServiceReference[0]; - } - - @SuppressWarnings("unchecked") - private void registerServiceTo(ServiceReference serviceReference, FunctionRegistry functionRegistry) { - try { - ServiceReference specificServiceReference = (ServiceReference) serviceReference; - registerSpecificServiceTo(context.getService(specificServiceReference), functionRegistry); - } catch (ClassCastException exception) { - String serviceName = context.getService(serviceReference).getClass().getName(); - LOGGER.log(Level.WARNING, "Couldn't register the service '" + serviceName + "' to the function registry." - + " Data mining functionalities will be restricted.", exception); - return; - } - } - - private void registerSpecificServiceTo(ClassesWithFunctionsService service, FunctionRegistry functionRegistry) { - if (service.hasInternalClassesWithMarkedMethods()) { - registerInternalMarkedFunctionsTo(service, functionRegistry); - } - if (service.hasExternalLibraryClasses()) { - registerExternalLibraryFunctionsTo(service, functionRegistry); - } - } - - public void registerInternalMarkedFunctionsTo(ClassesWithFunctionsService service, FunctionRegistry functionRegistry) { - Collection> internalClasses = service.getInternalClassesWithMarkedMethods(); - ParallelFunctionRetriever internalMarkedFunctionsRetriever = new PartitioningParallelMarkedFunctionRetriever( - internalClasses, getExecutor()); - functionRegistry.registerFunctionsRetrievedBy(internalMarkedFunctionsRetriever); - } - - public void registerExternalLibraryFunctionsTo(ClassesWithFunctionsService service, - FunctionRegistry functionRegistry) { - Collection> externalClasses = service.getExternalLibraryClasses(); - ParallelFunctionRetriever externalLibraryFunctionsRetriever = new PartitionParallelExternalFunctionRetriever( - externalClasses, getExecutor()); - functionRegistry.registerFunctionsRetrievedBy(externalLibraryFunctionsRetriever); - } - @Override public void stop(BundleContext context) throws Exception { - for (ServiceReference serviceReference : getAllClassesWithMarkedMethodsServices()) { - context.ungetService(serviceReference); - } } public static ThreadPoolExecutor getExecutor() { @@ -125,5 +63,68 @@ public class DataMiningActivator implements BundleActivator { public static DataMiningStringMessages getStringMessages() { return stringMessages; } + + public static BundleContext getContext() { + return context; + } + + @Override + public Set> getInternalClassesWithMarkedMethods() { + Set> internalClassesWithMarkedMethods = new HashSet<>(); + + for (ServiceReference serviceReference : getAllClassesWithMarkedMethodsServices()) { + internalClassesWithMarkedMethods.addAll(getInternalClassesWithMarkedMethodsFromService(serviceReference)); + } + return internalClassesWithMarkedMethods; + } + + @Override + public Set> getExternalLibraryClasses() { + Set> externalLibraryClasses = new HashSet<>(); + + for (ServiceReference serviceReference : getAllClassesWithMarkedMethodsServices()) { + externalLibraryClasses.addAll(getExternalLibraryClassesFromService(serviceReference)); + } + return externalLibraryClasses; + } + + private Collection> getAllClassesWithMarkedMethodsServices() { + try { + ServiceReference[] serviceReferences = context.getServiceReferences(ClassesWithFunctionsService.class.getName(), null); + if (serviceReferences != null) { + return castServiceReferences(serviceReferences); + } + } catch (InvalidSyntaxException e) { + LOGGER.log(Level.SEVERE, "Error getting the service references. Data mining won't work.", e); + } + LOGGER.log(Level.SEVERE, "There were no " + ClassesWithFunctionsService.class.getName() + "-Services registered. Data mining won't work."); + return new ArrayList<>(); + } + + private Collection> castServiceReferences(ServiceReference[] serviceReferences) { + Collection> specificServiceReferences = new ArrayList<>(); + for (ServiceReference serviceReference : serviceReferences) { + try { + @SuppressWarnings("unchecked") // This is necessary, because you can't use instanceof with specific generics + ServiceReference specificServiceReference = (ServiceReference) serviceReference; + specificServiceReferences.add(specificServiceReference); + } catch (ClassCastException exception) { + String serviceName = context.getService(serviceReference).getClass().getName(); + LOGGER.log(Level.WARNING, "Couldn't register the service '" + serviceName + "' to the function registry." + + " Data mining functionalities will be restricted.", exception); + } + } + return specificServiceReferences; + } + + private Collection> getInternalClassesWithMarkedMethodsFromService(ServiceReference serviceReference) { + Collection> internalClassesWithMarkedMethods = context.getService(serviceReference).getInternalClassesWithMarkedMethods(); + return internalClassesWithMarkedMethods != null ? internalClassesWithMarkedMethods : new ArrayList>(); + } + + private Collection> getExternalLibraryClassesFromService(ServiceReference serviceReference) { + Collection> externalLibraryClasses = context.getService(serviceReference).getExternalLibraryClasses(); + return externalLibraryClasses != null ? externalLibraryClasses : new ArrayList>(); + } } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningServerImpl.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningServerImpl.java index e8047834006..3c89a47f3ad 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningServerImpl.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningServerImpl.java @@ -1,27 +1,93 @@ package com.sap.sse.datamining.impl; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import com.sap.sse.datamining.ClassesWithFunctionsProvider; import com.sap.sse.datamining.DataMiningServer; import com.sap.sse.datamining.functions.FunctionProvider; import com.sap.sse.datamining.functions.FunctionRegistry; +import com.sap.sse.datamining.i18n.DataMiningStringMessages; public class DataMiningServerImpl implements DataMiningServer { + + private final Set> registeredInternalClassesWithMarkedMethods; + private final Set> registeredExternalLibraryClasses; + + private final DataMiningStringMessages stringMessages; + private final FunctionRegistry functionRegistry; + private final FunctionProvider functionProvider; + private final ClassesWithFunctionsProvider classesWithFunctionsProvider; - private FunctionRegistry functionRegistry; - private FunctionProvider functionProvider; - - public DataMiningServerImpl(FunctionRegistry functionRegistry, FunctionProvider functionProvider) { + public DataMiningServerImpl(DataMiningStringMessages stringMessages, FunctionRegistry functionRegistry, FunctionProvider functionProvider, ClassesWithFunctionsProvider classesWithFunctionsProvider) { + registeredInternalClassesWithMarkedMethods = new HashSet<>(); + registeredExternalLibraryClasses = new HashSet<>(); + + this.stringMessages = stringMessages; this.functionRegistry = functionRegistry; this.functionProvider = functionProvider; + this.classesWithFunctionsProvider = classesWithFunctionsProvider; + + updateRegistryIfNecessary(); } @Override public FunctionRegistry getFunctionRegistry() { + updateRegistryIfNecessary(); return functionRegistry; } @Override public FunctionProvider getFunctionProvider() { + updateRegistryIfNecessary(); return functionProvider; } + + private void updateRegistryIfNecessary() { + updateInternalClassesWithMarkedMethods(); + updateExternalLibraryClasses(); + } + + private void updateInternalClassesWithMarkedMethods() { + Collection> availableInternalClassesWithMarkedMethods = classesWithFunctionsProvider.getInternalClassesWithMarkedMethods(); + Collection> internalClassesWithMarkedMethodsToRegister = getMissingElements(/*from*/ availableInternalClassesWithMarkedMethods, /*in*/ registeredInternalClassesWithMarkedMethods); + Collection> internalClassesWithMarkedMethodsToUnregister = getMissingElements(/*from*/ registeredInternalClassesWithMarkedMethods, /*in*/ availableInternalClassesWithMarkedMethods); + + functionRegistry.unregisterAllFunctionsOf(internalClassesWithMarkedMethodsToUnregister); + registeredInternalClassesWithMarkedMethods.removeAll(internalClassesWithMarkedMethodsToUnregister); + functionRegistry.registerAllWithInternalFunctionPolicy(internalClassesWithMarkedMethodsToRegister); + registeredInternalClassesWithMarkedMethods.addAll(internalClassesWithMarkedMethodsToRegister); + } + + private void updateExternalLibraryClasses() { + Collection> availableExternalLibraryClasses = classesWithFunctionsProvider.getExternalLibraryClasses(); + Collection> externalLibraryClassesToRegister = getMissingElements(/*from*/ availableExternalLibraryClasses, /*in*/ registeredExternalLibraryClasses); + Collection> externalLibraryClassesToUnregister = getMissingElements(/*from*/ registeredExternalLibraryClasses, /*in*/ availableExternalLibraryClasses); + + functionRegistry.unregisterAllFunctionsOf(externalLibraryClassesToUnregister); + registeredExternalLibraryClasses.retainAll(externalLibraryClassesToUnregister); + functionRegistry.registerAllWithExternalFunctionPolicy(externalLibraryClassesToRegister); + registeredExternalLibraryClasses.addAll(externalLibraryClassesToRegister); + } + + private Collection> getMissingElements(Collection> from, Collection> in) { + if (from == null) { + return new ArrayList<>(); + } + if (in == null) { + return from; + } + + Collection> missingElements = new HashSet<>(from); + missingElements.removeAll(in); + return missingElements; + } + + @Override + public DataMiningStringMessages getStringMessages() { + return stringMessages; + } } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/ProcessorQuery.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/ProcessorQuery.java index 1fa7ae28943..61933e4ba5f 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/ProcessorQuery.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/ProcessorQuery.java @@ -1,12 +1,17 @@ package com.sap.sse.datamining.impl; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; import java.util.logging.Logger; @@ -14,19 +19,19 @@ import com.sap.sse.datamining.AdditionalResultDataBuilder; import com.sap.sse.datamining.Query; import com.sap.sse.datamining.components.Processor; import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.impl.components.SumBuildingAndOverwritingResultDataBuilder; +import com.sap.sse.datamining.impl.components.OverwritingResultDataBuilder; import com.sap.sse.datamining.shared.GroupKey; import com.sap.sse.datamining.shared.QueryResult; import com.sap.sse.datamining.shared.impl.QueryResultImpl; -public class ProcessorQuery implements Query { +public abstract class ProcessorQuery implements Query { private static final Logger LOGGER = Logger.getLogger(ProcessorQuery.class.getSimpleName()); private final DataSourceType dataSource; - private Processor firstProcessor; + private final Processor firstProcessor; - private Executor executor; + private final Executor executor; private final ProcessResultReceiver resultReceiver; private final DataMiningStringMessages stringMessages; @@ -35,18 +40,29 @@ public class ProcessorQuery implements Query + * This is useful for non user specific queries, like retrieving the dimension values. + */ + public ProcessorQuery(ThreadPoolExecutor executor, DataSourceType dataSource) { + this(executor, dataSource, null, null); + } + /** + * Creates a query that returns a result with additional data. + */ public ProcessorQuery(Executor executor, DataSourceType dataSource, DataMiningStringMessages stringMessages, Locale locale) { this.executor = executor; this.dataSource = dataSource; this.stringMessages = stringMessages; this.locale = locale; + resultReceiver = new ProcessResultReceiver(); + firstProcessor = createFirstProcessor(); } - - public void setFirstProcessor(Processor firstProcessor) { - this.firstProcessor = firstProcessor; - } + + protected abstract Processor createFirstProcessor(); @Override public QueryResult run() { @@ -54,7 +70,7 @@ public class ProcessorQuery implements Query implements Query processQuery(long timeoutInMillis) throws InterruptedException, TimeoutException { + processorTimedOut = false; final long startTime = System.nanoTime(); executor.execute(new Runnable() { @Override public void run() { try { - firstProcessor.onElement(dataSource); + firstProcessor.processElement(dataSource); firstProcessor.finish(); } catch (InterruptedException e) { - LOGGER.log(Level.WARNING, "The query processing got interrupted.", e); + if (processorTimedOut) { + LOGGER.log(Level.INFO, "The query processing timed out."); + } else { + LOGGER.log(Level.WARNING, "The query processing got interrupted.", e); + } } } }); waitTillWorkIsDone(timeoutInMillis); final long endTime = System.nanoTime(); + + logOccuredFailures(); long calculationTimeInNanos = endTime - startTime; - AdditionalResultDataBuilder additionalDataBuilder = new SumBuildingAndOverwritingResultDataBuilder(); + AdditionalResultDataBuilder additionalDataBuilder = new OverwritingResultDataBuilder(); additionalDataBuilder = firstProcessor.getAdditionalResultData(additionalDataBuilder); Map results = resultReceiver.getResult(); - return new QueryResultImpl<>(results, additionalDataBuilder.build(calculationTimeInNanos, stringMessages, locale)); + + if (stringMessages != null && locale != null) { + return new QueryResultImpl<>(results, additionalDataBuilder.build(calculationTimeInNanos, stringMessages, locale)); + } else { + return new QueryResultImpl<>(results); + } + } + + private void logOccuredFailures() { + for (Throwable failure : resultReceiver.getOccuredFailures()) { + LOGGER.log(Level.SEVERE, "An error occured during the processing of an instruction: ", failure); + } } private void waitTillWorkIsDone(long timeoutInMillis) throws InterruptedException, TimeoutException { @@ -105,7 +139,6 @@ public class ProcessorQuery implements Query implements Query> getResultReceiver() { + public Processor> getResultReceiver() { return resultReceiver; } private class ProcessResultReceiver implements Processor> { + private final ReentrantLock resultsLock; private Map results; + private List occuredFailures; + + public ProcessResultReceiver() { + resultsLock = new ReentrantLock(); + results = new HashMap<>(); + occuredFailures = new ArrayList<>(); + } @Override - public void onElement(Map groupedAggregations) { - results = groupedAggregations; + public void processElement(Map groupedAggregations) { + resultsLock.lock(); + try { + results.putAll(groupedAggregations); + } finally { + resultsLock.unlock(); + } + } + + @Override + public void onFailure(Throwable failure) { + occuredFailures.add(failure); } @Override @@ -147,12 +198,17 @@ public class ProcessorQuery implements Query(); + occuredFailures = new ArrayList<>(); } public Map getResult() { return results; } + + public List getOccuredFailures() { + return occuredFailures; + } @Override public AdditionalResultDataBuilder getAdditionalResultData(AdditionalResultDataBuilder additionalDataBuilder) { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractFilteringRetrievalProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractFilteringRetrievalProcessor.java index 884173cfb71..0ddedec9691 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractFilteringRetrievalProcessor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractFilteringRetrievalProcessor.java @@ -3,76 +3,36 @@ package com.sap.sse.datamining.impl.components; import java.util.Collection; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; -import com.sap.sse.datamining.AdditionalResultDataBuilder; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.components.Processor; -public abstract class AbstractFilteringRetrievalProcessor - extends AbstractPartitioningParallelProcessor { +public abstract class AbstractFilteringRetrievalProcessor + extends AbstractRetrievalProcessor { - private final FilterCriteria criteria; - - private Lock retrievedDataAmountLock; - private int retrievedDataAmount; - - private Lock filteredDataAmountLock; - private int filteredDataAmount; + private final FilterCriterion criteria; public AbstractFilteringRetrievalProcessor(ExecutorService executor, - Collection> resultReceivers, FilterCriteria criteria) { + Collection> resultReceivers, FilterCriterion criteria) { super(executor, resultReceivers); this.criteria = criteria; - retrievedDataAmountLock = new ReentrantLock(); - filteredDataAmountLock = new ReentrantLock(); } - - @Override - protected Iterable partitionElement(InputType element) { - return retrieveData(element); - } - - protected abstract Iterable retrieveData(InputType element); @Override - protected Callable createInstruction(final ResultType partialElement) { + protected Callable createInstruction(final WorkingType partialElement) { + final Callable superInstruction = super.createInstruction(partialElement); return new Callable() { @Override public ResultType call() throws Exception { - incrementRetrievedDataAmount(); - if (criteria.matches(partialElement)) { - incrementFilteredDataAmount(); - return partialElement; + ResultType elementWithContext = superInstruction.call(); + if (criteria.matches(elementWithContext)) { + return elementWithContext; + } else { + AbstractFilteringRetrievalProcessor.super.decrementRetrievedDataAmount(); + return createInvalidResult(); } - return createInvalidResult(); } }; } - private void incrementRetrievedDataAmount() { - retrievedDataAmountLock.lock(); - try { - retrievedDataAmount++; - } finally { - retrievedDataAmountLock.unlock(); - } - } - - private void incrementFilteredDataAmount() { - filteredDataAmountLock.lock(); - try { - filteredDataAmount++; - } finally { - filteredDataAmountLock.unlock(); - } - } - - @Override - protected void setAdditionalData(AdditionalResultDataBuilder additionalDataBuilder) { - additionalDataBuilder.setRetrievedDataAmount(retrievedDataAmount); - additionalDataBuilder.setFilteredDataAmount(filteredDataAmount); - } - } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelMultiDimensionalGroupingProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractParallelMultiDimensionalGroupingProcessor.java similarity index 77% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelMultiDimensionalGroupingProcessor.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractParallelMultiDimensionalGroupingProcessor.java index 6585541ebf5..578139ea073 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelMultiDimensionalGroupingProcessor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractParallelMultiDimensionalGroupingProcessor.java @@ -10,15 +10,15 @@ import com.sap.sse.datamining.components.Processor; import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.shared.GroupKey; import com.sap.sse.datamining.shared.impl.CompoundGroupKey; -import com.sap.sse.datamining.shared.impl.GenericGroupKey; -public class ParallelMultiDimensionalGroupingProcessor - extends AbstractSimpleParallelProcessor> { +public abstract class AbstractParallelMultiDimensionalGroupingProcessor + extends AbstractSimpleParallelProcessor> { private Iterable> dimensions; - public ParallelMultiDimensionalGroupingProcessor(ExecutorService executor, Collection>> resultReceivers, - Iterable> dimensions) { + public AbstractParallelMultiDimensionalGroupingProcessor(ExecutorService executor, + Collection>> resultReceivers, + Iterable> dimensions) { super(executor, resultReceivers); verifyThatDimensionsAreDimensions(dimensions); this.dimensions = dimensions; @@ -61,10 +61,7 @@ public class ParallelMultiDimensionalGroupingProcessor return key; } - private GroupKey createGroupKeyFor(DataType input, Function mainDimension) { - Object keyValue = mainDimension.tryToInvoke(input); - return new GenericGroupKey(keyValue); - } + protected abstract GroupKey createGroupKeyFor(DataType input, Function dimension); @Override protected void setAdditionalData(AdditionalResultDataBuilder additionalDataBuilder) { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractPartitioningParallelProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractPartitioningParallelProcessor.java index 25306052935..851b18aeddf 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractPartitioningParallelProcessor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractPartitioningParallelProcessor.java @@ -32,7 +32,7 @@ public abstract class AbstractPartitioningParallelProcessor instruction = createInstruction(partialElement); if (isInstructionValid(instruction)) { @@ -46,7 +46,7 @@ public abstract class AbstractPartitioningParallelProcessor resultReceiver : resultReceivers) { - resultReceiver.onElement(result); + resultReceiver.processElement(result); } } @@ -88,6 +88,13 @@ public abstract class AbstractPartitioningParallelProcessor partitionElement(InputType element); + @Override + public void onFailure(Throwable failure) { + for (Processor resultReceiver : resultReceivers) { + resultReceiver.onFailure(failure); + } + } + @Override public void finish() throws InterruptedException { sleepUntilAllInstructionsFinished(); diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractProcessor.java index a79825eebcf..ed8cadebb79 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractProcessor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractProcessor.java @@ -16,18 +16,30 @@ public abstract class AbstractProcessor implements Proces } @Override - public void onElement(InputType element) { - ResultType result = processElement(element); + public void processElement(InputType element) { + ResultType result = handleElement(element); forwardResultToTheReceivers(result); } + + @Override + public void onFailure(Throwable failure) { + for (Processor resultReceiver : resultReceivers) { + resultReceiver.onFailure(failure); + } + } + + @Override + public void abort() { + // Can't be implemented in a single threaded processor + } private void forwardResultToTheReceivers(ResultType result) { for (Processor resultReceiver : resultReceivers) { - resultReceiver.onElement(result); + resultReceiver.processElement(result); } } - protected abstract ResultType processElement(InputType element); + protected abstract ResultType handleElement(InputType element); @Override public void finish() throws InterruptedException { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractRetrievalProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractRetrievalProcessor.java new file mode 100644 index 00000000000..94d1d45c92c --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractRetrievalProcessor.java @@ -0,0 +1,67 @@ +package com.sap.sse.datamining.impl.components; + +import java.util.Collection; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import com.sap.sse.datamining.AdditionalResultDataBuilder; +import com.sap.sse.datamining.components.Processor; + +public abstract class AbstractRetrievalProcessor extends + AbstractPartitioningParallelProcessor { + + private final Lock retrievedDataAmountLock; + private int retrievedDataAmount; + + public AbstractRetrievalProcessor(ExecutorService executor, Collection> resultReceivers) { + super(executor, resultReceivers); + retrievedDataAmountLock = new ReentrantLock(); + } + + @Override + protected Callable createInstruction(final WorkingType partialElement) { + return new Callable() { + @Override + public ResultType call() throws Exception { + incrementRetrievedDataAmount(); + return convertWorkingToResultType(partialElement); + } + }; + } + + protected abstract ResultType convertWorkingToResultType(WorkingType partialElement); + + // Override, to provide a better method name to the sub classes + @Override + protected Iterable partitionElement(InputType element) { + return retrieveData(element); + } + + protected abstract Iterable retrieveData(InputType element); + + private void incrementRetrievedDataAmount() { + retrievedDataAmountLock.lock(); + try { + retrievedDataAmount++; + } finally { + retrievedDataAmountLock.unlock(); + } + } + + protected void decrementRetrievedDataAmount() { + retrievedDataAmountLock.lock(); + try { + retrievedDataAmount--; + } finally { + retrievedDataAmountLock.unlock(); + } + } + + @Override + protected void setAdditionalData(AdditionalResultDataBuilder additionalDataBuilder) { + additionalDataBuilder.setRetrievedDataAmount(retrievedDataAmount); + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractSimpleFilteringRetrievalProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractSimpleFilteringRetrievalProcessor.java new file mode 100644 index 00000000000..cef8760604c --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractSimpleFilteringRetrievalProcessor.java @@ -0,0 +1,22 @@ +package com.sap.sse.datamining.impl.components; + +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sse.datamining.components.FilterCriterion; +import com.sap.sse.datamining.components.Processor; + +public abstract class AbstractSimpleFilteringRetrievalProcessor extends + AbstractFilteringRetrievalProcessor { + + public AbstractSimpleFilteringRetrievalProcessor(ExecutorService executor, + Collection> resultReceivers, FilterCriterion criteria) { + super(executor, resultReceivers, criteria); + } + + @Override + protected ResultType convertWorkingToResultType(ResultType partialElement) { + return partialElement; + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractSimpleParallelProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractSimpleParallelProcessor.java index d8d6e443863..2a85e549a0f 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractSimpleParallelProcessor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractSimpleParallelProcessor.java @@ -1,7 +1,7 @@ package com.sap.sse.datamining.impl.components; +import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; @@ -16,7 +16,7 @@ public abstract class AbstractSimpleParallelProcessor @Override protected Iterable partitionElement(InputType element) { - return Collections.singleton(element); + return Arrays.asList(element); } //Redefinition of the method to set the parameter name to element instead of partial element. diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractSimpleRetrievalProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractSimpleRetrievalProcessor.java new file mode 100644 index 00000000000..511f438e0f9 --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractSimpleRetrievalProcessor.java @@ -0,0 +1,20 @@ +package com.sap.sse.datamining.impl.components; + +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sse.datamining.components.Processor; + +public abstract class AbstractSimpleRetrievalProcessor extends + AbstractRetrievalProcessor { + + public AbstractSimpleRetrievalProcessor(ExecutorService executor, Collection> resultReceivers) { + super(executor, resultReceivers); + } + + @Override + protected ResultType convertWorkingToResultType(ResultType partialElement) { + return partialElement; + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/NonFilteringProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/NonFilteringProcessor.java similarity index 69% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/NonFilteringProcessor.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/NonFilteringProcessor.java index 94712a73f05..e85d4ff6663 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/NonFilteringProcessor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/NonFilteringProcessor.java @@ -1,9 +1,9 @@ -package com.sap.sse.datamining.components; +package com.sap.sse.datamining.impl.components; import java.util.Collection; import com.sap.sse.datamining.AdditionalResultDataBuilder; -import com.sap.sse.datamining.impl.components.AbstractProcessor; +import com.sap.sse.datamining.components.Processor; public class NonFilteringProcessor extends AbstractProcessor { @@ -12,7 +12,7 @@ public class NonFilteringProcessor extends AbstractProcessor extends AbstractProcessorOther values are overwritten * */ -public class SumBuildingAndOverwritingResultDataBuilder implements AdditionalResultDataBuilder { +public class OverwritingResultDataBuilder implements AdditionalResultDataBuilder { private int retrievedDataAmount; - private int filteredDataAmount; private Function extractionFunction; private String aggregationNameMessageKey; private Unit unit; @@ -30,16 +29,15 @@ public class SumBuildingAndOverwritingResultDataBuilder implements AdditionalRes /** * Creates a new builder with standard values for the additional data. */ - public SumBuildingAndOverwritingResultDataBuilder() { + public OverwritingResultDataBuilder() { retrievedDataAmount = 0; - filteredDataAmount = 0; unit = Unit.None; resultDecimals = 0; } @Override public AdditionalResultData build(long calculationTimeInNanos, DataMiningStringMessages stringMessages, Locale locale) { - return new AdditionalResultDataImpl(retrievedDataAmount, filteredDataAmount, buildResultSignifier(stringMessages, locale), unit, resultDecimals, calculationTimeInNanos); + return new AdditionalResultDataImpl(retrievedDataAmount, buildResultSignifier(stringMessages, locale), unit, resultDecimals, calculationTimeInNanos); } private String buildResultSignifier(DataMiningStringMessages stringMessages, Locale locale) { @@ -49,17 +47,12 @@ public class SumBuildingAndOverwritingResultDataBuilder implements AdditionalRes String extractedStatisticName = extractionFunction.getLocalizedName(locale, stringMessages); String aggregationName = stringMessages.get(locale, aggregationNameMessageKey); - return stringMessages.get(locale, Message.ResultSignifier, extractedStatisticName, aggregationName); + return stringMessages.get(locale, Message.ResultSignifier.toString(), extractedStatisticName, aggregationName); } @Override public void setRetrievedDataAmount(int retrievedDataAmount) { - this.retrievedDataAmount += retrievedDataAmount; - } - - @Override - public void setFilteredDataAmount(int filteredDataAmount) { - this.filteredDataAmount += filteredDataAmount; + this.retrievedDataAmount = retrievedDataAmount; } @Override @@ -78,10 +71,6 @@ public class SumBuildingAndOverwritingResultDataBuilder implements AdditionalRes return retrievedDataAmount; } - protected int getFilteredDataAmount() { - return filteredDataAmount; - } - protected Function getExtractionFunction() { return extractionFunction; } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelByDimensionGroupingProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelByDimensionGroupingProcessor.java new file mode 100644 index 00000000000..b88bd49815d --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelByDimensionGroupingProcessor.java @@ -0,0 +1,39 @@ +package com.sap.sse.datamining.impl.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.factories.FunctionDTOFactory; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.shared.GroupKey; +import com.sap.sse.datamining.shared.dto.FunctionDTO; +import com.sap.sse.datamining.shared.impl.GenericGroupKey; + +/** + * Takes a dimension and groups the given elements by the dimensions {@link FunctionDTO}. + * + * @author Lennart Hensler (D054527) + */ +public class ParallelByDimensionGroupingProcessor extends + AbstractParallelMultiDimensionalGroupingProcessor { + + public ParallelByDimensionGroupingProcessor(ExecutorService executor, + Collection>> resultReceivers, + Function dimension) { + super(executor, resultReceivers, asIterable(dimension)); + } + + private static Iterable> asIterable(Function dimension) { + Collection> collection = new ArrayList<>(); + collection.add(dimension); + return collection; + } + + @Override + protected GroupKey createGroupKeyFor(DataType input, Function dimension) { + return new GenericGroupKey(FunctionDTOFactory.createFunctionDTO(dimension)); + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelFilteringProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelFilteringProcessor.java index 00dac0750ad..4ed7474e3d4 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelFilteringProcessor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelFilteringProcessor.java @@ -5,19 +5,16 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import com.sap.sse.datamining.AdditionalResultDataBuilder; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.components.Processor; public class ParallelFilteringProcessor extends AbstractSimpleParallelProcessor { - private final FilterCriteria filterCriteria; - - private int filteredDataAmount; + private final FilterCriterion filterCriteria; - public ParallelFilteringProcessor(ExecutorService executor, Collection> resultReceivers, FilterCriteria filterCriteria) { + public ParallelFilteringProcessor(ExecutorService executor, Collection> resultReceivers, FilterCriterion filterCriteria) { super(executor, resultReceivers); this.filterCriteria = filterCriteria; - filteredDataAmount = 0; } @Override @@ -28,20 +25,14 @@ public class ParallelFilteringProcessor extends AbstractSimpleParalle if (filterCriteria.matches(element)) { return element; } else { - increaseFilteredDataAmount(); return ParallelFilteringProcessor.super.createInvalidResult(); } } }; } - private synchronized void increaseFilteredDataAmount() { - filteredDataAmount++; - } - @Override protected void setAdditionalData(AdditionalResultDataBuilder additionalDataBuilder) { - additionalDataBuilder.setFilteredDataAmount(filteredDataAmount); } } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelGroupedElementsValueExtractionProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelGroupedElementsValueExtractionProcessor.java index c9788c4dac8..27504820159 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelGroupedElementsValueExtractionProcessor.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelGroupedElementsValueExtractionProcessor.java @@ -8,8 +8,8 @@ import com.sap.sse.datamining.AdditionalResultDataBuilder; import com.sap.sse.datamining.components.Processor; import com.sap.sse.datamining.functions.Function; -public class ParallelGroupedElementsValueExtractionProcessor - extends AbstractSimpleParallelProcessor, GroupedDataEntry> { +public class ParallelGroupedElementsValueExtractionProcessor + extends AbstractSimpleParallelProcessor, GroupedDataEntry> { private final Function extractionFunction; @@ -21,7 +21,7 @@ public class ParallelGroupedElementsValueExtractionProcessor> createInstruction(final GroupedDataEntry element) { + protected Callable> createInstruction(final GroupedDataEntry element) { return new Callable>() { @Override public GroupedDataEntry call() throws Exception { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelMultiDimensionsValueNestingGroupingProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelMultiDimensionsValueNestingGroupingProcessor.java new file mode 100644 index 00000000000..fcec662156e --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/ParallelMultiDimensionsValueNestingGroupingProcessor.java @@ -0,0 +1,33 @@ +package com.sap.sse.datamining.impl.components; + +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.shared.GroupKey; +import com.sap.sse.datamining.shared.impl.GenericGroupKey; + +/** + * A grouper that takes multiple dimensions (as {@link Function Functions} and groups the given elements + * by their values of the dimensions.
+ * A data element of the type T with the dimension values a and b + * would be grouped with the key {@literal a}.
+ * The order of the given dimensions determines the order of the key nesting. + * + * @author Lennart Hensler (D054527) + */ +public class ParallelMultiDimensionsValueNestingGroupingProcessor + extends AbstractParallelMultiDimensionalGroupingProcessor { + + public ParallelMultiDimensionsValueNestingGroupingProcessor(ExecutorService executor, Collection>> resultReceivers, + Iterable> dimensions) { + super(executor, resultReceivers, dimensions); + } + + protected GroupKey createGroupKeyFor(DataType input, Function mainDimension) { + Object keyValue = mainDimension.tryToInvoke(input); + return new GenericGroupKey(keyValue); + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/aggregators/ParallelGroupedDataCollectingAsSetProcessor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/aggregators/ParallelGroupedDataCollectingAsSetProcessor.java new file mode 100644 index 00000000000..302bcadd215 --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/aggregators/ParallelGroupedDataCollectingAsSetProcessor.java @@ -0,0 +1,47 @@ +package com.sap.sse.datamining.impl.components.aggregators; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ExecutorService; + +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.impl.components.GroupedDataEntry; +import com.sap.sse.datamining.shared.GroupKey; +import com.sap.sse.datamining.shared.Message; + +/** + * An aggregator, that stores the received elements in Sets mapped by the {@link GroupKey GroupKeys}.
+ * The aggregated result is a {@literal Map>}. + * + * @author Lennart + * + * @param The data type for the elements in the resulting sets + */ +public class ParallelGroupedDataCollectingAsSetProcessor + extends AbstractParallelStoringAggregationProcessor, Map>> { + + private final Map> collectedDataMappedByGroupKey; + + public ParallelGroupedDataCollectingAsSetProcessor(ExecutorService executor, + Collection>>> resultReceivers) { + super(executor, resultReceivers, Message.Collecting.toString()); + collectedDataMappedByGroupKey = new HashMap<>(); + } + + @Override + protected void storeElement(GroupedDataEntry element) { + if (!collectedDataMappedByGroupKey.containsKey(element.getKey())) { + collectedDataMappedByGroupKey.put(element.getKey(), new HashSet()); + } + collectedDataMappedByGroupKey.get(element.getKey()).add(element.getDataEntry()); + } + + @Override + protected Map> aggregateResult() { + return collectedDataMappedByGroupKey; + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/AbstractParallelComponent.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/AbstractParallelComponent.java deleted file mode 100644 index 9b6e40e9356..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/AbstractParallelComponent.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.sap.sse.datamining.impl.components.deprecated; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import com.sap.sse.datamining.components.ParallelComponent; -import com.sap.sse.datamining.workers.ComponentWorker; -import com.sap.sse.datamining.workers.WorkReceiver; - -public abstract class AbstractParallelComponent implements ParallelComponent, - WorkReceiver { - - private ThreadPoolExecutor executor; - private Collection> workers; - private Set results; - - public AbstractParallelComponent(ThreadPoolExecutor executor) { - this.executor = executor; - workers = new HashSet>(); - results = Collections.newSetFromMap(new ConcurrentHashMap()); - } - - @Override - public ParallelComponent start(WorkingType data) { - setUpWorkersFor(data); - for (ComponentWorker worker : workers) { - executor.execute(worker); - } - return this; - } - - protected abstract void setUpWorkersFor(WorkingType data); - - @Override - public void receiveWork(ResultType result) { - results.add(result); - } - - protected Collection getResults() { - return results; - } - - @Override - public ResultType get() throws InterruptedException, ExecutionException { - while (!isDone()) { - Thread.sleep(100); - } - return finalizeData(); - } - - @Override - public ResultType get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, - TimeoutException { - long timeRun = 0; - long timeoutInMillis = unit.toMillis(timeout); - while (!isDone() && timeRun < timeoutInMillis) { - Thread.sleep(100); - timeRun = timeRun + 100; - } - if (timeRun >= timeoutInMillis) { - throw new TimeoutException(); - } - return finalizeData(); - } - - protected abstract ResultType finalizeData(); - - @Override - public boolean isDone() { - for (ComponentWorker worker : workers) { - if (!worker.isDone()) { - return false; - } - } - return true; - } - - protected ThreadPoolExecutor getExecutor() { - return executor; - } - - protected void addWorker(ComponentWorker worker) { - workers.add(worker); - } - - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/GroupDividingParallelAggregator.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/GroupDividingParallelAggregator.java deleted file mode 100644 index be6bd921a9c..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/GroupDividingParallelAggregator.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.sap.sse.datamining.impl.components.deprecated; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sse.datamining.components.ParallelAggregator; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.workers.AggregationWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public class GroupDividingParallelAggregator extends AbstractParallelComponent>, - Map> - implements ParallelAggregator { - - private String name; - - private WorkerBuilder> workerBuilder; - - public GroupDividingParallelAggregator(String name, WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { - super(executor); - this.name = name; - this.workerBuilder = workerBuilder; - } - - @Override - public String getName() { - return name; - } - - @Override - protected void setUpWorkersFor(Map> data) { - for (Entry> entry : data.entrySet()) { - AggregationWorker worker = workerBuilder.build(); - worker.setReceiver(this); - - Map> dataToExtractFrom = new HashMap>(); - dataToExtractFrom.put(entry.getKey(), entry.getValue()); - worker.setDataToAggregate(dataToExtractFrom); - - addWorker(worker); - } - } - - @Override - protected Map finalizeData() { - Map data = new HashMap(); - for (Map result : getResults()) { - data.putAll(result); - } - return data; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/GroupDividingParallelExtractor.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/GroupDividingParallelExtractor.java deleted file mode 100644 index dc3b37dc8f9..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/GroupDividingParallelExtractor.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.sap.sse.datamining.impl.components.deprecated; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sse.datamining.components.ParallelExtractor; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.shared.Unit; -import com.sap.sse.datamining.workers.ExtractionWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public class GroupDividingParallelExtractor extends AbstractParallelComponent>, - Map>> - implements ParallelExtractor { - - private String signifier; - private Unit unit; - private int valueDecimals; - - private WorkerBuilder> workerBuilder; - - public GroupDividingParallelExtractor(String signifier, Unit unit, int valueDecimals, - WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { - super(executor); - this.signifier = signifier; - this.unit = unit; - this.valueDecimals = valueDecimals; - this.workerBuilder = workerBuilder; - } - - @Override - protected void setUpWorkersFor(Map> data) { - for (Entry> entry : data.entrySet()) { - ExtractionWorker worker = workerBuilder.build(); - worker.setReceiver(this); - - Map> dataToExtractFrom = new HashMap>(); - dataToExtractFrom.put(entry.getKey(), entry.getValue()); - worker.setDataToExtractFrom(dataToExtractFrom); - - addWorker(worker); - } - } - - @Override - protected Map> finalizeData() { - Map> data = new HashMap>(); - for (Map> result : getResults()) { - data.putAll(result); - } - return Collections.unmodifiableMap(new ConcurrentHashMap>(data)); - } - - @Override - public String getSignifier() { - return signifier; - } - - @Override - public Unit getUnit() { - return unit; - } - - @Override - public int getValueDecimals() { - return valueDecimals; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/NonFilteringFilter.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/NonFilteringFilter.java deleted file mode 100644 index d6ac73e08a0..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/NonFilteringFilter.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.sap.sse.datamining.impl.components.deprecated; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import com.sap.sse.datamining.components.ParallelFilter; - -public class NonFilteringFilter implements ParallelFilter { - - private Collection data; - - public NonFilteringFilter() { - data = new ArrayList(); - } - - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - - @Override - public boolean isDone() { - return true; - } - - @Override - public Collection get() { - return data; - } - - @Override - public Collection get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, - TimeoutException { - long timeRun = 0; - long timeoutInMillis = unit.toMillis(timeout); - while (!isDone() && timeRun < timeoutInMillis) { - Thread.sleep(100); - timeRun = timeRun + 100; - } - if (timeRun >= timeoutInMillis) { - throw new TimeoutException(); - } - return data; - } - - @Override - public ParallelFilter start(Collection data) { - this.data = data; - return this; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/PartitioningParallelFilter.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/PartitioningParallelFilter.java deleted file mode 100644 index 42986e8f77e..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/PartitioningParallelFilter.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.sap.sse.datamining.impl.components.deprecated; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sse.datamining.components.ParallelFilter; -import com.sap.sse.datamining.workers.FiltrationWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public class PartitioningParallelFilter extends AbstractParallelComponent, Collection> - implements ParallelFilter { - - private final WorkerBuilder> workerBuilder; - - public PartitioningParallelFilter(WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { - super(executor); - this.workerBuilder = workerBuilder; - } - - @Override - protected void setUpWorkersFor(Collection data) { - List dataAsList = new ArrayList(data); - final int workerAmount = (int) (getExecutor().getCorePoolSize() * 0.5); - final int partitionSize = (int) Math.ceil((double) dataAsList.size() / workerAmount); - for (int i = 0; i < dataAsList.size(); i += partitionSize) { - List partition = dataAsList.subList(i, i + Math.min(partitionSize, dataAsList.size() - i)); - - FiltrationWorker worker = workerBuilder.build(); - worker.setReceiver(this); - worker.setDataToFilter(partition); - addWorker(worker); - } - } - - @Override - protected Collection finalizeData() { - Collection data = new ArrayList(); - for (Collection results : getResults()) { - data.addAll(results); - } - return Collections.unmodifiableCollection(new CopyOnWriteArrayList(data)); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/PartitioningParallelGrouper.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/PartitioningParallelGrouper.java deleted file mode 100644 index bbdfe61f248..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/deprecated/PartitioningParallelGrouper.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.sap.sse.datamining.impl.components.deprecated; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sse.datamining.components.ParallelGrouper; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.workers.GroupingWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public class PartitioningParallelGrouper extends AbstractParallelComponent, Map>> - implements ParallelGrouper { - - private WorkerBuilder> workerBuilder; - - public PartitioningParallelGrouper(WorkerBuilder> workerBuilder, ThreadPoolExecutor executor) { - super(executor); - this.workerBuilder = workerBuilder; - } - - @Override - protected void setUpWorkersFor(Collection data) { - List dataAsList = new ArrayList(data); - final int workerAmount = (int) (getExecutor().getCorePoolSize() * 0.5); - final int partitionSize = (int) Math.ceil((double) dataAsList.size() / workerAmount); - for (int i = 0; i < dataAsList.size(); i += partitionSize) { - List partition = dataAsList.subList(i, i + Math.min(partitionSize, dataAsList.size() - i)); - - GroupingWorker worker = workerBuilder.build(); - worker.setReceiver(this); - worker.setDataToGroup(partition); - addWorker(worker); - } - } - - @Override - protected Map> finalizeData() { - Map> data = new HashMap>(); - for (Map> result : getResults()) { - data.putAll(result); - } - return Collections.unmodifiableMap(new ConcurrentHashMap>(data)); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/AndCompoundFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/AndCompoundFilterCriterion.java similarity index 51% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/AndCompoundFilterCriteria.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/AndCompoundFilterCriterion.java index c86e335dcb9..f5db6680097 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/AndCompoundFilterCriteria.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/AndCompoundFilterCriterion.java @@ -1,12 +1,12 @@ package com.sap.sse.datamining.impl.criterias; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; -public class AndCompoundFilterCriteria extends CompoundFilterCriteria { +public class AndCompoundFilterCriterion extends CompoundFilterCriterion { @Override public boolean matches(DataType data) { - for (FilterCriteria criteria : getCriterias()) { + for (FilterCriterion criteria : getCriterias()) { if (!criteria.matches(data)) { return false; } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/CompoundFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/CompoundFilterCriteria.java deleted file mode 100644 index 61f3cf81b0e..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/CompoundFilterCriteria.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sap.sse.datamining.impl.criterias; - -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.ConcurrentHashMap; - -import com.sap.sse.datamining.components.FilterCriteria; - -public abstract class CompoundFilterCriteria implements FilterCriteria { - - private Collection> criterias; - - public CompoundFilterCriteria() { - this.criterias = Collections.newSetFromMap(new ConcurrentHashMap, Boolean>()); - } - - public void addCriteria(FilterCriteria criteria) { - criterias.add(criteria); - } - - protected Collection> getCriterias() { - return criterias; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/CompoundFilterCriterion.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/CompoundFilterCriterion.java new file mode 100644 index 00000000000..905dfb31f06 --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/CompoundFilterCriterion.java @@ -0,0 +1,25 @@ +package com.sap.sse.datamining.impl.criterias; + +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.ConcurrentHashMap; + +import com.sap.sse.datamining.components.FilterCriterion; + +public abstract class CompoundFilterCriterion implements FilterCriterion { + + private Collection> criterias; + + public CompoundFilterCriterion() { + this.criterias = Collections.newSetFromMap(new ConcurrentHashMap, Boolean>()); + } + + public void addCriteria(FilterCriterion criteria) { + criterias.add(criteria); + } + + protected Collection> getCriterias() { + return criterias; + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NonFilteringFilterCriterion.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NonFilteringFilterCriterion.java new file mode 100644 index 00000000000..583efa00398 --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NonFilteringFilterCriterion.java @@ -0,0 +1,12 @@ +package com.sap.sse.datamining.impl.criterias; + +import com.sap.sse.datamining.components.FilterCriterion; + +public class NonFilteringFilterCriterion implements FilterCriterion { + + @Override + public boolean matches(T element) { + return true; + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NullaryFunctionRegexFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NullaryFunctionRegexFilterCriteria.java deleted file mode 100644 index 46b8939182a..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NullaryFunctionRegexFilterCriteria.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sap.sse.datamining.impl.criterias; - -import com.sap.sse.datamining.functions.Function; - -public class NullaryFunctionRegexFilterCriteria extends RegexFilterCriteria { - - private Function function; - - public NullaryFunctionRegexFilterCriteria(String regex, Function function) { - super(regex); - this.function = function; - } - - @Override - protected String getValueToMatch(DataType dataEntry) { - return function.tryToInvoke(dataEntry); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NullaryFunctionValuesFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NullaryFunctionValuesFilterCriterion.java similarity index 50% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NullaryFunctionValuesFilterCriteria.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NullaryFunctionValuesFilterCriterion.java index eda0f17eccc..f7a3aa87702 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NullaryFunctionValuesFilterCriteria.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/NullaryFunctionValuesFilterCriterion.java @@ -4,24 +4,24 @@ import java.util.Collection; import java.util.HashSet; import java.util.Objects; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.functions.Function; -public class NullaryFunctionValuesFilterCriteria implements FilterCriteria { +public class NullaryFunctionValuesFilterCriterion implements FilterCriterion { - private Function function; - private Collection valuesToMatch; + private Function function; + private Collection valuesToMatch; - public NullaryFunctionValuesFilterCriteria(Function function, Collection valuesToMatch) { + public NullaryFunctionValuesFilterCriterion(Function function, Collection valuesToMatch) { this.function = function; this.valuesToMatch = new HashSet<>(valuesToMatch); } @Override public boolean matches(DataType dataEntry) { - ValueType value = function.tryToInvoke(dataEntry); + Object value = function.tryToInvoke(dataEntry); - for (ValueType valueToMatch : valuesToMatch) { + for (Object valueToMatch : valuesToMatch) { if (Objects.equals(value, valueToMatch)) { return true; } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/OrCompoundFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/OrCompoundFilterCriterion.java similarity index 51% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/OrCompoundFilterCriteria.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/OrCompoundFilterCriterion.java index a1b830aafe2..9ca5f6e2763 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/OrCompoundFilterCriteria.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/OrCompoundFilterCriterion.java @@ -1,12 +1,12 @@ package com.sap.sse.datamining.impl.criterias; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; -public class OrCompoundFilterCriteria extends CompoundFilterCriteria { +public class OrCompoundFilterCriterion extends CompoundFilterCriterion { @Override public boolean matches(DataType data) { - for (FilterCriteria criteria : getCriterias()) { + for (FilterCriterion criteria : getCriterias()) { if (criteria.matches(data)) { return true; } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/RegexFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/RegexFilterCriterion.java similarity index 65% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/RegexFilterCriteria.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/RegexFilterCriterion.java index 5b8d03ed58d..7311dc7b04d 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/RegexFilterCriteria.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/RegexFilterCriterion.java @@ -1,12 +1,12 @@ package com.sap.sse.datamining.impl.criterias; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; -public abstract class RegexFilterCriteria implements FilterCriteria { +public abstract class RegexFilterCriterion implements FilterCriterion { private String regex; - public RegexFilterCriteria(String regex) { + public RegexFilterCriterion(String regex) { this.regex = regex; } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/DimensionRegexFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/DimensionRegexFilterCriteria.java deleted file mode 100644 index 81400b726dd..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/DimensionRegexFilterCriteria.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.sap.sse.datamining.impl.criterias.deprecated; - -import com.sap.sse.datamining.data.deprecated.Dimension; -import com.sap.sse.datamining.impl.criterias.RegexFilterCriteria; - -public class DimensionRegexFilterCriteria extends RegexFilterCriteria { - - private Dimension dimension; - - public DimensionRegexFilterCriteria(String regex, Dimension dimension) { - super(regex); - this.dimension = dimension; - } - - @Override - protected String getValueToMatch(DataType data) { - return dimension.getDimensionValueFrom(data); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/DimensionValuesFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/DimensionValuesFilterCriteria.java deleted file mode 100644 index 30e24b0a8e2..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/DimensionValuesFilterCriteria.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.sap.sse.datamining.impl.criterias.deprecated; - -import java.util.Collection; -import java.util.HashSet; - -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.data.deprecated.Dimension; - -public class DimensionValuesFilterCriteria implements FilterCriteria { - - private Dimension dimension; - private Collection values; - - public DimensionValuesFilterCriteria(Dimension dimension, Collection values) { - this.dimension = dimension; - this.values = new HashSet(values); - } - - @Override - public boolean matches(DataType data) { - ValueType dataValue = dimension.getDimensionValueFrom(data); - if (dataValue == null) { - return false; - } - - for (ValueType value : values) { - if (value.equals(dataValue)) { - return true; - } - } - return false; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/RangeFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/RangeFilterCriteria.java deleted file mode 100644 index 4c25392e3ec..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/RangeFilterCriteria.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sap.sse.datamining.impl.criterias.deprecated; - -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.data.deprecated.ClusterOfComparable; - -public abstract class RangeFilterCriteria> implements FilterCriteria { - - private ClusterOfComparable cluster; - - public RangeFilterCriteria(ClusterOfComparable cluster) { - this.cluster = cluster; - } - - @Override - public boolean matches(DataType data) { - return isInRange(data); - } - - protected boolean isInRange(DataType data) { - return cluster.isInRange(getValue(data)); - } - - public abstract ValueType getValue(DataType data); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/SimpleRangeFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/SimpleRangeFilterCriteria.java deleted file mode 100644 index 49260be8484..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/criterias/deprecated/SimpleRangeFilterCriteria.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sap.sse.datamining.impl.criterias.deprecated; - -import com.sap.sse.datamining.data.deprecated.ClusterOfComparable; - -public class SimpleRangeFilterCriteria> extends RangeFilterCriteria { - - public SimpleRangeFilterCriteria(ClusterOfComparable cluster) { - super(cluster); - } - - @Override - public DataType getValue(DataType data) { - return data; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/data/deprecated/AbstractDimension.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/data/deprecated/AbstractDimension.java deleted file mode 100644 index 83961fe5b4e..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/data/deprecated/AbstractDimension.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.sap.sse.datamining.impl.data.deprecated; - -import com.sap.sse.datamining.data.deprecated.Dimension; - -public abstract class AbstractDimension implements Dimension { - - private String name; - - public AbstractDimension(String name) { - this.name = name; - } - - @Override - public String getName() { - return name; - } - - @Override - public String toString() { - return getName(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - AbstractDimension other = (AbstractDimension) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/data/deprecated/ClusterImpl.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/data/deprecated/ClusterImpl.java deleted file mode 100644 index 968bfeac281..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/data/deprecated/ClusterImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.sap.sse.datamining.impl.data.deprecated; - -import java.util.Comparator; - -import com.sap.sse.datamining.data.deprecated.Cluster; - -public class ClusterImpl implements Cluster { - - private String name; - private ValueType upperRange; - private ValueType lowerRange; - - public ClusterImpl(String name, ValueType upperRange, ValueType lowerRange) { - this.name = name; - this.upperRange = upperRange; - this.lowerRange = lowerRange; - } - - @Override - public String getName() { - return name; - } - - @Override - public ValueType getUpperRange() { - return upperRange; - } - - @Override - public ValueType getLowerRange() { - return lowerRange; - } - - @Override - public boolean isInRange(ValueType value, Comparator comparator) { - return comparator.compare(value, getLowerRange()) >= 0 && comparator.compare(value, getUpperRange()) <= 0; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/data/deprecated/ClusterOfComparableImpl.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/data/deprecated/ClusterOfComparableImpl.java deleted file mode 100644 index 2c49655d88e..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/data/deprecated/ClusterOfComparableImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sap.sse.datamining.impl.data.deprecated; - -import com.sap.sse.datamining.data.deprecated.ClusterOfComparable; - -public class ClusterOfComparableImpl> extends ClusterImpl implements - ClusterOfComparable { - - public ClusterOfComparableImpl(String name, ValueType upperRange, ValueType lowerRange) { - super(name, upperRange, lowerRange); - } - - @Override - public boolean isInRange(ValueType value) { - return value != null && value.compareTo(getLowerRange()) >= 0 && value.compareTo(getUpperRange()) <= 0; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/deprecated/QueryImpl.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/deprecated/QueryImpl.java deleted file mode 100644 index 2fca1f34d76..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/deprecated/QueryImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.sap.sse.datamining.impl.deprecated; - -import java.util.Collection; -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import com.sap.sse.datamining.Query; -import com.sap.sse.datamining.components.ParallelAggregator; -import com.sap.sse.datamining.components.ParallelDataRetriever; -import com.sap.sse.datamining.components.ParallelExtractor; -import com.sap.sse.datamining.components.ParallelFilter; -import com.sap.sse.datamining.components.ParallelGrouper; -import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.shared.AdditionalResultData; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.shared.Message; -import com.sap.sse.datamining.shared.QueryResult; -import com.sap.sse.datamining.shared.impl.AdditionalResultDataImpl; -import com.sap.sse.datamining.shared.impl.QueryResultImpl; - -public class QueryImpl implements Query { - - private DataMiningStringMessages stringMessages; - private Locale locale; - - private ParallelDataRetriever retriever; - private ParallelFilter filter; - private ParallelGrouper grouper; - - private ParallelExtractor extractor; - private ParallelAggregator aggregator; - - public QueryImpl(DataMiningStringMessages stringMessages, Locale locale, ParallelDataRetriever retriever, ParallelFilter filter, - ParallelGrouper grouper, ParallelExtractor extractor, ParallelAggregator aggregator) { - this.stringMessages = stringMessages; - this.locale = locale; - this.retriever = retriever; - this.filter = filter; - this.grouper = grouper; - this.extractor = extractor; - this.aggregator = aggregator; - } - - @Override - public QueryResult run() throws InterruptedException, ExecutionException { - final long startTime = System.nanoTime(); - Collection retrievedData = retriever.start(null).get(); - Collection filteredData = filter.start(retrievedData).get(); - Map> groupedData = grouper.start(filteredData).get(); - Map> extractedData = extractor.start(groupedData).get(); - Map aggregatedData = aggregator.start(extractedData).get(); - final long endTime = System.nanoTime(); - - long calculationTimeInNanos = endTime - startTime; - AdditionalResultData additionalData = new AdditionalResultDataImpl(retrievedData.size(), filteredData.size(), - createResultSignifier(), extractor.getUnit(), extractor.getValueDecimals(), calculationTimeInNanos); - QueryResult result = new QueryResultImpl(aggregatedData, additionalData); - - return result; - } - - @Override - public QueryResult run(long timeout, TimeUnit unit) throws TimeoutException { - throw new UnsupportedOperationException("This query implementation is deprecated."); - } - - private String createResultSignifier() { - return stringMessages.get(locale, Message.ResultSignifier, extractor.getSignifier(), aggregator.getName()); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/AbstractPartitioningParallelFunctionRetriever.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/AbstractPartitioningParallelFunctionRetriever.java deleted file mode 100644 index 84a930c9181..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/AbstractPartitioningParallelFunctionRetriever.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.sap.sse.datamining.impl.functions; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.ThreadPoolExecutor; - -import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.functions.ParallelFunctionRetriever; -import com.sap.sse.datamining.impl.components.deprecated.AbstractParallelComponent; -import com.sap.sse.datamining.workers.ComponentWorker; - -public abstract class AbstractPartitioningParallelFunctionRetriever - extends AbstractParallelComponent>> - implements ParallelFunctionRetriever { - - private List> classesToScan; - - public AbstractPartitioningParallelFunctionRetriever(Collection> classesToScan, ThreadPoolExecutor executor) { - super(executor); - this.classesToScan = new ArrayList<>(classesToScan); - } - - @Override - protected void setUpWorkersFor(Void data) { - final int workerAmount = calculateMaximumAmountOfWorkers(); - if (workerAmount >= classesToScan.size()) { - simpleWorkerSetUp(); - } else { - final int partitionSize = calculatePartitionSize(workerAmount); - partitioningWorkerSetUp(partitionSize); - } - } - - public int calculatePartitionSize(final int workerAmount) { - return (int) Math.ceil((double) classesToScan.size() / workerAmount); - } - - public int calculateMaximumAmountOfWorkers() { - return (int) (getExecutor().getCorePoolSize() * 0.5); - } - - private void simpleWorkerSetUp() { - for (Class classToScan : classesToScan) { - addWorker(createWorker(classToScan)); - } - } - - private ComponentWorker>> createWorker(Class classToScan) { - Collection> classToScanAsCollection = new HashSet<>(); - classToScanAsCollection.add(classToScan); - return createWorker(classToScanAsCollection); - } - - private void partitioningWorkerSetUp(int partitionSize) { - for (int i = 0; i < classesToScan.size(); i += partitionSize) { - List> partition = classesToScan.subList(i, i + Math.min(partitionSize, classesToScan.size() - i)); - addWorker(createWorker(partition)); - } - } - - protected abstract FunctionRetrievalWorker createWorker(Iterable> classesToScan); - - @Override - protected Collection> finalizeData() { - Collection> data = new HashSet<>(); - for (Collection> results : getResults()) { - data.addAll(results); - } - return Collections.unmodifiableCollection(new CopyOnWriteArrayList>(data)); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/AdditionalFunctionData.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/AdditionalMethodWrappingFunctionData.java similarity index 64% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/AdditionalFunctionData.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/AdditionalMethodWrappingFunctionData.java index 98fff3c4d83..fd6040de0bf 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/AdditionalFunctionData.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/AdditionalMethodWrappingFunctionData.java @@ -2,16 +2,18 @@ package com.sap.sse.datamining.impl.functions; import com.sap.sse.datamining.shared.Unit; -public class AdditionalFunctionData { +public class AdditionalMethodWrappingFunctionData { private final String messageKey; private final Unit resultUnit; private final int resultDecimals; + private final int ordinal; - public AdditionalFunctionData(String messageKey, Unit resultUnit, int resultValueDecimals) { + public AdditionalMethodWrappingFunctionData(String messageKey, Unit resultUnit, int resultValueDecimals, int ordinal) { this.messageKey = messageKey; this.resultUnit = resultUnit; this.resultDecimals = resultValueDecimals; + this.ordinal = ordinal; } public String getMessageKey() { @@ -25,5 +27,9 @@ public class AdditionalFunctionData { public int getResultDecimals() { return resultDecimals; } + + public int getOrdinal() { + return ordinal; + } } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/ConcatenatingCompoundFunction.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/ConcatenatingCompoundFunction.java new file mode 100644 index 00000000000..64d10261ba1 --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/ConcatenatingCompoundFunction.java @@ -0,0 +1,204 @@ +package com.sap.sse.datamining.impl.functions; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; + +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.i18n.DataMiningStringMessages; +import com.sap.sse.datamining.shared.Unit; + +public class ConcatenatingCompoundFunction extends AbstractFunction { + + private static final String SIMPLE_NAME_CHAIN_CONNECTOR = " -> "; + private static final String LOCALIZED_NAME_CHAIN_CONNECTOR = " "; + + private final String name; + private final List> functions; + private final int ordinal; + + public ConcatenatingCompoundFunction(String name, List> functions, Class returnType) throws IllegalArgumentException { + super(isLastFunctionADimension(functions)); + checkThatReturnTypesMatch(functions, returnType); + + this.name = name; + this.functions = new ArrayList<>(functions); + this.ordinal = calculateOrdinal(); + } + + private int calculateOrdinal() { + int ordinal = Integer.MAX_VALUE; + for (Function function : functions) { + int functionOrdinal = function.getOrdinal(); + if (functionOrdinal < ordinal) { + ordinal = functionOrdinal; + } + } + return ordinal; + } + + private static boolean isLastFunctionADimension(List> functions) { + return functions.get(functions.size() - 1).isDimension(); + } + + private void checkThatReturnTypesMatch(List> functions, Class returnType) { + Class lastFunctionReturnType = functions.get(functions.size() - 1).getReturnType(); + if (!lastFunctionReturnType.equals(returnType)) { + throw new IllegalArgumentException("The method return type " + lastFunctionReturnType.getName() + + " and expected return type " + returnType.getName() + " don't match"); + } + } + + @Override + public Class getDeclaringType() { + return getFirstFunction().getDeclaringType(); + } + + @Override + public Iterable> getParameters() { + return getFirstFunction().getParameters(); + } + + @SuppressWarnings("unchecked") // The cast has to work. The types were checked in the constructor. + @Override + public Class getReturnType() { + return (Class) getLastFunction().getReturnType(); + } + + @Override + public String getSimpleName() { + if (name != null && !name.isEmpty()) { + return name; + } + + return buildSimpleNameChain(); + } + + private String buildSimpleNameChain() { + Iterator> functionsIterator = functions.iterator(); + StringBuilder builder = new StringBuilder(functionsIterator.next().getSimpleName()); + while (functionsIterator.hasNext()) { + Function function = functionsIterator.next(); + builder.append(SIMPLE_NAME_CHAIN_CONNECTOR + function.getSimpleName()); + } + return builder.toString(); + } + + @Override + public String getLocalizedName(Locale locale, DataMiningStringMessages stringMessages) { + if (name != null && !name.isEmpty()) { + return name; + } + if (!isLocatable()) { + return getSimpleName(); + } + + return buildLocalizedNameChain(locale, stringMessages); + } + + @Override + public boolean isLocatable() { + for (Function function : functions) { + if (function.isLocatable()) { + return true; + } + } + return false; + } + + private String buildLocalizedNameChain(Locale locale, DataMiningStringMessages stringMessages) { + StringBuilder builder = new StringBuilder(); + boolean first = true; + for (Function function : functions) { + if (function.isLocatable()) { + if (!first) { + builder.append(LOCALIZED_NAME_CHAIN_CONNECTOR); + } + builder.append(function.getLocalizedName(locale, stringMessages)); + first = false; + } + } + return builder.toString(); + } + + @Override + public ReturnType tryToInvoke(Object instance) { + return tryToInvoke(instance, new Object[0]); + } + + @SuppressWarnings("unchecked") // The cast has to work. The types were checked in the constructor. + @Override + public ReturnType tryToInvoke(Object instance, Object... parameters) { + Iterator> functionsIterator = functions.iterator(); + Object result = functionsIterator.next().tryToInvoke(instance, parameters); + while (functionsIterator.hasNext()) { + Function function = (Function) functionsIterator.next(); + result = function.tryToInvoke(result); + if (result == null) { + return null; + } + } + return (ReturnType) result; + } + + @Override + public Unit getResultUnit() { + return getLastFunction().getResultUnit(); + } + + @Override + public int getResultDecimals() { + return getLastFunction().getResultDecimals(); + } + + @Override + public int getOrdinal() { + return ordinal; + } + + private Function getFirstFunction() { + return functions.get(0); + } + + private Function getLastFunction() { + return functions.get(functions.size() - 1); + } + + @Override + public String toString() { + return getSimpleName(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((functions == null) ? 0 : functions.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ConcatenatingCompoundFunction other = (ConcatenatingCompoundFunction) obj; + if (functions == null) { + if (other.functions != null) + return false; + } else if (!functions.equals(other.functions)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/FilteringFunctionRetrievalWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/FilteringFunctionRetrievalWorker.java deleted file mode 100644 index 79f603d079b..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/FilteringFunctionRetrievalWorker.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.sap.sse.datamining.impl.functions; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.HashSet; - -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.factories.FunctionFactory; -import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.impl.workers.AbstractComponentWorker; - -public class FilteringFunctionRetrievalWorker extends AbstractComponentWorker>> - implements FunctionRetrievalWorker { - - private Iterable> classesToScan; - private FilterCriteria filter; - - @Override - protected Collection> doWork() { - Collection> functions = new HashSet<>(); - for (Class classToScan : classesToScan) { - functions.addAll(getFilteredMethodsFrom(classToScan)); - } - return functions; - } - - private Collection> getFilteredMethodsFrom(Class classToScan) { - Collection> functions = new HashSet<>(); - for (Method method : classToScan.getMethods()) { - if (filter != null && filter.matches(method)) { - functions.add(FunctionFactory.createMethodWrappingFunction(method)); - } - } - return functions; - } - - @Override - public void setSource(Iterable> classesToScan) { - this.classesToScan = classesToScan; - } - - public void setFilter(FilterCriteria filterCriteria) { - this.filter = filterCriteria; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/FunctionDTOFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/FunctionDTOFilterCriteria.java deleted file mode 100644 index dcfc6d6f71d..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/FunctionDTOFilterCriteria.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sap.sse.datamining.impl.functions; - -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.shared.dto.FunctionDTO; - -public class FunctionDTOFilterCriteria implements FilterCriteria> { - - private FunctionDTO functionDTOToMatch; - - public FunctionDTOFilterCriteria(FunctionDTO functionDTOToMatch) { - this.functionDTOToMatch = functionDTOToMatch; - } - - @Override - public boolean matches(Function function) { - FunctionDTO functionDTO = function.asDTO(); - return functionDTOToMatch.equals(functionDTO); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/FunctionRetrievalWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/FunctionRetrievalWorker.java deleted file mode 100644 index cbb82d76534..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/FunctionRetrievalWorker.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.sap.sse.datamining.impl.functions; - -import java.lang.reflect.Method; -import java.util.Collection; - -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.impl.criterias.CompoundFilterCriteria; -import com.sap.sse.datamining.impl.criterias.OrCompoundFilterCriteria; -import com.sap.sse.datamining.workers.DataRetrievalWorker; -import com.sap.sse.datamining.workers.WorkReceiver; - -public interface FunctionRetrievalWorker extends DataRetrievalWorker>, Function> { - - public static final class Util { - - public static FunctionRetrievalWorker createMarkedFunctionRetrievalWorker(Iterable> classesToScan, WorkReceiver>> receiver) { - FilteringFunctionRetrievalWorker worker = new FilteringFunctionRetrievalWorker(); - worker.setSource(classesToScan); - worker.setReceiver(receiver); - - CompoundFilterCriteria filterCriteria = new OrCompoundFilterCriteria<>(); - filterCriteria.addCriteria(new MethodIsCorrectDimensionFilterCriteria()); - filterCriteria.addCriteria(new MethodIsCorrectSideEffectFreeValueFilterCriteria()); - worker.setFilter(filterCriteria); - - return worker; - } - - public static FunctionRetrievalWorker createExternalFunctionRetrievalWorker(Iterable> classesToScan, WorkReceiver>> receiver) { - FilteringFunctionRetrievalWorker worker = new FilteringFunctionRetrievalWorker(); - worker.setSource(classesToScan); - worker.setReceiver(receiver); - - FilterCriteria filterCriteria = new MethodIsCorrectExternalFunctionFilterCriteria(); - worker.setFilter(filterCriteria); - - return worker; - } - - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodIsCorrectSideEffectFreeValueFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodIsCorrectSideEffectFreeValueFilterCriteria.java deleted file mode 100644 index ef6fdb1900b..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodIsCorrectSideEffectFreeValueFilterCriteria.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sap.sse.datamining.impl.functions; - -import java.lang.reflect.Method; - -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.shared.annotations.SideEffectFreeValue; - -public class MethodIsCorrectSideEffectFreeValueFilterCriteria implements FilterCriteria { - - @Override - public boolean matches(Method method) { - return method.getAnnotation(SideEffectFreeValue.class) != null; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodWrappingFunction.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodWrappingFunction.java index 8ef5e900fab..ca10e460fc2 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodWrappingFunction.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodWrappingFunction.java @@ -2,26 +2,21 @@ package com.sap.sse.datamining.impl.functions; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import java.util.Locale; import java.util.logging.Level; import com.sap.sse.datamining.i18n.DataMiningStringMessages; import com.sap.sse.datamining.shared.Unit; +import com.sap.sse.datamining.shared.annotations.Connector; import com.sap.sse.datamining.shared.annotations.Dimension; -import com.sap.sse.datamining.shared.annotations.SideEffectFreeValue; -import com.sap.sse.datamining.shared.dto.FunctionDTO; -import com.sap.sse.datamining.shared.impl.dto.FunctionDTOImpl; +import com.sap.sse.datamining.shared.annotations.Statistic; public class MethodWrappingFunction extends AbstractFunction { - private Method method; - - private String messageKey; - private int resultDecimals; - private Unit resultUnit; + private final Method method; + private Class returnType; + private AdditionalMethodWrappingFunctionData additionalData; /** * Throws an {@link IllegalArgumentException}, if the return type of the method and the given returnType @@ -32,6 +27,7 @@ public class MethodWrappingFunction extends AbstractFunction extends AbstractFunction getDeclaringClass() { + public Class getDeclaringType() { return method.getDeclaringClass(); } @@ -69,6 +71,11 @@ public class MethodWrappingFunction extends AbstractFunction getReturnType() { + return returnType; + } + @Override public ReturnType tryToInvoke(Object instance) { return tryToInvoke(instance, new Object[0]); @@ -77,65 +84,52 @@ public class MethodWrappingFunction extends AbstractFunction parameterTypeNames = getParameterTypeNames(); - return new FunctionDTOImpl(functionName, sourceTypeName, returnTypeName, parameterTypeNames, displayName, isDimension()); - } - - private List getParameterTypeNames() { - List parameterTypeNames = new ArrayList<>(); - for (Class parameterType : method.getParameterTypes()) { - parameterTypeNames.add(parameterType.getSimpleName()); - } - return parameterTypeNames; - } - @Override public String toString() { - return getDeclaringClass().getSimpleName() + "." + getMethodName() + "(" + parametersAsString() + ") : " + method.getReturnType().getSimpleName(); + return getDeclaringType().getSimpleName() + "." + method.getName() + "(" + parametersAsString() + ") : " + method.getReturnType().getSimpleName(); } private String parametersAsString() { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/PartitionParallelExternalFunctionRetriever.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/PartitionParallelExternalFunctionRetriever.java deleted file mode 100644 index 33ff624a669..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/PartitionParallelExternalFunctionRetriever.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sap.sse.datamining.impl.functions; - -import java.util.Collection; -import java.util.concurrent.ThreadPoolExecutor; - -public class PartitionParallelExternalFunctionRetriever extends AbstractPartitioningParallelFunctionRetriever { - - public PartitionParallelExternalFunctionRetriever(Collection> externalClasses, ThreadPoolExecutor executor) { - super(externalClasses, executor); - } - - @Override - protected FunctionRetrievalWorker createWorker(Iterable> classesToScan) { - return FunctionRetrievalWorker.Util.createExternalFunctionRetrievalWorker(classesToScan, this); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/PartitioningParallelMarkedFunctionRetriever.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/PartitioningParallelMarkedFunctionRetriever.java deleted file mode 100644 index 5fe3965d9af..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/PartitioningParallelMarkedFunctionRetriever.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sap.sse.datamining.impl.functions; - -import java.util.Collection; -import java.util.concurrent.ThreadPoolExecutor; - -public class PartitioningParallelMarkedFunctionRetriever extends AbstractPartitioningParallelFunctionRetriever { - - public PartitioningParallelMarkedFunctionRetriever(Collection> classesToScan, ThreadPoolExecutor executor) { - super(classesToScan, executor); - } - - @Override - protected FunctionRetrievalWorker createWorker(Iterable> classesToScan) { - return FunctionRetrievalWorker.Util.createMarkedFunctionRetrievalWorker(classesToScan, this); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/RegistryFunctionProvider.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/RegistryFunctionProvider.java new file mode 100644 index 00000000000..7292d85895d --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/RegistryFunctionProvider.java @@ -0,0 +1,177 @@ +package com.sap.sse.datamining.impl.functions; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.sap.sse.datamining.components.FilterCriterion; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.functions.FunctionProvider; +import com.sap.sse.datamining.functions.FunctionRegistry; +import com.sap.sse.datamining.impl.functions.criterias.FunctionMatchesDTOFilterCriterion; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + +public class RegistryFunctionProvider implements FunctionProvider { + + private enum FunctionRetrievalStrategies { + All { + @Override + public Collection> retrieveFunctions(Class declaringType, FunctionRegistry registry) { + return registry.getAllFunctionsOf(declaringType); + } + }, + Dimensions { + @Override + public Collection> retrieveFunctions(Class declaringType, FunctionRegistry registry) { + return registry.getDimensionsOf(declaringType); + } + }, + Statistics { + @Override + public Collection> retrieveFunctions(Class declaringType, FunctionRegistry registry) { + return registry.getStatisticsOf(declaringType); + } + }; + + public abstract Collection> retrieveFunctions(Class declaringType, FunctionRegistry registry); + + } + + private static final Logger LOGGER = Logger.getLogger(RegistryFunctionProvider.class.getName()); + + private final Collection functionRegistries; + + public RegistryFunctionProvider(FunctionRegistry... functionRegistry) { + this(Arrays.asList(functionRegistry)); + } + + public RegistryFunctionProvider(Collection functionRegistries) { + this.functionRegistries = new HashSet<>(functionRegistries); + } + + @Override + public Collection> getAllStatistics() { + Collection> allStatistics = new HashSet<>(); + for (FunctionRegistry registry : functionRegistries) { + allStatistics.addAll(registry.getStatistics()); + } + return allStatistics; + } + + @Override + public Collection> getFunctionsFor(Class sourceType) { + return getFunctionsFor(sourceType, FunctionRetrievalStrategies.All); + } + + @Override + public Collection> getDimensionsFor(Class sourceType) { + return getFunctionsFor(sourceType, FunctionRetrievalStrategies.Dimensions); + } + + @Override + public Collection> getStatisticsFor(Class sourceType) { + return getFunctionsFor(sourceType, FunctionRetrievalStrategies.Statistics); + } + + private Collection> getFunctionsFor(Class sourceType, FunctionRetrievalStrategies retrievalStrategy) { + Collection> typesToRetrieve = getSupertypesOf(sourceType); + typesToRetrieve.add(sourceType); + return getFunctionsFor(typesToRetrieve, retrievalStrategy); + } + + private Collection> getFunctionsFor(Collection> typesToRetrieve, FunctionRetrievalStrategies retrievalStrategy) { + Collection> functions = new HashSet<>(); + for (FunctionRegistry functionRegistry : functionRegistries) { + for (Class typeToRetrieve : typesToRetrieve) { + Collection> typeSpecificFunctions = retrievalStrategy.retrieveFunctions(typeToRetrieve, functionRegistry); + if (typeSpecificFunctions != null) { + functions.addAll(typeSpecificFunctions); + } + } + } + return functions; + } + + private Collection> getSupertypesOf(Class type) { + Collection> supertypes = new HashSet<>(); + + supertypes.addAll(getInterfacesOf(type)); + if (isSuperclassValid(type)) { + supertypes.add(type.getSuperclass()); + } + + supertypes.addAll(getSupertypesOf(supertypes)); + return supertypes; + } + + private Collection> getInterfacesOf(Class type) { + return Arrays.asList(type.getInterfaces()); + } + + private boolean isSuperclassValid(Class subType) { + return subType.getSuperclass() != null && !subType.getSuperclass().equals(Object.class); + } + + private Collection> getSupertypesOf(Collection> types) { + Collection> supertypes = new HashSet<>(); + boolean supertypeAdded; + do { + Collection> supertypesToAdd = getSupertypesToAdd(types); + supertypeAdded = supertypes.addAll(supertypesToAdd); + } while (supertypeAdded); + return supertypes; + } + + private Collection> getSupertypesToAdd(Collection> types) { + Collection> supertypesToAdd = new HashSet<>(); + for (Class supertype : types) { + supertypesToAdd.addAll(getSupertypesOf(supertype)); + } + return supertypesToAdd; + } + + @Override + public Function getFunctionForDTO(FunctionDTO functionDTO) { + if (functionDTO == null) { + return null; + } + + Collection> functionsMatchingDTO = getFunctionsForDTO(functionDTO); + if (moreThanOneFunctionMatchedDTO(functionsMatchingDTO)) { + logThatMoreThanOneFunctionMatchedDTO(functionDTO, functionsMatchingDTO); + } + + return getFunctionToReturn(functionsMatchingDTO); + } + + private Collection> getFunctionsForDTO(FunctionDTO functionDTO) { + Collection> functionsMatchingDTO = new HashSet<>(); + FilterCriterion> functionDTOFilterCriteria = new FunctionMatchesDTOFilterCriterion(functionDTO); + for (FunctionRegistry functionRegistry : functionRegistries) { + for (Function function : functionRegistry.getAllFunctions()) { + if (functionDTOFilterCriteria.matches(function)) { + functionsMatchingDTO.add(function); + } + } + } + return functionsMatchingDTO; + } + + private boolean moreThanOneFunctionMatchedDTO(Collection> functionsMatchingDTO) { + return functionsMatchingDTO.size() > 1; + } + + private void logThatMoreThanOneFunctionMatchedDTO(FunctionDTO functionDTO, Collection> functionsMatchingDTO) { + LOGGER.log(Level.FINER, "More than on registered function matched the function DTO '" + functionDTO.toString() + "'"); + for (Function function : functionsMatchingDTO) { + LOGGER.log(Level.FINEST, "The function '" + function.toString() + "' matched the function DTO '" + functionDTO.toString() + "'"); + } + } + + private Function getFunctionToReturn(Collection> functionsMatchingDTO) { + return functionsMatchingDTO.isEmpty() ? null : functionsMatchingDTO.iterator().next(); + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/RegistryFunctionsProvider.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/RegistryFunctionsProvider.java deleted file mode 100644 index 4cf97b44941..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/RegistryFunctionsProvider.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.sap.sse.datamining.impl.functions; - -import java.util.Collection; -import java.util.HashSet; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.components.ParallelFilter; -import com.sap.sse.datamining.functions.Function; -import com.sap.sse.datamining.functions.FunctionProvider; -import com.sap.sse.datamining.functions.FunctionRegistry; -import com.sap.sse.datamining.impl.components.deprecated.PartitioningParallelFilter; -import com.sap.sse.datamining.impl.workers.builders.FilterByCriteriaBuilder; -import com.sap.sse.datamining.shared.dto.FunctionDTO; -import com.sap.sse.datamining.workers.FiltrationWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public class RegistryFunctionsProvider implements FunctionProvider { - - private static final Logger LOGGER = Logger.getLogger(RegistryFunctionsProvider.class.getName()); - - private FunctionRegistry functionRegistry; - private ThreadPoolExecutor executor; - - public RegistryFunctionsProvider(FunctionRegistry functionRegistry, ThreadPoolExecutor executor) { - this.functionRegistry = functionRegistry; - this.executor = executor; - } - - @Override - public Collection> getDimensionsFor(Class dataType) { - return filterForDeclaringType(functionRegistry.getAllDimensions(), dataType); - } - - @Override - public Collection> getFunctionsFor(Class sourceType) { - return filterForDeclaringType(functionRegistry.getAllRegisteredFunctions(), sourceType); - } - - private Collection> filterForDeclaringType(Collection> functions, Class sourceType) { - FilterCriteria> declaringTypeFilterCriteria = new DeclaringTypeOrParameterTypeCriteria(sourceType); - ParallelFilter> functionsForDeclaringTypeFilter = createFilterForCriteria(declaringTypeFilterCriteria); - - return executeFilter(functionsForDeclaringTypeFilter, functions); - } - - private Collection> executeFilter(ParallelFilter> functionFilter, Collection> functionsToFilter) { - Collection> filteredFunctions = new HashSet<>(); - - try { - filteredFunctions = functionFilter.start(functionsToFilter).get(); - } catch (InterruptedException | ExecutionException exception) { - LOGGER.log(Level.SEVERE, "Error filtering the functions", exception); - } - - return filteredFunctions; - } - - private ParallelFilter> createFilterForCriteria(FilterCriteria> filterCriteria) { - WorkerBuilder>> workerBuilder = new FilterByCriteriaBuilder>(filterCriteria); - return new PartitioningParallelFilter<>(workerBuilder, executor); - } - - @Override - public Function getFunctionFor(FunctionDTO functionDTO) { - if (functionDTO == null) { - return null; - } - - FilterCriteria> functionDTOFilterCriteria = new FunctionDTOFilterCriteria(functionDTO); - ParallelFilter> functionMatchesDTOFilter = createFilterForCriteria(functionDTOFilterCriteria); - - Collection> functionsMatchingDTO = executeFilter(functionMatchesDTOFilter, functionRegistry.getAllRegisteredFunctions()); - if (moreThanOneFunctionMatchedDTO(functionsMatchingDTO)) { - logThatMoreThanOneFunctionMatchedDTO(functionDTO, functionsMatchingDTO); - } - - return getFunctionToReturn(functionsMatchingDTO); - } - - private boolean moreThanOneFunctionMatchedDTO(Collection> functionsMatchingDTO) { - return functionsMatchingDTO.size() > 1; - } - - private void logThatMoreThanOneFunctionMatchedDTO(FunctionDTO functionDTO, Collection> functionsMatchingDTO) { - LOGGER.log(Level.FINER, "More than on registered function matched the function DTO '" + functionDTO.toString() + "'"); - for (Function function : functionsMatchingDTO) { - LOGGER.log(Level.FINEST, "The function '" + function.toString() + "' matched the function DTO '" + functionDTO.toString() + "'"); - } - } - - private Function getFunctionToReturn(Collection> functionsMatchingDTO) { - return functionsMatchingDTO.isEmpty() ? null : functionsMatchingDTO.iterator().next(); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/SimpleFunctionRegistry.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/SimpleFunctionRegistry.java index 675f22b5ca7..3f12bf1752e 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/SimpleFunctionRegistry.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/SimpleFunctionRegistry.java @@ -1,90 +1,211 @@ package com.sap.sse.datamining.impl.functions; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.logging.Level; -import java.util.logging.Logger; import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.functions.FunctionRegistry; -import com.sap.sse.datamining.functions.ParallelFunctionRetriever; +import com.sap.sse.datamining.shared.annotations.Connector; +import com.sap.sse.datamining.shared.annotations.Dimension; +import com.sap.sse.datamining.shared.annotations.Statistic; public class SimpleFunctionRegistry implements FunctionRegistry { - private static final Logger LOGGER = Logger.getLogger(SimpleFunctionRegistry.class.getName()); + private final Map, Set>> statistics; + private final Map, Set>> dimensions; + private final Map, Set>> externalFunctions; - private final Map, Collection>> registeredFunctionsMappedByDeclaringClass; - private final Collection> dimensions; + private final Collection, Set>>> functionMaps; public SimpleFunctionRegistry() { - registeredFunctionsMappedByDeclaringClass = new HashMap<>(); - dimensions = new HashSet<>(); + statistics = new HashMap<>(); + dimensions = new HashMap<>(); + externalFunctions = new HashMap<>(); + + functionMaps = new ArrayList<>(); + functionMaps.add(statistics); + functionMaps.add(dimensions); + functionMaps.add(externalFunctions); } @Override - public void registerFunctionsRetrievedBy(ParallelFunctionRetriever functionRetriever) { - try { - Collection> functions = functionRetriever.start(null).get(); - registerAll(functions); - } catch (InterruptedException | ExecutionException exception) { - LOGGER.log(Level.SEVERE, "Error during the function retrieving. Data-Mining may not work.", exception); - } - } - - @Override - public void registerAll(Iterable> functions) { - for (Function function : functions) { - register(function); + public void registerAllWithInternalFunctionPolicy(Collection> internalClassesToScan) { + for (Class internalClass : internalClassesToScan) { + scanInternalClass(internalClass); } } - @Override - public void register(Method method) { - register(FunctionFactory.createMethodWrappingFunction(method)); - } - - @Override - public void register(Function function) { - putFunctionIntoMap(function); - addToDimensionsIfFunctionIsADimension(function); + private void scanInternalClass(Class internalClass) { + scanInternalClass(internalClass, new ArrayList>()); } - private void addToDimensionsIfFunctionIsADimension(Function function) { + private void scanInternalClass(Class internalClass, List> previousFunctions) { + for (Method method : internalClass.getMethods()) { + if (isValidDimension(method) || isValidStatistic(method)) { + registerFunction(previousFunctions, method); + continue; + } + + if (isConnector(method)) { + handleConnectorMethod(method, previousFunctions); + } + } + } + + private void registerFunction(List> previousFunctions, Method method) { + Function function = FunctionFactory.createMethodWrappingFunction(method); + if (!previousFunctions.isEmpty()) { + function = FunctionFactory.createCompoundFunction(null, previousFunctions, function); + } + if (function.isDimension()) { - dimensions.add(function); + addDimension(function); + } else { + addStatistic(function); } } - private void putFunctionIntoMap(Function function) { - if (!registeredFunctionsMappedByDeclaringClass.containsKey(function.getDeclaringClass())) { - registeredFunctionsMappedByDeclaringClass.put(function.getDeclaringClass(), new HashSet>()); + private void addDimension(Function dimension) { + Class declaringType = dimension.getDeclaringType(); + if (!dimensions.containsKey(declaringType)) { + dimensions.put(declaringType, new HashSet>()); } - registeredFunctionsMappedByDeclaringClass.get(function.getDeclaringClass()).add(function); + dimensions.get(declaringType).add(dimension); } - - @Override - public Collection> getAllRegisteredFunctions() { - Set> registeredMethods = new HashSet<>(); - for (Collection> registeredMethodsOfClass : registeredFunctionsMappedByDeclaringClass.values()) { - registeredMethods.addAll(registeredMethodsOfClass); + + private void addStatistic(Function statistic) { + Class declaringType = statistic.getDeclaringType(); + if (!statistics.containsKey(declaringType)) { + statistics.put(declaringType, new HashSet>()); } - return registeredMethods; + statistics.get(declaringType).add(statistic); + } + + private void handleConnectorMethod(Method method, List> previousFunctions) { + Function function = FunctionFactory.createMethodWrappingFunction(method); + Class returnType = method.getReturnType(); + List> previousFunctionsClone = new ArrayList<>(previousFunctions); + previousFunctionsClone.add(function); + scanInternalClass(returnType, previousFunctionsClone); + } + + private boolean isValidDimension(Method method) { + return method.getAnnotation(Dimension.class) != null && + !method.getReturnType().equals(Void.TYPE) && + method.getParameterTypes().length == 0; + } + + private boolean isValidStatistic(Method method) { + return method.getAnnotation(Statistic.class) != null && + !method.getReturnType().equals(Void.TYPE) && + method.getParameterTypes().length == 0; + } + + private boolean isConnector(Method method) { + return method.getAnnotation(Connector.class) != null && + !method.getReturnType().equals(Void.TYPE) && + method.getParameterTypes().length == 0; + } + + @Override + public void registerAllWithExternalFunctionPolicy(Collection> externalClassesToScan) { + for (Class externalClass : externalClassesToScan) { + for (Method method : externalClass.getMethods()) { + if (isValidExternalFunction(method)) { + Function function = FunctionFactory.createMethodWrappingFunction(method); + addExternalFunction(function); + } + } + } + } + + private void addExternalFunction(Function function) { + Class declaringType = function.getDeclaringType(); + if (!externalFunctions.containsKey(declaringType)) { + externalFunctions.put(declaringType, new HashSet>()); + } + externalFunctions.get(declaringType).add(function); + } + + private boolean isValidExternalFunction(Method method) { + return !method.getReturnType().equals(Void.TYPE) && !method.getDeclaringClass().equals(Object.class); + } + + @Override + public void unregisterAllFunctionsOf(Collection> classesToUnregister) { + for (Class classToUnregister : classesToUnregister) { + unregisterAllFunctionsOf(classToUnregister); + } + } + + private void unregisterAllFunctionsOf(Class classToUnregister) { + for (Map, Set>> functionMap : functionMaps) { + functionMap.remove(classToUnregister); + } + } + + @Override + public Collection> getAllFunctions() { + Collection> allFunctions = new HashSet<>(); + for (Map, Set>> functionMap : functionMaps) { + allFunctions.addAll(asSet(functionMap)); + } + return allFunctions; + } + + @Override + public Collection> getAllFunctionsOf(Class declaringType) { + Collection> allFunctions = new HashSet<>(); + for (Map, Set>> functionMap : functionMaps) { + allFunctions.addAll(functionMap.get(declaringType)); + } + return allFunctions; + } + + @Override + public Collection> getStatistics() { + return asSet(statistics); } @Override - public Iterable> getRegisteredFunctionsOf(Class declaringClass) { - return registeredFunctionsMappedByDeclaringClass.get(declaringClass); + public Collection> getStatisticsOf(Class declaringType) { + return statistics.get(declaringType); } @Override - public Collection> getAllDimensions() { - return dimensions; + public Collection> getDimensions() { + return asSet(dimensions); + } + + @Override + public Collection> getDimensionsOf(Class declaringType) { + return dimensions.get(declaringType); + } + + @Override + public Collection> getExternalFunctions() { + return asSet(externalFunctions); + } + + @Override + public Collection> getExternalFunctionsOf(Class declaringType) { + return externalFunctions.get(declaringType); + } + + private Collection> asSet(Map>> map) { + Collection> set = new HashSet<>(); + for (Entry>> entry : map.entrySet()) { + set.addAll(entry.getValue()); + } + return set; } } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/FunctionMatchesDTOFilterCriterion.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/FunctionMatchesDTOFilterCriterion.java new file mode 100644 index 00000000000..e92d7070a57 --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/FunctionMatchesDTOFilterCriterion.java @@ -0,0 +1,22 @@ +package com.sap.sse.datamining.impl.functions.criterias; + +import com.sap.sse.datamining.components.FilterCriterion; +import com.sap.sse.datamining.factories.FunctionDTOFactory; +import com.sap.sse.datamining.functions.Function; +import com.sap.sse.datamining.shared.dto.FunctionDTO; + +public class FunctionMatchesDTOFilterCriterion implements FilterCriterion> { + + private FunctionDTO functionDTOToMatch; + + public FunctionMatchesDTOFilterCriterion(FunctionDTO functionDTOToMatch) { + this.functionDTOToMatch = functionDTOToMatch; + } + + @Override + public boolean matches(Function function) { + FunctionDTO functionDTO = FunctionDTOFactory.createFunctionDTO(function); + return functionDTOToMatch.equals(functionDTO); + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/DeclaringTypeOrParameterTypeCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/IsDeclaringTypeFilterCriterion.java similarity index 70% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/DeclaringTypeOrParameterTypeCriteria.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/IsDeclaringTypeFilterCriterion.java index 72cd7f54535..3b40aa2230d 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/DeclaringTypeOrParameterTypeCriteria.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/IsDeclaringTypeFilterCriterion.java @@ -1,17 +1,17 @@ -package com.sap.sse.datamining.impl.functions; +package com.sap.sse.datamining.impl.functions.criterias; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.functions.Function; -public class DeclaringTypeOrParameterTypeCriteria implements FilterCriteria> { +public class IsDeclaringTypeFilterCriterion implements FilterCriterion> { private final Collection> expectingTypes; - public DeclaringTypeOrParameterTypeCriteria(Class expectingType) { + public IsDeclaringTypeFilterCriterion(Class expectingType) { this.expectingTypes = getSupertypesOf(expectingType); this.expectingTypes.add(expectingType); } @@ -47,17 +47,7 @@ public class DeclaringTypeOrParameterTypeCriteria implements FilterCriteria function) { for (Class expectingType : expectingTypes) { - if (isDeclaringTypeMatching(function, expectingType) || - isAParameterTypeMatching(function, expectingType)) { - return true; - } - } - return false; - } - - private boolean isAParameterTypeMatching(Function function, Class expectingType) { - for (Class parameterType : function.getParameters()) { - if (parameterType.equals(expectingType)) { + if (isDeclaringTypeMatching(function, expectingType)) { return true; } } @@ -65,7 +55,7 @@ public class DeclaringTypeOrParameterTypeCriteria implements FilterCriteria function, Class expectingType) { - return function.getDeclaringClass().equals(expectingType); + return function.getDeclaringType().equals(expectingType); } } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodIsCorrectDimensionFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/MethodIsCorrectDimensionFilterCriterion.java similarity index 58% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodIsCorrectDimensionFilterCriteria.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/MethodIsCorrectDimensionFilterCriterion.java index 55b8c58f868..19bf2d9b452 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodIsCorrectDimensionFilterCriteria.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/MethodIsCorrectDimensionFilterCriterion.java @@ -1,11 +1,11 @@ -package com.sap.sse.datamining.impl.functions; +package com.sap.sse.datamining.impl.functions.criterias; import java.lang.reflect.Method; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; import com.sap.sse.datamining.shared.annotations.Dimension; -public class MethodIsCorrectDimensionFilterCriteria implements FilterCriteria { +public class MethodIsCorrectDimensionFilterCriterion implements FilterCriterion { @Override public boolean matches(Method method) { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodIsCorrectExternalFunctionFilterCriteria.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/MethodIsCorrectExternalFunctionFilterCriterion.java similarity index 50% rename from java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodIsCorrectExternalFunctionFilterCriteria.java rename to java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/MethodIsCorrectExternalFunctionFilterCriterion.java index 8a36c1b6575..03a8f3b7fe7 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/MethodIsCorrectExternalFunctionFilterCriteria.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/MethodIsCorrectExternalFunctionFilterCriterion.java @@ -1,10 +1,10 @@ -package com.sap.sse.datamining.impl.functions; +package com.sap.sse.datamining.impl.functions.criterias; import java.lang.reflect.Method; -import com.sap.sse.datamining.components.FilterCriteria; +import com.sap.sse.datamining.components.FilterCriterion; -public class MethodIsCorrectExternalFunctionFilterCriteria implements FilterCriteria { +public class MethodIsCorrectExternalFunctionFilterCriterion implements FilterCriterion { @Override public boolean matches(Method method) { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/MethodIsCorrectStatisticFilterCriterion.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/MethodIsCorrectStatisticFilterCriterion.java new file mode 100644 index 00000000000..d435af29b65 --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/criterias/MethodIsCorrectStatisticFilterCriterion.java @@ -0,0 +1,15 @@ +package com.sap.sse.datamining.impl.functions.criterias; + +import java.lang.reflect.Method; + +import com.sap.sse.datamining.components.FilterCriterion; +import com.sap.sse.datamining.shared.annotations.Statistic; + +public class MethodIsCorrectStatisticFilterCriterion implements FilterCriterion { + + @Override + public boolean matches(Method method) { + return method.getAnnotation(Statistic.class) != null; + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/i18n/CompoundDataMiningStringMessages.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/i18n/CompoundDataMiningStringMessages.java index 5e342ddd9c5..96b9bfe5afc 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/i18n/CompoundDataMiningStringMessages.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/i18n/CompoundDataMiningStringMessages.java @@ -11,7 +11,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.shared.Message; public class CompoundDataMiningStringMessages implements DataMiningStringMessages { @@ -28,25 +27,6 @@ public class CompoundDataMiningStringMessages implements DataMiningStringMessage return get(locale, messageKey, new String[0]); } - @Override - public String get(Locale locale, Message message) { - return get(locale, message.toString(), new String[0]); - } - - @Override - public String get(Locale locale, Message message, String... parameters) { - return get(locale, message.toString(), parameters); - } - - @Override - public String get(Locale locale, Message message, Message... parameters) { - String[] parametersAsString = new String[parameters.length]; - for (int i = 0; i < parameters.length; i++) { - parametersAsString[i] = get(locale, parameters[i]); - } - return get(locale, message, parametersAsString); - } - @Override public String get(Locale locale, String messageKey, String... parameters) { Map messages = new HashMap<>(); @@ -80,8 +60,8 @@ public class CompoundDataMiningStringMessages implements DataMiningStringMessage } if (bestMessage == null) { - throw new MissingResourceException("Can't find resource for bundle " + this.getClass().getName() + ", key " - + messageKey, this.getClass().getName(), messageKey); + throw new MissingResourceException("Can't find message for bundle " + this.getClass().getName() + ", key '" + + messageKey + "'", this.getClass().getName(), messageKey); } return bestMessage; } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/i18n/DataMiningStringMessagesImpl.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/i18n/DataMiningStringMessagesImpl.java index 07945c50ceb..72acdc7e286 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/i18n/DataMiningStringMessagesImpl.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/i18n/DataMiningStringMessagesImpl.java @@ -4,7 +4,6 @@ import java.util.Locale; import java.util.ResourceBundle; import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.shared.Message; public class DataMiningStringMessagesImpl implements DataMiningStringMessages { @@ -22,25 +21,6 @@ public class DataMiningStringMessagesImpl implements DataMiningStringMessages { return get(locale, messageKey, new String[0]); } - @Override - public String get(Locale locale, Message message) { - return get(locale, message.toString(), new String[0]); - } - - @Override - public String get(Locale locale, Message message, String... parameters) { - return get(locale, message.toString(), parameters); - } - - @Override - public String get(Locale locale, Message message, Message... parameters) { - String[] parametersAsString = new String[parameters.length]; - for (int i = 0; i < parameters.length; i++) { - parametersAsString[i] = get(locale, parameters[i]); - } - return get(locale, message, parametersAsString); - } - @Override public String get(Locale locale, String messageKey, String... parameters) { String result = getResourceBundle(locale).getString(messageKey); diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/AbstractComponentWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/AbstractComponentWorker.java deleted file mode 100644 index 0aa2865c56f..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/AbstractComponentWorker.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sap.sse.datamining.impl.workers; - -import com.sap.sse.datamining.workers.ComponentWorker; -import com.sap.sse.datamining.workers.WorkReceiver; - -public abstract class AbstractComponentWorker implements ComponentWorker { - - private WorkReceiver receiver; - private boolean done; - - @Override - public void run() { - receiver.receiveWork(doWork()); - done = true; - } - - protected abstract ResultType doWork(); - - @Override - public void setReceiver(WorkReceiver receiver) { - this.receiver = receiver; - } - - @Override - public boolean isDone() { - return done; - } - - protected WorkReceiver getReceiver() { - return receiver; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/AbstractFiltrationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/AbstractFiltrationWorker.java deleted file mode 100644 index 4fcbf51f093..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/AbstractFiltrationWorker.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.sap.sse.datamining.impl.workers; - -import java.util.ArrayList; -import java.util.Collection; - -import com.sap.sse.datamining.workers.FiltrationWorker; - -public abstract class AbstractFiltrationWorker extends AbstractComponentWorker> - implements FiltrationWorker { - - private Collection data; - - @Override - protected Collection doWork() { - Collection filteredData = new ArrayList(); - for (DataType dataEntry : data) { - if (matches(dataEntry)) { - filteredData.add(dataEntry); - } - } - return filteredData; - } - - protected abstract boolean matches(DataType dataEntry); - - @Override - public void setDataToFilter(Collection data) { - this.data = data; - } - -} \ No newline at end of file diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/AbstractGroupingWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/AbstractGroupingWorker.java deleted file mode 100644 index 8e9e0c0b9b9..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/AbstractGroupingWorker.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.sap.sse.datamining.impl.workers; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.workers.GroupingWorker; - -public abstract class AbstractGroupingWorker extends AbstractComponentWorker>> - implements GroupingWorker { - - private Collection data; - - @Override - public void setDataToGroup(Collection data) { - this.data = data; - } - - @Override - protected Map> doWork() { - Map> groupedData = new HashMap>(); - for (DataType dataEntry : data) { - GroupKey key = getGroupKeyFor(dataEntry); - if (key != null) { - if (!groupedData.containsKey(key)) { - groupedData.put(key, new ArrayList()); - } - groupedData.get(key).add(dataEntry); - } - } - return groupedData; - } - - protected abstract GroupKey getGroupKeyFor(DataType dataEntry); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/CriteriaFiltrationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/CriteriaFiltrationWorker.java deleted file mode 100644 index c746bc3e96a..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/CriteriaFiltrationWorker.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.sap.sse.datamining.impl.workers; - -import com.sap.sse.datamining.components.FilterCriteria; - -public class CriteriaFiltrationWorker extends AbstractFiltrationWorker { - - private FilterCriteria criteria; - - public CriteriaFiltrationWorker(FilterCriteria criteria) { - this.criteria = criteria; - } - - @Override - protected boolean matches(DataType dataEntry) { - return criteria.matches(dataEntry); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/MultiDimensionalGroupingWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/MultiDimensionalGroupingWorker.java deleted file mode 100644 index 9ddd8697ee5..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/MultiDimensionalGroupingWorker.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.sap.sse.datamining.impl.workers; - -import java.util.Collection; -import java.util.Iterator; -import java.util.LinkedHashSet; - -import com.sap.sse.datamining.data.deprecated.Dimension; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.shared.impl.CompoundGroupKey; -import com.sap.sse.datamining.shared.impl.GenericGroupKey; - -public class MultiDimensionalGroupingWorker extends AbstractGroupingWorker { - - private Collection> dimensions; - - public MultiDimensionalGroupingWorker(Collection> dimensions) { - this.dimensions = new LinkedHashSet>(dimensions); - } - - @Override - protected GroupKey getGroupKeyFor(DataType dataEntry) { - return createCompoundGroupKey(dataEntry, dimensions.iterator()); - } - - private GroupKey createCompoundGroupKey(DataType dataEntry, Iterator> iterator) { - Dimension mainDimension = iterator.next(); - if (iterator.hasNext()) { - return new CompoundGroupKey(createGroupKeyFor(dataEntry, mainDimension), createCompoundGroupKey(dataEntry, iterator)); - } else { - return createGroupKeyFor(dataEntry, mainDimension); - } - } - - protected GroupKey createGroupKeyFor(DataType dataEntry, Dimension dimension){ - return new GenericGroupKey(dimension.getDimensionValueFrom(dataEntry)); - }; - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/AbstractAggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/AbstractAggregationWorker.java deleted file mode 100644 index 3e59e41fa5c..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/AbstractAggregationWorker.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import com.sap.sse.datamining.impl.workers.AbstractComponentWorker; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.workers.AggregationWorker; - -public abstract class AbstractAggregationWorker extends AbstractComponentWorker> - implements AggregationWorker { - - private Map> data; - - @Override - protected Map doWork() { - Map aggregatedData = new HashMap(); - for (Entry> dataEntry : getData().entrySet()) { - AggregatedType aggregation = aggregate(dataEntry.getValue()); - aggregatedData.put(dataEntry.getKey(), aggregation); - } - return aggregatedData; - } - - protected abstract AggregatedType aggregate(Collection value); - - @Override - public void setDataToAggregate(Map> data) { - this.data = data; - } - - public Map> getData() { - return data; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/ArithmeticAverageAggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/ArithmeticAverageAggregationWorker.java deleted file mode 100644 index a9b3c7a6e07..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/ArithmeticAverageAggregationWorker.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - -import java.util.Collection; - -import com.sap.sse.datamining.impl.workers.aggregators.helpers.SumAggregationHelper; - -public abstract class ArithmeticAverageAggregationWorker - extends AbstractAggregationWorker { - - private SumAggregationHelper sumAggregator; - - public ArithmeticAverageAggregationWorker(SumAggregationHelper sumAggregator) { - this.sumAggregator = sumAggregator; - } - - @Override - protected AggregatedType aggregate(Collection data) { - return divide(sumAggregator.aggregate(data), data.size()); - } - - protected abstract AggregatedType divide(AggregatedType sum, int dataAmount); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/MedianAggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/MedianAggregationWorker.java deleted file mode 100644 index cb937b0a6a3..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/MedianAggregationWorker.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -public abstract class MedianAggregationWorker, AggregatedType> - extends AbstractAggregationWorker { - - @Override - protected AggregatedType aggregate(Collection data) { - List dataAsList = new ArrayList(data); - Collections.sort(dataAsList); - - if (lengthIsEven(dataAsList)) { - AggregatedType value1 = getAggregatedValueFor(dataAsList.get((dataAsList.size() - 1) / 2)); - AggregatedType value2 = getAggregatedValueFor(dataAsList.get(((dataAsList.size() - 1) / 2) + 1)); - return divideByTwo(add(value1, value2)); - } else { - return getAggregatedValueFor(dataAsList.get((dataAsList.size()) / 2)); - } - } - - private boolean lengthIsEven(Collection data) { - return data.size() % 2 == 0; - } - - protected abstract AggregatedType getAggregatedValueFor(ExtractedType extractedType); - protected abstract AggregatedType add(AggregatedType value1, AggregatedType value2); - protected abstract AggregatedType divideByTwo(AggregatedType value); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleArithmeticAverageAggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleArithmeticAverageAggregationWorker.java deleted file mode 100644 index b67281f923b..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleArithmeticAverageAggregationWorker.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - -import com.sap.sse.datamining.impl.workers.aggregators.helpers.SumAggregationHelper; - -public abstract class SimpleArithmeticAverageAggregationWorker extends ArithmeticAverageAggregationWorker { - - public SimpleArithmeticAverageAggregationWorker(SumAggregationHelper sumAggregator) { - super(sumAggregator); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleDoubleArithmeticAverageAggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleDoubleArithmeticAverageAggregationWorker.java deleted file mode 100644 index b8fdc79d893..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleDoubleArithmeticAverageAggregationWorker.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - -import com.sap.sse.datamining.impl.workers.aggregators.helpers.SimpleDoubleSumAggregationHelper; -import com.sap.sse.datamining.impl.workers.aggregators.helpers.SumAggregationHelper; - -public class SimpleDoubleArithmeticAverageAggregationWorker extends SimpleArithmeticAverageAggregationWorker { - - public SimpleDoubleArithmeticAverageAggregationWorker() { - super((SumAggregationHelper) new SimpleDoubleSumAggregationHelper()); - } - - @Override - protected Double divide(Double sum, int dataAmount) { - return sum / dataAmount; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleDoubleMedianAggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleDoubleMedianAggregationWorker.java deleted file mode 100644 index cfbbeaf3664..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleDoubleMedianAggregationWorker.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - -public class SimpleDoubleMedianAggregationWorker extends SimpleMedianAggregationWorker { - - @Override - protected Double add(Double value1, Double value2) { - return value1 + value2; - } - - @Override - protected Double divideByTwo(Double value) { - return value / 2.0; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleIntegerArithmeticAverageAggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleIntegerArithmeticAverageAggregationWorker.java deleted file mode 100644 index e19af304686..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleIntegerArithmeticAverageAggregationWorker.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - -import com.sap.sse.datamining.impl.workers.aggregators.helpers.SimpleIntegerSumAggregationHelper; -import com.sap.sse.datamining.impl.workers.aggregators.helpers.SumAggregationHelper; - -public class SimpleIntegerArithmeticAverageAggregationWorker extends SimpleArithmeticAverageAggregationWorker { - - public SimpleIntegerArithmeticAverageAggregationWorker() { - super((SumAggregationHelper) new SimpleIntegerSumAggregationHelper()); - } - - @Override - protected Integer divide(Integer sum, int dataAmount) { - return sum / dataAmount; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleIntegerMedianAggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleIntegerMedianAggregationWorker.java deleted file mode 100644 index 3db031f238d..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleIntegerMedianAggregationWorker.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - - -public class SimpleIntegerMedianAggregationWorker extends SimpleMedianAggregationWorker { - - @Override - protected Integer add(Integer value1, Integer value2) { - return value1 + value2; - } - - @Override - protected Integer divideByTwo(Integer value) { - return value / 2; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleMedianAggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleMedianAggregationWorker.java deleted file mode 100644 index 0db105d1d21..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SimpleMedianAggregationWorker.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - -public abstract class SimpleMedianAggregationWorker> - extends MedianAggregationWorker { - - @Override - protected T getAggregatedValueFor(T extractedType) { - return extractedType; - } - -} \ No newline at end of file diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SumAggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SumAggregationWorker.java deleted file mode 100644 index 9fd64e957cc..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/SumAggregationWorker.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators; - -import java.util.Collection; - -import com.sap.sse.datamining.impl.workers.aggregators.helpers.SumAggregationHelper; - -public class SumAggregationWorker - extends AbstractAggregationWorker { - - private SumAggregationHelper aggregator; - - public SumAggregationWorker(SumAggregationHelper aggregator) { - this.aggregator = aggregator; - } - - @Override - protected AggregatedType aggregate(Collection data) { - return aggregator.aggregate(data); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SimpleDoubleSumAggregationHelper.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SimpleDoubleSumAggregationHelper.java deleted file mode 100644 index 1a4501e1204..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SimpleDoubleSumAggregationHelper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators.helpers; - - -public class SimpleDoubleSumAggregationHelper extends SimpleSumAggregationHelper { - - @Override - protected Double add(Double value1, Double value2) { - return value1 + value2; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SimpleIntegerSumAggregationHelper.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SimpleIntegerSumAggregationHelper.java deleted file mode 100644 index f42c5fb5ffc..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SimpleIntegerSumAggregationHelper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators.helpers; - - -public class SimpleIntegerSumAggregationHelper extends SimpleSumAggregationHelper { - - @Override - protected Integer add(Integer value1, Integer value2) { - return value1 + value2; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SimpleSumAggregationHelper.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SimpleSumAggregationHelper.java deleted file mode 100644 index a7c24e49abc..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SimpleSumAggregationHelper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators.helpers; - - -public abstract class SimpleSumAggregationHelper extends SumAggregationHelper { - - @Override - protected T getValueFor(T extractedValue) { - return extractedValue; - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SumAggregationHelper.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SumAggregationHelper.java deleted file mode 100644 index 130120725a4..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/aggregators/helpers/SumAggregationHelper.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sap.sse.datamining.impl.workers.aggregators.helpers; - -import java.util.Collection; -import java.util.Iterator; - -public abstract class SumAggregationHelper { - - public AggregatedType aggregate(Collection data) { - Iterator dataIterator = data.iterator(); - AggregatedType sum = dataIterator.hasNext() ? getValueFor(dataIterator.next()) : null; - - while (dataIterator.hasNext()) { - sum = add(sum, getValueFor(dataIterator.next())); - } - return sum; - } - - protected abstract AggregatedType add(AggregatedType value1, AggregatedType value2); - protected abstract AggregatedType getValueFor(ExtractedType extractedValue); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/builders/AggregationWorkerBuilder.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/builders/AggregationWorkerBuilder.java deleted file mode 100644 index 34efabd469c..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/builders/AggregationWorkerBuilder.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.sap.sse.datamining.impl.workers.builders; - -import com.sap.sse.datamining.impl.workers.aggregators.SimpleDoubleArithmeticAverageAggregationWorker; -import com.sap.sse.datamining.impl.workers.aggregators.SimpleDoubleMedianAggregationWorker; -import com.sap.sse.datamining.impl.workers.aggregators.SimpleIntegerArithmeticAverageAggregationWorker; -import com.sap.sse.datamining.impl.workers.aggregators.SimpleIntegerMedianAggregationWorker; -import com.sap.sse.datamining.impl.workers.aggregators.SumAggregationWorker; -import com.sap.sse.datamining.impl.workers.aggregators.helpers.SimpleDoubleSumAggregationHelper; -import com.sap.sse.datamining.impl.workers.aggregators.helpers.SimpleIntegerSumAggregationHelper; -import com.sap.sse.datamining.shared.components.AggregatorType; -import com.sap.sse.datamining.shared.components.ElementType; -import com.sap.sse.datamining.workers.AggregationWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public class AggregationWorkerBuilder implements WorkerBuilder> { - - private ElementType valueType; - private AggregatorType aggregatorType; - - public AggregationWorkerBuilder(ElementType valueType, AggregatorType aggregatorType) { - this.valueType = valueType; - this.aggregatorType = aggregatorType; - } - - @Override - @SuppressWarnings("unchecked") - public AggregationWorker build() { - switch (valueType) { - case Double: - return (AggregationWorker) createDoubleAggregationWorker(aggregatorType); - case Integer: - return (AggregationWorker) createIntegerAggregationWorker(aggregatorType); - } - throw new IllegalArgumentException("Not yet implemented for the given statistics value type: " - + valueType.toString()); - } - - public static AggregationWorker createIntegerAggregationWorker(AggregatorType aggregatorType) { - switch (aggregatorType) { - case Average: - return new SimpleIntegerArithmeticAverageAggregationWorker(); - case Sum: - return new SumAggregationWorker(new SimpleIntegerSumAggregationHelper()); - case Median: - return new SimpleIntegerMedianAggregationWorker(); - } - throw new IllegalArgumentException("Not yet implemented for the given aggregator type: " - + aggregatorType.toString()); - } - - public static AggregationWorker createDoubleAggregationWorker(AggregatorType aggregatorType) { - switch (aggregatorType) { - case Average: - return new SimpleDoubleArithmeticAverageAggregationWorker(); - case Sum: - return new SumAggregationWorker(new SimpleDoubleSumAggregationHelper()); - case Median: - return new SimpleDoubleMedianAggregationWorker(); - } - throw new IllegalArgumentException("Not yet implemented for the given aggregator type: " - + aggregatorType.toString()); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/builders/FilterByCriteriaBuilder.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/builders/FilterByCriteriaBuilder.java deleted file mode 100644 index 1011243c76c..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/builders/FilterByCriteriaBuilder.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sap.sse.datamining.impl.workers.builders; - -import com.sap.sse.datamining.components.FilterCriteria; -import com.sap.sse.datamining.impl.workers.CriteriaFiltrationWorker; -import com.sap.sse.datamining.workers.FiltrationWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public class FilterByCriteriaBuilder implements WorkerBuilder> { - - private FilterCriteria criteria; - - public FilterByCriteriaBuilder(FilterCriteria criteria) { - this.criteria = criteria; - } - - @Override - public FiltrationWorker build() { - return new CriteriaFiltrationWorker(criteria); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/builders/MultiDimensionalGroupingWorkerBuilder.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/builders/MultiDimensionalGroupingWorkerBuilder.java deleted file mode 100644 index 9364a29d180..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/builders/MultiDimensionalGroupingWorkerBuilder.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sap.sse.datamining.impl.workers.builders; - -import java.util.Collection; - -import com.sap.sse.datamining.data.deprecated.Dimension; -import com.sap.sse.datamining.impl.workers.MultiDimensionalGroupingWorker; -import com.sap.sse.datamining.workers.GroupingWorker; -import com.sap.sse.datamining.workers.WorkerBuilder; - -public class MultiDimensionalGroupingWorkerBuilder implements WorkerBuilder> { - - private Collection> dimensions; - - public MultiDimensionalGroupingWorkerBuilder(Collection> dimensions) { - this.dimensions = dimensions; - } - - @Override - public GroupingWorker build() { - return new MultiDimensionalGroupingWorker(dimensions); - } - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/extractors/AbstractExtractionWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/extractors/AbstractExtractionWorker.java deleted file mode 100644 index edc24024aed..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/extractors/AbstractExtractionWorker.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.sap.sse.datamining.impl.workers.extractors; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import com.sap.sse.datamining.impl.workers.AbstractComponentWorker; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.workers.ExtractionWorker; - -public abstract class AbstractExtractionWorker extends AbstractComponentWorker>> - implements ExtractionWorker { - - private Map> data; - - @Override - public void setDataToExtractFrom(Map> data) { - this.data = data; - } - - @Override - protected Map> doWork() { - Map> extractedData = new HashMap>(); - for (Entry> dataEntry : data.entrySet()) { - GroupKey key = dataEntry.getKey(); - if (!extractedData.containsKey(key)) { - extractedData.put(key, new ArrayList()); - }; - - for (DataType dateElement : dataEntry.getValue()) { - ExtractedType extractedDataElement = extract(dateElement); - if (extractedDataElement != null) { - extractedData.get(key).add(extractedDataElement); - } - } - } - return extractedData; - } - - protected abstract ExtractedType extract(DataType dataEntry); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/retrievers/AbstractRetrievalWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/retrievers/AbstractRetrievalWorker.java deleted file mode 100644 index 1d305939d87..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/workers/retrievers/AbstractRetrievalWorker.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sse.datamining.impl.workers.retrievers; - -import com.sap.sse.datamining.impl.workers.AbstractComponentWorker; - -//Empty class to decouple the specific domain bundles from the domain independent sse bundle -public abstract class AbstractRetrievalWorker - extends AbstractComponentWorker { - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/AggregationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/AggregationWorker.java deleted file mode 100644 index 43f807a68a5..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/AggregationWorker.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sap.sse.datamining.workers; - -import java.util.Collection; -import java.util.Map; - -import com.sap.sse.datamining.shared.GroupKey; - -public interface AggregationWorker extends ComponentWorker> { - - public void setDataToAggregate(Map> data); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/ComponentWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/ComponentWorker.java deleted file mode 100644 index 0f16d168aa9..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/ComponentWorker.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sse.datamining.workers; - -public interface ComponentWorker extends Runnable { - - public void setReceiver(WorkReceiver receiver); - - public boolean isDone(); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/DataRetrievalWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/DataRetrievalWorker.java deleted file mode 100644 index 93e3c0a018e..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/DataRetrievalWorker.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sse.datamining.workers; - -import java.util.Collection; - -public interface DataRetrievalWorker extends ComponentWorker> { - - public void setSource(SourceType source); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/ExtractionWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/ExtractionWorker.java deleted file mode 100644 index d28c0526298..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/ExtractionWorker.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sap.sse.datamining.workers; - -import java.util.Collection; -import java.util.Map; - -import com.sap.sse.datamining.shared.GroupKey; - -public interface ExtractionWorker extends ComponentWorker>> { - - public void setDataToExtractFrom(Map> data); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/FiltrationWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/FiltrationWorker.java deleted file mode 100644 index 14972220c31..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/FiltrationWorker.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.sap.sse.datamining.workers; - -import java.util.Collection; - -public interface FiltrationWorker extends ComponentWorker> { - - public void setDataToFilter(Collection data); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/GroupingWorker.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/GroupingWorker.java deleted file mode 100644 index 6bfa6a9eb97..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/GroupingWorker.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.sap.sse.datamining.workers; - -import java.util.Collection; -import java.util.Map; - -import com.sap.sse.datamining.shared.GroupKey; - -public interface GroupingWorker extends ComponentWorker>> { - - public void setDataToGroup(Collection data); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/WorkReceiver.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/WorkReceiver.java deleted file mode 100644 index ffe73121862..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/WorkReceiver.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.sap.sse.datamining.workers; - -public interface WorkReceiver { - - public void receiveWork(ResultType result); - -} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/WorkerBuilder.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/WorkerBuilder.java deleted file mode 100644 index 04c1be4c267..00000000000 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/workers/WorkerBuilder.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.sap.sse.datamining.workers; - - -public interface WorkerBuilder { - - public WorkerType build(); - -}