/*
* 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.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.exec.DBCAttributeMetaData;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.struct.DBSEntityAttribute;
import org.jkiss.dbeaver.model.struct.DBSEntityReferrer;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.utils.CommonUtils;
import java.util.List;
/**
* Attribute value binding info
*/
public class DBDAttributeBindingMeta extends DBDAttributeBinding {
@NotNull
private final DBPDataSource dataSource;
@NotNull
private final DBCAttributeMetaData metaAttribute;
@Nullable
private DBSEntityAttribute entityAttribute;
@Nullable
private DBDRowIdentifier rowIdentifier;
@Nullable
private List<DBSEntityReferrer> referrers;
@Nullable
private DBDPseudoAttribute pseudoAttribute;
public DBDAttributeBindingMeta(
@NotNull DBCSession session,
@NotNull DBCAttributeMetaData metaAttribute)
{
super(DBUtils.findValueHandler(session, metaAttribute));
this.dataSource = session.getDataSource();
this.metaAttribute = metaAttribute;
}
public DBDAttributeBindingMeta(
@NotNull DBPDataSource dataSource,
@NotNull DBCAttributeMetaData metaAttribute)
{
super(DBUtils.findValueHandler(dataSource, metaAttribute));
this.dataSource = dataSource;
this.metaAttribute = metaAttribute;
}
@NotNull
@Override
public DBPDataSource getDataSource() {
return dataSource;
}
@Nullable
@Override
public DBDAttributeBinding getParentObject() {
return null;
}
/**
* Attribute index in result set
* @return attribute index (zero based)
*/
@Override
public int getOrdinalPosition()
{
return metaAttribute.getOrdinalPosition();
}
@Override
public boolean isRequired() {
return getAttribute().isRequired();
}
@Override
public boolean isAutoGenerated() {
return getAttribute().isAutoGenerated();
}
@Override
public boolean isPseudoAttribute() {
return pseudoAttribute != null;
}
@Override
public String getTypeName() {
return getAttribute().getTypeName();
}
@Override
public String getFullTypeName() {
return getAttribute().getFullTypeName();
}
@Override
public int getTypeID() {
return getAttribute().getTypeID();
}
@Override
public DBPDataKind getDataKind() {
return getAttribute().getDataKind();
}
@Override
public int getScale() {
return getAttribute().getScale();
}
@Override
public int getPrecision() {
return getAttribute().getPrecision();
}
@Override
public long getMaxLength() {
return getAttribute().getMaxLength();
}
/**
* Attribute label
*/
@NotNull
public String getLabel()
{
return metaAttribute.getLabel();
}
/**
* Attribute name
*/
@NotNull
public String getName()
{
return metaAttribute.getName();
}
/**
* Meta attribute (obtained from result set)
*/
@NotNull
public DBCAttributeMetaData getMetaAttribute() {
return metaAttribute;
}
/**
* Entity attribute (may be null)
*/
@Nullable
public DBSEntityAttribute getEntityAttribute()
{
return entityAttribute;
}
/**
* Row identifier (may be null)
*/
@Nullable
public DBDRowIdentifier getRowIdentifier() {
return rowIdentifier;
}
@Nullable
@Override
public List<DBSEntityReferrer> getReferrers() {
return referrers;
}
@Nullable
@Override
public Object extractNestedValue(@NotNull Object ownerValue) throws DBCException {
throw new DBCException("Meta binding doesn't support nested values");
}
/**
* Sets entity attribute
* @return true if attribute type differs from meta attribute type.
*/
public boolean setEntityAttribute(@Nullable DBSEntityAttribute entityAttribute) {
this.entityAttribute = entityAttribute;
if (entityAttribute != null && !haveEqualsTypes(metaAttribute, entityAttribute)) {
valueHandler = DBUtils.findValueHandler(getDataSource(), entityAttribute);
return true;
}
return false;
}
public static boolean haveEqualsTypes(DBSTypedObject object1, DBSTypedObject object2) {
return object1.getTypeID() == object2.getTypeID() &&
object1.getTypeName().equalsIgnoreCase(object2.getTypeName());
}
public void setRowIdentifier(@Nullable DBDRowIdentifier rowIdentifier) {
this.rowIdentifier = rowIdentifier;
}
@Override
public void lateBinding(@NotNull DBCSession session, List<Object[]> rows) throws DBException {
DBSEntityAttribute entityAttribute = getEntityAttribute();
if (entityAttribute != null) {
referrers = DBUtils.getAttributeReferrers(session.getProgressMonitor(), entityAttribute);
}
super.lateBinding(session, rows);
}
@Nullable
public DBDPseudoAttribute getPseudoAttribute() {
return pseudoAttribute;
}
public void setPseudoAttribute(@Nullable DBDPseudoAttribute pseudoAttribute) {
this.pseudoAttribute = pseudoAttribute;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof DBDAttributeBindingMeta) {
DBCAttributeMetaData cmpMeta = ((DBDAttributeBindingMeta) obj).metaAttribute;
return
CommonUtils.equalObjects(metaAttribute.getName(), cmpMeta.getName()) &&
CommonUtils.equalObjects(metaAttribute.getLabel(), cmpMeta.getLabel()) &&
CommonUtils.equalObjects(metaAttribute.getEntityName(), cmpMeta.getEntityName()) &&
metaAttribute.getOrdinalPosition() == cmpMeta.getOrdinalPosition() &&
metaAttribute.getTypeID() == cmpMeta.getTypeID() &&
CommonUtils.equalObjects(metaAttribute.getTypeName(), cmpMeta.getTypeName())
;
}
return false;
}
}