package org.reldb.dbrowser.ui.content.rel.var.grids; import org.reldb.rel.client.Tuple; class Attr { public static final int NAME_COLUMN = 0; public static final int TYPE_COLUMN = 1; public static final int HEADING_COLUMN = 2; public static final int COLUMN_COUNT = 3; private String oldName; private String oldTypeName; private String oldHeading; private String newName; private String newTypeName; private String newHeading; Attr(Tuple tuple) { oldName = tuple.get(NAME_COLUMN).toString(); oldTypeName = tuple.get(TYPE_COLUMN).toString(); oldHeading = tuple.get(HEADING_COLUMN).toString(); newName = null; newTypeName = null; newHeading = null; } Attr() { oldName = null; oldTypeName = null; oldHeading = null; newName = null; newTypeName = null; newHeading = null; } String getOriginalColumnValue(int column) { switch (column) { case NAME_COLUMN: return oldName; case TYPE_COLUMN: return oldTypeName; default: return oldHeading; } } String getNewColumnValue(int column) { switch (column) { case NAME_COLUMN: return newName; case TYPE_COLUMN: return newTypeName; default: return newHeading; } } String getColumnValue(int column) { switch (column) { case NAME_COLUMN: return (newName != null) ? newName : oldName; case TYPE_COLUMN: return (newTypeName != null) ? newTypeName : oldTypeName; default: return (!isEditableNonscalarDefinition()) ? null : ((newHeading != null) ? newHeading : oldHeading); } } void setColumnValue(int column, Object newValue) { if (newValue == null) return; switch (column) { case NAME_COLUMN: newName = newValue.toString(); break; case TYPE_COLUMN: if (newTypeName != null && newTypeName.equals(newValue.toString())) return; newTypeName = newValue.toString(); if (newTypeName.equals("RELATION")) newHeading = "NonScalar(\"RELATION\", RELATION {AttrName CHARACTER, AttrType TypeInfo} {})"; else if (newTypeName.equals("TUPLE")) newHeading = "NonScalar(\"TUPLE\", RELATION {AttrName CHARACTER, AttrType TypeInfo} {})"; else newHeading = null; break; default: newHeading = (newValue != null) ? newValue.toString() : null; } } String getName() { if (newName == null) { if (oldName == null) return ""; return oldName; } return newName; } boolean isEditableNonscalarDefinition() { Object typeName = getColumnValue(1); if (typeName == null) return false; return isNameAndTypeFilled() && isNonScalar(typeName.toString()); } static boolean isNonScalar(String type) { return type.equals("RELATION") || type.equals("TUPLE") || type.equals("ARRAY"); } boolean isNameAndTypeFilled() { Object name = getColumnValue(NAME_COLUMN); Object type = getColumnValue(TYPE_COLUMN); return (name != null && name.toString().trim().length() > 0 && type != null && type.toString().trim().length() > 0); } boolean isFilled() { return isNameAndTypeFilled() && ((isEditableNonscalarDefinition() && getColumnValue(HEADING_COLUMN) != null) || !isEditableNonscalarDefinition()); } // Convert this into a TypeInfo literal public String getTypeInfoLiteral() { if (isEditableNonscalarDefinition()) return "TUPLE {AttrName '" + getColumnValue(NAME_COLUMN) + "', AttrType " + getColumnValue(HEADING_COLUMN) + "}"; else return "TUPLE {AttrName '" + getColumnValue(NAME_COLUMN) + "', AttrType Scalar(\"" + getColumnValue(TYPE_COLUMN) + "\")}"; } private boolean isChange(int column) { return getOriginalColumnValue(column) != null && getNewColumnValue(column) != null && !getOriginalColumnValue(column).equals(getNewColumnValue(column)); } boolean isNameChange() { return isChange(NAME_COLUMN); } boolean isTypeNameChange() { return isChange(TYPE_COLUMN); } boolean isHeadingChange() { return isEditableNonscalarDefinition() && isChange(HEADING_COLUMN); } }