Author: pgil
Date: Fri Aug 31 15:32:02 2018 New Revision: 1839763 URL: http://svn.apache.org/viewvc?rev=1839763&view=rev Log: Implemented: Refactor EntityUtil findBy methods using Stream API (OFBIZ-10537) Thanks Jacques and Mathieu for the review Added: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityUtilTestSuite.java (with props) Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntityUtil.java ofbiz/ofbiz-framework/trunk/framework/entity/testdef/entitytests.xml Added: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityUtilTestSuite.java URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityUtilTestSuite.java?rev=1839763&view=auto ============================================================================== --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityUtilTestSuite.java (added) +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityUtilTestSuite.java Fri Aug 31 15:32:02 2018 @@ -0,0 +1,101 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + *******************************************************************************/ +package org.apache.ofbiz.entity.test; + +import org.apache.ofbiz.base.util.StringUtil; +import org.apache.ofbiz.base.util.UtilMisc; +import org.apache.ofbiz.entity.GenericValue; +import org.apache.ofbiz.entity.condition.EntityCondition; +import org.apache.ofbiz.entity.condition.EntityExpr; +import org.apache.ofbiz.entity.condition.EntityOperator; +import org.apache.ofbiz.entity.testtools.EntityTestCase; +import org.apache.ofbiz.entity.util.EntityUtil; + +import java.util.ArrayList; +import java.util.List; + +public class EntityUtilTestSuite extends EntityTestCase { + + public static final String module = EntityUtilTestSuite.class.getName(); + + public static final long TEST_COUNT = 1000; + + public EntityUtilTestSuite(String name) { + super(name); + } + + private List<GenericValue> prepareGenericValueList() { + List<GenericValue> newValues = new ArrayList<>(); + for (int i = 0; i < TEST_COUNT; i++) { + newValues.add(delegator.makeValue("Testing", "testingId", StringUtil.padNumberString(String.valueOf(i), 5), "description", "Description " + i % 10)); + } + return newValues; + } + + public void testGetFieldListFromEntityList() { + List<GenericValue> newValues = prepareGenericValueList(); + List<String> descriptionList = EntityUtil.getFieldListFromEntityList(newValues, "description", false); + assertEquals("Get not distinct field list from " + TEST_COUNT + " entity", TEST_COUNT, descriptionList.size()); + assertEquals("Get first description value", "Description 0", descriptionList.get(0)); + assertEquals("Get tens description value", "Description 0", descriptionList.get(10)); + + descriptionList = EntityUtil.getFieldListFromEntityList(newValues, "description", true); + assertEquals("Get distinct field list from " + TEST_COUNT + " entity, modulo 10 values", 10, descriptionList.size()); + assertEquals("Get first description value", "Description 0", descriptionList.get(0)); + } + + public void testFilterByCondition() { + List<GenericValue> newValues = prepareGenericValueList(); + EntityExpr condition = EntityCondition.makeCondition("description", "Description 0"); + List<GenericValue> filteredValues = EntityUtil.filterByCondition(newValues, condition); + assertEquals("Filter on 10% description condition " + TEST_COUNT + " entity", TEST_COUNT / 10, filteredValues.size()); + assertEquals("Get first description value", "Description 0", filteredValues.get(0).get("description")); + + filteredValues = EntityUtil.filterOutByCondition(newValues, condition); + assertEquals("Filter out on 10% description condition " + TEST_COUNT + " entity", TEST_COUNT - TEST_COUNT / 10, filteredValues.size()); + assertEquals("Get first description value", "Description 1", filteredValues.get(0).get("description")); + } + + public void testFilterByAnd() { + List<GenericValue> newValues = prepareGenericValueList(); + List<EntityExpr> condition = UtilMisc.toList(EntityCondition.makeCondition("description", "Description 0"), + EntityCondition.makeCondition("testingId", "00010")); + List<GenericValue> filteredWithMap = EntityUtil.filterByAnd(newValues, UtilMisc.toMap("description", "Description 0", "testingId", "00010")); + List<GenericValue> filteredWithCondition = EntityUtil.filterByAnd(newValues, condition); + assertEquals("Filter with same condition using Map and List<EntityExpr> ", filteredWithCondition, filteredWithMap); + + condition = UtilMisc.toList(EntityCondition.makeCondition("description", "Description 0"), + EntityCondition.makeCondition("testingId", EntityOperator.LIKE, "000%")); + filteredWithCondition = EntityUtil.filterByAnd(newValues, condition); + assertEquals("Filter condition using List<EntityExpr> must have 10 results", 10, filteredWithCondition.size()); + filteredWithCondition.forEach(genericValue -> + assertEquals("Filter condition using List<EntityExpr> must get simple description", + "Description 0", genericValue.get("description"))); + } + + public void testFilterByOr() { + List<GenericValue> newValues = prepareGenericValueList(); + List<EntityExpr> condition = UtilMisc.toList(EntityCondition.makeCondition("description", "Description 0"), + EntityCondition.makeCondition("testingId", "00001")); + List<GenericValue> filteredWithCondition = EntityUtil.filterByOr(newValues, condition); + + assertEquals("Filter condition using List<EntityExpr> must have " + (TEST_COUNT / 10 + 1) + " results", + TEST_COUNT / 10 + 1, filteredWithCondition.size()); + } +} Propchange: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityUtilTestSuite.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityUtilTestSuite.java ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/test/EntityUtilTestSuite.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntityUtil.java URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntityUtil.java?rev=1839763&r1=1839762&r2=1839763&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntityUtil.java (original) +++ ofbiz/ofbiz-framework/trunk/framework/entity/src/main/java/org/apache/ofbiz/entity/util/EntityUtil.java Fri Aug 31 15:32:02 2018 @@ -32,6 +32,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.stream.Stream; import org.apache.ofbiz.base.util.Debug; import org.apache.ofbiz.base.util.UtilDateTime; @@ -49,6 +50,8 @@ import org.apache.ofbiz.entity.condition import org.apache.ofbiz.entity.condition.OrderByList; import org.apache.ofbiz.entity.model.ModelField; +import static java.util.stream.Collectors.toList; + /** * Helper methods when dealing with Entities, especially ones that follow certain conventions */ @@ -265,21 +268,10 @@ public final class EntityUtil { *@return List of GenericValue's that match the values in fields */ public static <T extends GenericEntity> List<T> filterByAnd(List<T> values, Map<String, ? extends Object> fields) { - if (values == null) return null; - - List<T> result = null; - if (UtilValidate.isEmpty(fields)) { - result = new LinkedList<T>(); - result.addAll(values); - } else { - result = new LinkedList<T>(); - for (T value: values) { - if (value.matchesFields(fields)) { - result.add(value); - }// else did not match - } + if (values == null || UtilValidate.isEmpty(fields)) { + return values; } - return result; + return values.stream().filter(value -> value.matchesFields(fields)).collect(toList()); } /** @@ -290,25 +282,13 @@ public final class EntityUtil { *@return List of GenericValue's that match the values in fields */ public static <T extends GenericEntity> List<T> filterByAnd(List<T> values, List<? extends EntityCondition> exprs) { - if (values == null) return null; - if (UtilValidate.isEmpty(exprs)) { - // no constraints... oh well + if (values == null || UtilValidate.isEmpty(exprs)) { return values; } - List<T> result = new LinkedList<T>(); - for (T value: values) { - boolean include = true; - - for (EntityCondition condition: exprs) { - include = condition.entityMatches(value); - if (!include) break; - } - if (include) { - result.add(value); - } - } - return result; + return values.stream() + .filter(value -> exprs.stream().allMatch(condition -> condition.entityMatches(value))) + .collect(toList()); } /** @@ -319,24 +299,13 @@ public final class EntityUtil { *@return List of GenericValue's that match the values in fields */ public static <T extends GenericEntity> List<T> filterByOr(List<T> values, List<? extends EntityCondition> exprs) { - if (values == null) return null; - if (UtilValidate.isEmpty(exprs)) { + if (values == null || UtilValidate.isEmpty(exprs)) { return values; } - List<T> result = new LinkedList<T>(); - for (T value: values) { - boolean include = false; - - for (EntityCondition condition: exprs) { - include = condition.entityMatches(value); - if (include) break; - } - if (include) { - result.add(value); - } - } - return result; + return values.stream() + .filter(value -> exprs.stream().anyMatch(condition -> condition.entityMatches(value))) + .collect(toList()); } /** @@ -415,27 +384,17 @@ public final class EntityUtil { } public static <T extends GenericEntity> List<T> filterByCondition(List<T> values, EntityCondition condition) { - if (values == null) return null; - - List<T> result = new LinkedList<T>(); - for (T value: values) { - if (condition.entityMatches(value)) { - result.add(value); - } + if (values == null || UtilValidate.isEmpty(condition)) { + return values; } - return result; + return values.stream().filter(value -> condition.entityMatches(value)).collect(toList()); } public static <T extends GenericEntity> List<T> filterOutByCondition(List<T> values, EntityCondition condition) { - if (values == null) return null; - - List<T> result = new LinkedList<T>(); - for (T value: values) { - if (!condition.entityMatches(value)) { - result.add(value); - } + if (values == null || UtilValidate.isEmpty(condition)) { + return values; } - return result; + return values.stream().filter(value -> !condition.entityMatches(value)).collect(toList()); } public static List<GenericValue> findDatedInclusionEntity(Delegator delegator, String entityName, Map<String, ? extends Object> search) throws GenericEntityException { @@ -505,27 +464,13 @@ public final class EntityUtil { if (genericValueList == null || fieldName == null) { return null; } - List<T> fieldList = new LinkedList<T>(); - Set<T> distinctSet = null; - if (distinct) { - distinctSet = new HashSet<T>(); - } - for (GenericValue value: genericValueList) { - T fieldValue = UtilGenerics.<T>cast(value.get(fieldName)); - if (fieldValue != null) { - if (distinct) { - if (!distinctSet.contains(fieldValue)) { - fieldList.add(fieldValue); - distinctSet.add(fieldValue); - } - } else { - fieldList.add(fieldValue); - } - } + Stream<T> tStream = genericValueList.stream().map(genericValue -> UtilGenerics.cast(genericValue.get(fieldName))); + if (distinct) { + return tStream.distinct().collect(toList()); + } else { + return tStream.collect(toList()); } - - return fieldList; } public static <T> List<T> getFieldListFromEntityListIterator(EntityListIterator genericValueEli, String fieldName, boolean distinct) { Modified: ofbiz/ofbiz-framework/trunk/framework/entity/testdef/entitytests.xml URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/testdef/entitytests.xml?rev=1839763&r1=1839762&r2=1839763&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/framework/entity/testdef/entitytests.xml (original) +++ ofbiz/ofbiz-framework/trunk/framework/entity/testdef/entitytests.xml Fri Aug 31 15:32:02 2018 @@ -22,6 +22,7 @@ under the License. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/test-suite.xsd"> <test-case case-name="entity-tests"><junit-test-suite class-name="org.apache.ofbiz.entity.test.EntityTestSuite"/></test-case> + <test-case case-name="entity-util-tests"><junit-test-suite class-name="org.apache.ofbiz.entity.test.EntityUtilTestSuite"/></test-case> <test-case case-name="entity-crypto-tests"><junit-test-suite class-name="org.apache.ofbiz.entity.test.EntityCryptoTestSuite"/></test-case> <test-case case-name="entity-query-tests"><junit-test-suite class-name="org.apache.ofbiz.entity.test.EntityQueryTestSuite"/></test-case> <test-case case-name="entity-util-properties-tests"> |
Free forum by Nabble | Edit this page |