All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uk.gov.gchq.gaffer.data.element.comparison.ElementPropertyComparator Maven / Gradle / Ivy

There is a newer version: 2.3.1
Show newest version
/*
 * Copyright 2017-2020 Crown Copyright
 *
 * Licensed 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 uk.gov.gchq.gaffer.data.element.comparison;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.google.common.collect.Sets;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

import uk.gov.gchq.gaffer.commonutil.pair.Pair;
import uk.gov.gchq.gaffer.data.element.Element;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

/**
 * An {@link uk.gov.gchq.gaffer.data.element.comparison.ElementComparator} implementation
 * to use when making comparisons based on a single element property (e.g. a count
 * field).
 * 

* You must provide the property name and the set of element groups that contain * that property. *

*

* Any elements that are compared that are not in one of the provided groups * will be returned 'last' in the result. *

*

* Any elements that are compared that do not have the provided property * will also be returned 'last' in the result. *

*

* There is a reversed option to allow you to flip the comparison value. *

*/ @JsonPropertyOrder(value = {"class", "property", "comparator", "groups"}, alphabetic = true) @SuppressFBWarnings(value = "SE_COMPARATOR_SHOULD_BE_SERIALIZABLE", justification = "This class should not be serialised") public class ElementPropertyComparator implements ElementComparator { private Comparator comparator; public static int count = 0; private String property = null; private Set groups = Collections.emptySet(); private boolean reversed; @Override public int compare(final Element e1, final Element e2) { count++; if (null == e1) { if (null == e2) { return 0; } return 1; } if (null == e2) { return -1; } if (!groups.contains(e1.getGroup())) { if (!groups.contains(e2.getGroup())) { return 0; } return 1; } if (!groups.contains(e2.getGroup())) { return -1; } return _compare(e1.getProperty(property), e2.getProperty(property)); } public int _compare(final Object val1, final Object val2) { if (null == val1) { if (null == val2) { return 0; } return 1; } if (null == val2) { return -1; } if (null == comparator) { if (reversed) { return ((Comparable) val2).compareTo(val1); } return ((Comparable) val1).compareTo(val2); } if (reversed) { return comparator.compare(val2, val1); } return comparator.compare(val1, val2); } @Override public Set> getComparableGroupPropertyPairs() { if (null == comparator) { if (1 == groups.size()) { return Collections.singleton(new Pair<>(groups.iterator().next(), property)); } final Set> pairs = new HashSet<>(groups.size()); for (final String groupName : groups) { pairs.add(new Pair<>(groupName, property)); } return pairs; } return Collections.emptySet(); } public String getProperty() { return property; } public void setProperty(final String property) { this.property = property; } public Set getGroups() { return groups; } public void setGroups(final Set groups) { this.groups = groups; } public boolean isReversed() { return reversed; } public void setReversed(final boolean reversed) { this.reversed = reversed; } @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "class") public Comparator getComparator() { return comparator; } public void setComparator(final Comparator comparator) { this.comparator = comparator; } public static class Builder { private ElementPropertyComparator comparator = new ElementPropertyComparator(); public ElementPropertyComparator build() { return comparator; } public Builder comparator(final Comparator comparator) { this.comparator.setComparator(comparator); return this; } public Builder groups(final String... group) { comparator.setGroups(Sets.newHashSet(group)); return this; } public Builder property(final String property) { comparator.setProperty(property); return this; } public Builder reverse(final boolean reverse) { comparator.setReversed(reverse); return this; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy