/*
* 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.exec.DBCLogicalOperator;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.utils.CommonUtils;
/**
* Attribute constraint
*/
public class DBDAttributeConstraint {
private final DBSAttributeBase attribute;
private int orderPosition;
private boolean orderDescending;
private String criteria;
private DBCLogicalOperator operator;
private boolean reverseOperator;
private Object value;
private boolean visible;
private int visualPosition;
private final int originalVisualPosition;
// USed to generate expressions
private transient String entityAlias;
public DBDAttributeConstraint(DBDAttributeBinding attribute)
{
this.attribute = attribute;
this.originalVisualPosition = this.visualPosition = attribute.getOrdinalPosition();
}
public DBDAttributeConstraint(DBSAttributeBase attribute, int visualPosition)
{
this.attribute = attribute;
this.originalVisualPosition = this.visualPosition = visualPosition;
}
public DBDAttributeConstraint(DBDAttributeConstraint source)
{
this.attribute = source.attribute;
this.orderPosition = source.orderPosition;
this.orderDescending = source.orderDescending;
this.criteria = source.criteria;
this.operator = source.operator;
this.reverseOperator = source.reverseOperator;
this.value = source.value;
this.visible = source.visible;
this.originalVisualPosition = source.originalVisualPosition;
this.visualPosition = source.visualPosition;
}
public DBSAttributeBase getAttribute()
{
return attribute;
}
public int getOrderPosition()
{
return orderPosition;
}
public void setOrderPosition(int orderPosition)
{
this.orderPosition = orderPosition;
}
public boolean isOrderDescending()
{
return orderDescending;
}
public void setOrderDescending(boolean orderDescending)
{
this.orderDescending = orderDescending;
}
public String getCriteria()
{
return criteria;
}
public void setCriteria(@Nullable String criteria)
{
this.criteria = criteria;
this.operator = null;
this.reverseOperator = false;
this.value = null;
}
public DBCLogicalOperator getOperator() {
return operator;
}
public void setOperator(DBCLogicalOperator operator) {
this.criteria = null;
this.operator = operator;
}
public boolean isReverseOperator() {
return reverseOperator;
}
public void setReverseOperator(boolean reverseOperator) {
this.reverseOperator = reverseOperator;
}
public Object getValue() {
return value;
}
public void setValue(@Nullable Object value) {
this.criteria = null;
this.value = value;
}
public boolean hasFilter()
{
return hasCondition() || orderPosition > 0;
}
public boolean hasCondition() {
return !CommonUtils.isEmpty(criteria) || operator != null;
}
public boolean isVisible()
{
return visible;
}
public void setVisible(boolean visible)
{
this.visible = visible;
}
public int getOriginalVisualPosition() {
return originalVisualPosition;
}
public int getVisualPosition()
{
return visualPosition;
}
public void setVisualPosition(int visualPosition)
{
this.visualPosition = visualPosition;
}
/**
* Attribute owner entity alias.
* Null by default. Can be set by SQL generation routines after entity alias resolution.
*/
public String getEntityAlias() {
return entityAlias;
}
public void setEntityAlias(String entityAlias) {
this.entityAlias = entityAlias;
}
public void reset()
{
this.orderPosition = 0;
this.orderDescending = false;
this.criteria = null;
this.operator = null;
this.reverseOperator = false;
this.value = null;
this.visible = true;
this.visualPosition = originalVisualPosition;
}
public boolean equalFilters(DBDAttributeConstraint obj, boolean compareOrders)
{
if (compareOrders) {
if (this.orderPosition != obj.orderPosition ||
this.orderDescending != obj.orderDescending) {
return false;
}
}
return
CommonUtils.equalObjects(this.attribute, obj.attribute) &&
CommonUtils.equalObjects(this.criteria, obj.criteria) &&
CommonUtils.equalObjects(this.operator, obj.operator) &&
CommonUtils.equalObjects(this.reverseOperator, obj.reverseOperator) &&
CommonUtils.equalObjects(this.value, obj.value);
}
@Override
public int hashCode()
{
return this.attribute.hashCode();
}
@Override
public boolean equals(Object obj)
{
if (obj instanceof DBDAttributeConstraint) {
DBDAttributeConstraint source = (DBDAttributeConstraint) obj;
return
CommonUtils.equalObjects(this.attribute, source.attribute) &&
this.orderPosition == source.orderPosition &&
this.orderDescending == source.orderDescending &&
CommonUtils.equalObjects(this.criteria, source.criteria) &&
CommonUtils.equalObjects(this.operator, source.operator) &&
this.reverseOperator == source.reverseOperator &&
CommonUtils.equalObjects(this.value, source.value) &&
this.visible == source.visible &&
this.visualPosition == source.visualPosition;
} else {
return false;
}
}
@Override
public String toString() {
String clause = operator == null ?
(criteria == null ? "" : criteria) :
(reverseOperator ? "NOT " : "") + operator.getStringValue() + " " + value;
return attribute.getName() + " " + clause;
}
public boolean matches(DBSAttributeBase attr, boolean matchByName) {
return attribute == attr ||
(attribute instanceof DBDAttributeBinding && ((DBDAttributeBinding) attribute).matches(attr, matchByName));
}
}