| /******************************************************************************** |
| * Copyright (c) 2015-2020 Contributors to the Eclipse Foundation |
| * |
| * See the NOTICE file(s) distributed with this work for additional |
| * information regarding copyright ownership. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| ********************************************************************************/ |
| |
| package org.eclipse.mdm.api.odsadapter; |
| |
| import static org.assertj.core.api.Assertions.assertThat; |
| import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE; |
| import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_PASSWORD; |
| import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_SERVICENAME; |
| import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_USER; |
| |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.mdm.api.base.ConnectionException; |
| import org.eclipse.mdm.api.base.adapter.Attribute; |
| import org.eclipse.mdm.api.base.adapter.EntityType; |
| import org.eclipse.mdm.api.base.adapter.ModelManager; |
| import org.eclipse.mdm.api.base.model.Unit; |
| import org.eclipse.mdm.api.base.model.ValueType; |
| import org.eclipse.mdm.api.base.query.Aggregation; |
| import org.eclipse.mdm.api.base.query.DataAccessException; |
| import org.eclipse.mdm.api.base.query.QueryService; |
| import org.eclipse.mdm.api.base.query.Result; |
| import org.eclipse.mdm.api.dflt.ApplicationContext; |
| import org.junit.AfterClass; |
| import org.junit.BeforeClass; |
| import org.junit.Ignore; |
| |
| /** |
| * Aggregation test |
| * |
| * @since 1.0.0 |
| * @author maf, Peak Solution GmbH |
| */ |
| @Ignore |
| // FIXME 11.01.2018: this test needs a running ODS Server, that is not suitable for continous build in Jenkins. |
| // Comment this in for local tests only. |
| public class AggregationTest { |
| |
| private static final String NAME_SERVICE = "corbaloc::1.2@%s:%s/NameService"; |
| |
| private static final String USER = "sa"; |
| private static final String PASSWORD = "sa"; |
| |
| private static ApplicationContext context; |
| |
| @BeforeClass |
| public static void setUpBeforeClass() throws ConnectionException { |
| String nameServiceHost = System.getProperty("host"); |
| String nameServicePort = System.getProperty("port"); |
| String serviceName = System.getProperty("service"); |
| |
| if (nameServiceHost == null || nameServiceHost.isEmpty()) { |
| throw new IllegalArgumentException("name service host is unknown: define system property 'host'"); |
| } |
| |
| nameServicePort = nameServicePort == null || nameServicePort.isEmpty() ? String.valueOf(2809) : nameServicePort; |
| if (nameServicePort == null || nameServicePort.isEmpty()) { |
| throw new IllegalArgumentException("name service port is unknown: define system property 'port'"); |
| } |
| |
| if (serviceName == null || serviceName.isEmpty()) { |
| throw new IllegalArgumentException("service name is unknown: define system property 'service'"); |
| } |
| |
| Map<String, String> connectionParameters = new HashMap<>(); |
| connectionParameters.put(PARAM_NAMESERVICE, String.format(NAME_SERVICE, nameServiceHost, nameServicePort)); |
| connectionParameters.put(PARAM_SERVICENAME, serviceName + ".ASAM-ODS"); |
| connectionParameters.put(PARAM_USER, USER); |
| connectionParameters.put(PARAM_PASSWORD, PASSWORD); |
| |
| context = new ODSContextFactory().connect(serviceName, connectionParameters); |
| } |
| |
| @AfterClass |
| public static void tearDownAfterClass() throws ConnectionException { |
| if (context != null) { |
| context.close(); |
| } |
| } |
| |
| @org.junit.Test |
| public void testQueryIdAndNameNoAggregation() throws DataAccessException { |
| ModelManager modelManager = context.getModelManager().get(); |
| QueryService queryService = context.getQueryService().get(); |
| |
| EntityType unitEntityType = modelManager.getEntityType(Unit.class); |
| Attribute idAttribute = unitEntityType.getAttribute("Id"); |
| Attribute nameAttribute = unitEntityType.getAttribute("Name"); |
| |
| List<Result> listRes = queryService.createQuery().select(idAttribute).select(nameAttribute).fetch(); |
| |
| assertThat(listRes.size()).isGreaterThanOrEqualTo(1); |
| assertThat(listRes.get(0).getValue(idAttribute).getValueType()).isEqualTo(ValueType.STRING); |
| // Test retrieving attribute value with Aggregation.NONE (should yield the same |
| // result as with no aggregation): |
| assertThat(listRes.get(0).getValue(idAttribute, Aggregation.NONE).getValueType()).isEqualTo(ValueType.STRING); |
| assertThat(listRes.get(0).getValue(nameAttribute).getValueType()).isEqualTo(ValueType.STRING); |
| } |
| |
| @org.junit.Test |
| public void testQueryIdWithAggregation() throws DataAccessException { |
| ModelManager modelManager = context.getModelManager().get(); |
| QueryService queryService = context.getQueryService().get(); |
| |
| EntityType unitEntityType = modelManager.getEntityType(Unit.class); |
| Attribute idAttribute = unitEntityType.getAttribute("Id"); |
| |
| List<Result> listRes = queryService.createQuery().select(idAttribute, Aggregation.MAXIMUM) // should be a string |
| // in result, just |
| // like |
| // non-aggregated Id |
| // attribute |
| .select(idAttribute, Aggregation.AVERAGE) // should be a numeric value in result |
| .fetch(); |
| |
| assertThat(listRes.size()).isGreaterThanOrEqualTo(1); |
| assertThat(listRes.get(0).getValue(idAttribute, Aggregation.MAXIMUM).getValueType()) |
| .isEqualTo(ValueType.STRING); |
| assertThat(listRes.get(0).getValue(idAttribute, Aggregation.AVERAGE).getValueType()).isEqualTo(ValueType.LONG); |
| } |
| |
| @org.junit.Test |
| public void testQueryFactorWithAggregation() throws DataAccessException { |
| ModelManager modelManager = context.getModelManager().get(); |
| QueryService queryService = context.getQueryService().get(); |
| |
| EntityType unitEntityType = modelManager.getEntityType(Unit.class); |
| Attribute factorAttribute = unitEntityType.getAttribute("Factor"); |
| |
| List<Result> listRes = queryService.createQuery().select(factorAttribute, Aggregation.COUNT) |
| .group(factorAttribute).fetch(); |
| |
| assertThat(listRes.size()).isGreaterThanOrEqualTo(1); |
| assertThat(listRes.get(0).getValue(factorAttribute, Aggregation.COUNT).getValueType()) |
| .isEqualTo(ValueType.INTEGER); |
| } |
| |
| @org.junit.Test |
| public void testQueryFactorWithAndWithoutAggregation() throws DataAccessException { |
| ModelManager modelManager = context.getModelManager().get(); |
| QueryService queryService = context.getQueryService().get(); |
| |
| EntityType unitEntityType = modelManager.getEntityType(Unit.class); |
| Attribute factorAttribute = unitEntityType.getAttribute("Factor"); |
| |
| List<Result> listRes = queryService.createQuery().select(factorAttribute) |
| .select(factorAttribute, Aggregation.SUM).group(factorAttribute).fetch(); |
| |
| assertThat(listRes.size()).isGreaterThanOrEqualTo(1); |
| assertThat(listRes.get(0).getValue(factorAttribute).getValueType()).isEqualTo(ValueType.DOUBLE); |
| assertThat(listRes.get(0).getValue(factorAttribute, Aggregation.SUM).getValueType()) |
| .isEqualTo(ValueType.DOUBLE); |
| } |
| |
| } |