From 0242e1da3fea5a96a9f0632156b1cacdd89b9ace Mon Sep 17 00:00:00 2001 From: Teryk Bellahsene Date: Wed, 6 Jan 2016 17:46:38 +0100 Subject: SONAR-7135 WS api/measures/component_tree navigate through components and display measures --- sonar-db/src/main/java/org/sonar/db/MyBatis.java | 2 + .../java/org/sonar/db/component/ComponentDao.java | 4 +- .../sonar/db/component/ComponentDtoFunctions.java | 1 - .../db/component/ComponentDtoWithSnapshotId.java | 33 +++++++++++ .../org/sonar/db/component/ComponentMapper.java | 4 +- .../org/sonar/db/component/ComponentTreeQuery.java | 6 +- .../main/java/org/sonar/db/measure/MeasureDao.java | 14 ++++- .../java/org/sonar/db/measure/MeasureMapper.java | 2 + .../org/sonar/db/metric/MetricDtoFunctions.java | 58 +++++++++++++++++++ .../org/sonar/db/component/ComponentMapper.xml | 8 +-- .../org/sonar/db/measure/MeasureMapper.xml | 20 +++++++ .../org/sonar/db/component/ComponentDaoTest.java | 16 +++--- .../org/sonar/db/component/ComponentDbTester.java | 9 +++ .../org/sonar/db/component/ComponentTesting.java | 8 +-- .../sonar/db/component/ComponentTreeQueryTest.java | 4 +- .../java/org/sonar/db/measure/MeasureDaoTest.java | 66 +++++++++++----------- .../java/org/sonar/db/measure/MeasureTesting.java | 1 - .../java/org/sonar/db/metric/MetricTesting.java | 3 +- 18 files changed, 197 insertions(+), 62 deletions(-) create mode 100644 sonar-db/src/main/java/org/sonar/db/component/ComponentDtoWithSnapshotId.java create mode 100644 sonar-db/src/main/java/org/sonar/db/metric/MetricDtoFunctions.java (limited to 'sonar-db') diff --git a/sonar-db/src/main/java/org/sonar/db/MyBatis.java b/sonar-db/src/main/java/org/sonar/db/MyBatis.java index 21b20373ad9..6555942244e 100644 --- a/sonar-db/src/main/java/org/sonar/db/MyBatis.java +++ b/sonar-db/src/main/java/org/sonar/db/MyBatis.java @@ -34,6 +34,7 @@ import org.sonar.db.activity.ActivityMapper; import org.sonar.db.ce.CeActivityMapper; import org.sonar.db.ce.CeQueueMapper; import org.sonar.db.component.ComponentDto; +import org.sonar.db.component.ComponentDtoWithSnapshotId; import org.sonar.db.component.ComponentLinkDto; import org.sonar.db.component.ComponentLinkMapper; import org.sonar.db.component.ComponentMapper; @@ -164,6 +165,7 @@ public class MyBatis { confBuilder.loadAlias("ActiveDashboard", ActiveDashboardDto.class); confBuilder.loadAlias("Author", AuthorDto.class); confBuilder.loadAlias("Component", ComponentDto.class); + confBuilder.loadAlias("ComponentWithSnapshot", ComponentDtoWithSnapshotId.class); confBuilder.loadAlias("ComponentLink", ComponentLinkDto.class); confBuilder.loadAlias("Dashboard", DashboardDto.class); confBuilder.loadAlias("DuplicationUnit", DuplicationUnitDto.class); diff --git a/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java b/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java index bd66c881d5a..c98d585e368 100644 --- a/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java +++ b/sonar-db/src/main/java/org/sonar/db/component/ComponentDao.java @@ -150,12 +150,12 @@ public class ComponentDao implements Dao { return mapper(session).selectComponentsHavingSameKeyOrderedById(key); } - public List selectDirectChildren(DbSession dbSession, ComponentTreeQuery componentQuery) { + public List selectDirectChildren(DbSession dbSession, ComponentTreeQuery componentQuery) { RowBounds rowBounds = new RowBounds(offset(componentQuery.getPage(), componentQuery.getPageSize()), componentQuery.getPageSize()); return mapper(dbSession).selectDirectChildren(componentQuery, rowBounds); } - public List selectAllChildren(DbSession dbSession, ComponentTreeQuery componentQuery) { + public List selectAllChildren(DbSession dbSession, ComponentTreeQuery componentQuery) { RowBounds rowBounds = new RowBounds(offset(componentQuery.getPage(), componentQuery.getPageSize()), componentQuery.getPageSize()); return mapper(dbSession).selectAllChildren(componentQuery, rowBounds); } diff --git a/sonar-db/src/main/java/org/sonar/db/component/ComponentDtoFunctions.java b/sonar-db/src/main/java/org/sonar/db/component/ComponentDtoFunctions.java index d24e066f70e..db15e751d29 100644 --- a/sonar-db/src/main/java/org/sonar/db/component/ComponentDtoFunctions.java +++ b/sonar-db/src/main/java/org/sonar/db/component/ComponentDtoFunctions.java @@ -59,7 +59,6 @@ public final class ComponentDtoFunctions { } } - private enum ToKey implements Function { INSTANCE; diff --git a/sonar-db/src/main/java/org/sonar/db/component/ComponentDtoWithSnapshotId.java b/sonar-db/src/main/java/org/sonar/db/component/ComponentDtoWithSnapshotId.java new file mode 100644 index 00000000000..45ca736d67c --- /dev/null +++ b/sonar-db/src/main/java/org/sonar/db/component/ComponentDtoWithSnapshotId.java @@ -0,0 +1,33 @@ +/* + * SonarQube :: Database + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.db.component; + +public class ComponentDtoWithSnapshotId extends ComponentDto { + private Long snapshotId; + + public Long getSnapshotId() { + return snapshotId; + } + + public ComponentDtoWithSnapshotId setSnapshotId(Long snapshotId) { + this.snapshotId = snapshotId; + return this; + } +} diff --git a/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java b/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java index 41a873a524b..5a492a554f7 100644 --- a/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/component/ComponentMapper.java @@ -65,14 +65,14 @@ public interface ComponentMapper { /** * Return direct children components */ - List selectDirectChildren(@Param("query") ComponentTreeQuery componentTreeQuery, RowBounds rowBounds); + List selectDirectChildren(@Param("query") ComponentTreeQuery componentTreeQuery, RowBounds rowBounds); int countDirectChildren(@Param("query") ComponentTreeQuery componentTreeQuery); /** * Return all children components. */ - List selectAllChildren(@Param("query") ComponentTreeQuery componentTreeQuery, + List selectAllChildren(@Param("query") ComponentTreeQuery componentTreeQuery, RowBounds rowBounds); int countAllChildren(@Param("query") ComponentTreeQuery componentTreeQuery); diff --git a/sonar-db/src/main/java/org/sonar/db/component/ComponentTreeQuery.java b/sonar-db/src/main/java/org/sonar/db/component/ComponentTreeQuery.java index ebe74a6b62a..96ac077613a 100644 --- a/sonar-db/src/main/java/org/sonar/db/component/ComponentTreeQuery.java +++ b/sonar-db/src/main/java/org/sonar/db/component/ComponentTreeQuery.java @@ -28,6 +28,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.sonar.db.WildcardPosition; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.FluentIterable.from; import static java.util.Objects.requireNonNull; import static org.sonar.db.DatabaseUtils.buildLikeValue; @@ -163,8 +164,9 @@ public class ComponentTreeQuery { return this; } - public Builder setSortFields(List sorts) { - this.sortFields = requireNonNull(sorts); + public Builder setSortFields(@Nullable List sorts) { + checkArgument(sorts != null && !sorts.isEmpty()); + this.sortFields = sorts; return this; } diff --git a/sonar-db/src/main/java/org/sonar/db/measure/MeasureDao.java b/sonar-db/src/main/java/org/sonar/db/measure/MeasureDao.java index 49ec6e465f6..dc4c01deffe 100644 --- a/sonar-db/src/main/java/org/sonar/db/measure/MeasureDao.java +++ b/sonar-db/src/main/java/org/sonar/db/measure/MeasureDao.java @@ -55,7 +55,7 @@ public class MeasureDao implements Dao { /** * Selects all measures of a specific snapshot for the specified metric keys. - * + *

* Uses by Views. */ public List selectBySnapshotIdAndMetricKeys(final long snapshotId, Set metricKeys, final DbSession dbSession) { @@ -69,7 +69,7 @@ public class MeasureDao implements Dao { } public List selectByComponentUuidAndProjectSnapshotIdAndMetricIds(final DbSession session, final String componentUuid, final long projectSnapshotId, - Set metricIds) { + Set metricIds) { return DatabaseUtils.executeLargeInputs(metricIds, new Function, List>() { @Override public List apply(List ids) { @@ -105,6 +105,16 @@ public class MeasureDao implements Dao { }); } + public List selectBySnapshotIdsAndMetricIds(final DbSession dbSession, List snapshotIds, final List metricIds) { + return DatabaseUtils.executeLargeInputs(snapshotIds, new Function, List>() { + @Override + @Nonnull + public List apply(@Nonnull List input) { + return mapper(dbSession).selectBySnapshotIdsAndMetricIds(input, metricIds); + } + }); + } + public void insert(DbSession session, MeasureDto measureDto) { mapper(session).insert(measureDto); } diff --git a/sonar-db/src/main/java/org/sonar/db/measure/MeasureMapper.java b/sonar-db/src/main/java/org/sonar/db/measure/MeasureMapper.java index f9b70f46e17..e9ce46a9e74 100644 --- a/sonar-db/src/main/java/org/sonar/db/measure/MeasureMapper.java +++ b/sonar-db/src/main/java/org/sonar/db/measure/MeasureMapper.java @@ -36,6 +36,8 @@ public interface MeasureMapper { List selectBySnapshotAndMetrics(@Param("snapshotId") long snapshotId, @Param("metricIds") List input); + List selectBySnapshotIdsAndMetricIds(@Param("snapshotIds") List snapshotIds, @Param("metricIds") List metricIds); + @CheckForNull MeasureDto selectByComponentAndMetric(@Param("componentKey") String componentKey, @Param("metricKey") String metricKey); diff --git a/sonar-db/src/main/java/org/sonar/db/metric/MetricDtoFunctions.java b/sonar-db/src/main/java/org/sonar/db/metric/MetricDtoFunctions.java new file mode 100644 index 00000000000..a1b0fa484e4 --- /dev/null +++ b/sonar-db/src/main/java/org/sonar/db/metric/MetricDtoFunctions.java @@ -0,0 +1,58 @@ +/* + * SonarQube :: Database + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.db.metric; + +import com.google.common.base.Function; +import javax.annotation.Nonnull; + +/** + * Common functions on MetricDto + */ +public class MetricDtoFunctions { + private MetricDtoFunctions() { + // prevents instantiation + } + + public static Function toId() { + return ToId.INSTANCE; + } + + public static Function toKey() { + return ToKey.INSTANCE; + } + + private enum ToId implements Function { + INSTANCE; + + @Override + public Integer apply(@Nonnull MetricDto input) { + return input.getId(); + } + } + + private enum ToKey implements Function { + INSTANCE; + + @Override + public String apply(@Nonnull MetricDto input) { + return input.getKey(); + } + } +} diff --git a/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml b/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml index 0618022f2f8..28c94bb38f5 100644 --- a/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/component/ComponentMapper.xml @@ -302,9 +302,9 @@ - select - + , s.id as snapshotId and s.parent_snapshot_id = #{query.baseSnapshot.id} order by ${query.sqlSort} @@ -316,9 +316,9 @@ and s.parent_snapshot_id = #{query.baseSnapshot.id} - select - + , s.id as snapshotId order by ${query.sqlSort} diff --git a/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml b/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml index f2d22396374..ed8a80b3f70 100644 --- a/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/measure/MeasureMapper.xml @@ -92,6 +92,26 @@ + +