/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * 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 org.jkiss.dbeaver.model.data; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.model.struct.DBSAttributeBase; import org.jkiss.utils.CommonUtils; import java.util.*; /** * Data filter */ public class DBDDataFilter { private final List<DBDAttributeConstraint> constraints; private boolean anyConstraint; // means OR condition private String order; private String where; public DBDDataFilter(List<DBDAttributeConstraint> constraints) { this.constraints = constraints; } public DBDDataFilter(DBDDataFilter source) { constraints = new ArrayList<>(source.constraints.size()); for (DBDAttributeConstraint column : source.constraints) { constraints.add(new DBDAttributeConstraint(column)); } this.order = source.order; this.where = source.where; this.anyConstraint = source.anyConstraint; } public List<DBDAttributeConstraint> getConstraints() { return constraints; } @Nullable public DBDAttributeConstraint getConstraint(DBDAttributeBinding binding) { for (DBDAttributeConstraint co : constraints) { if (co.getAttribute() == binding) { return co; } } return null; } @Nullable public DBDAttributeConstraint getConstraint(DBSAttributeBase attribute, boolean metaChanged) { for (DBDAttributeConstraint co : constraints) { if (co.matches(attribute, metaChanged)) { return co; } } return null; } public void addConstraints(List<DBDAttributeConstraint> constraints) { this.constraints.addAll(constraints); } public List<DBSAttributeBase> getOrderedVisibleAttributes() { List<DBDAttributeConstraint> visibleConstraints = new ArrayList<>(); for (DBDAttributeConstraint constraint : constraints) { if (constraint.isVisible()) { visibleConstraints.add(constraint); } } Collections.sort(visibleConstraints, new Comparator<DBDAttributeConstraint>() { @Override public int compare(DBDAttributeConstraint o1, DBDAttributeConstraint o2) { return o1.getVisualPosition() - o2.getVisualPosition(); } }); List<DBSAttributeBase> attributes = new ArrayList<>(visibleConstraints.size()); for (DBDAttributeConstraint constraint : visibleConstraints) { attributes.add(constraint.getAttribute()); } return attributes; } public boolean isAnyConstraint() { return anyConstraint; } public void setAnyConstraint(boolean anyConstraint) { this.anyConstraint = anyConstraint; } public String getOrder() { return order; } public void setOrder(@Nullable String order) { this.order = order; } public String getWhere() { return where; } public void setWhere(@Nullable String where) { this.where = where; } public boolean hasFilters() { if (!CommonUtils.isEmpty(this.order) || !CommonUtils.isEmpty(this.where)) { return true; } for (DBDAttributeConstraint constraint : constraints) { if (constraint.hasFilter()) { return true; } } return false; } public boolean hasConditions() { if (!CommonUtils.isEmpty(where)) { return true; } for (DBDAttributeConstraint constraint : constraints) { if (constraint.hasCondition()) { return true; } } return false; } public boolean hasOrdering() { if (!CommonUtils.isEmpty(order)) { return true; } for (DBDAttributeConstraint constraint : constraints) { if (constraint.getOrderPosition() > 0) { return true; } } return false; } public List<DBDAttributeConstraint> getOrderConstraints() { List<DBDAttributeConstraint> result = null; for (DBDAttributeConstraint constraint : constraints) { if (constraint.getOrderPosition() > 0) { if (result == null) { result = new ArrayList<>(constraints.size()); } result.add(constraint); } } if (result != null && result.size() > 1) { Collections.sort(result, new Comparator<DBDAttributeConstraint>() { @Override public int compare(DBDAttributeConstraint o1, DBDAttributeConstraint o2) { return o1.getOrderPosition() - o2.getOrderPosition(); } }); } return result == null ? Collections.<DBDAttributeConstraint>emptyList() : result; } public int getMaxOrderingPosition() { int maxPosition = 0; for (DBDAttributeConstraint constraint : constraints) { if (constraint.getOrderPosition() > maxPosition) { maxPosition = constraint.getOrderPosition(); } } return maxPosition; } public void resetOrderBy() { this.order = null; for (DBDAttributeConstraint constraint : constraints) { constraint.setOrderPosition(0); constraint.setOrderDescending(false); } } public void reset() { for (DBDAttributeConstraint constraint : constraints) { constraint.reset(); } this.order = null; this.where = null; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof DBDDataFilter)) { return false; } DBDDataFilter source = (DBDDataFilter)obj; if (constraints.size() != source.constraints.size()) { return false; } if (anyConstraint != source.anyConstraint) { return false; } for (int i = 0, orderColumnsSize = source.constraints.size(); i < orderColumnsSize; i++) { if (!constraints.get(i).equals(source.constraints.get(i))) { return false; } } return CommonUtils.equalObjects(this.order, source.order) && CommonUtils.equalObjects(this.where, source.where); } /** * compares only filers (criteria and ordering) * @param source object to compare to * @return true if filters equals */ public boolean equalFilters(DBDDataFilter source, boolean compareOrders) { if (anyConstraint != source.anyConstraint) { return false; } if (constraints.size() != source.constraints.size()) { return false; } for (int i = 0; i < source.constraints.size(); i++) { if (!constraints.get(i).equalFilters(source.constraints.get(i), compareOrders)) { return false; } } return CommonUtils.equalObjects(this.order, source.order) && CommonUtils.equalObjects(this.where, source.where); } }