diff options
Diffstat (limited to 'plugins')
2 files changed, 102 insertions, 6 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java index 86ef11412d..f7970d8b10 100644 --- a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java +++ b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java @@ -33,6 +33,7 @@ import org.eclipse.net4j.util.factory.ProductCreationException; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.DiagnosticException; +import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.Enumerator; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; @@ -60,6 +61,7 @@ import org.eclipse.ocl.helper.OCLHelper; import org.eclipse.ocl.options.ParsingOptions; import org.eclipse.ocl.types.OCLStandardLibrary; import org.eclipse.ocl.util.ProblemAware; +import org.eclipse.ocl.util.Tuple; import java.util.Arrays; import java.util.Collection; @@ -163,12 +165,7 @@ public class OCLQueryHandler implements IQueryHandler protected boolean addResult(Object result, IQueryContext context, CDOView view) { - if (result instanceof EObject) - { - CDORevision revision = getRevision((EObject)result, view); - return context.addResult(revision); - } - + result = convertResult(result, view); return context.addResult(result); } @@ -470,6 +467,30 @@ public class OCLQueryHandler implements IQueryHandler return null; } + @SuppressWarnings({ "unchecked", "rawtypes" }) + private Object convertResult(Object result, CDOView view) + { + if (result instanceof EObject) + { + return getRevision((EObject)result, view); + } + + if (result instanceof Tuple) + { + Tuple tuple = (Tuple)result; + EList properties = tuple.getTupleType().oclProperties(); + Object[] array = new Object[properties.size()]; + for (int i = 0; i < array.length; ++i) + { + array[i] = convertResult(tuple.getValue(properties.get(i)), view); + } + + return array; + } + + return result; + } + public static void prepareContainer(IManagedContainer container) { container.registerFactory(new Factory()); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_467616_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_467616_Test.java new file mode 100644 index 0000000000..0091ff864e --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_467616_Test.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2004-2014 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.tests.bugzilla; + +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.tests.AbstractCDOTest; +import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.CleanRepositoriesBefore; +import org.eclipse.emf.cdo.tests.model1.Company; +import org.eclipse.emf.cdo.tests.model1.Model1Factory; +import org.eclipse.emf.cdo.tests.model1.PurchaseOrder; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.util.CDOUtil; +import org.eclipse.emf.cdo.util.CommitException; +import org.eclipse.emf.cdo.util.ConcurrentAccessException; +import org.eclipse.emf.cdo.view.CDOQuery; +import org.eclipse.emf.cdo.view.CDOView; + +import java.util.List; + +/** + * @author Leonid Ripeynih + */ +@CleanRepositoriesBefore(reason = "Query result counting") +public class Bugzilla_467616_Test extends AbstractCDOTest +{ + private static final String PO_REPORT = "self.purchaseOrders -> collect(po | Tuple{ purchaseOrder = po, lineCount = po.orderDetails -> size() })"; + + public void testTupleOCLQuery() throws ConcurrentAccessException, CommitException + { + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + CDOResource resource = transaction.createResource(getResourcePath("/resource")); + + Company company = Model1Factory.eINSTANCE.createCompany(); + company.setName("Company"); + + company.getPurchaseOrders().add(createPo(1)); + company.getPurchaseOrders().add(createPo(2)); + + resource.getContents().add(company); + + transaction.commit(); + transaction.close(); + + CDOView view = session.openView(); + Company createdCompany = view.getObject(company); + CDOQuery query = view.createQuery("ocl", PO_REPORT, CDOUtil.getCDOObject(createdCompany).cdoID()); + + List<Object[]> result = query.getResult(Object[].class); + + assertEquals(new Object[] { createdCompany.getPurchaseOrders().get(0), 1 }, result.get(0)); + assertEquals(new Object[] { createdCompany.getPurchaseOrders().get(1), 2 }, result.get(1)); + + view.close(); + } + + private PurchaseOrder createPo(int detailCount) + { + PurchaseOrder po = Model1Factory.eINSTANCE.createPurchaseOrder(); + for (int i = 0; i < detailCount; ++i) + { + po.getOrderDetails().add(Model1Factory.eINSTANCE.createOrderDetail()); + } + return po; + } +} |