package org.infinispan.objectfilter.impl.syntax.parser; import java.util.Collections; import java.util.List; /** * @author anistor@redhat.com * @since 8.0 */ public final class RowPropertyHelper extends ObjectPropertyHelper<RowPropertyHelper.RowMetadata> { public static final class RowMetadata { private final ColumnMetadata[] columns; RowMetadata(ColumnMetadata[] columns) { this.columns = columns; } public ColumnMetadata[] getColumns() { return columns; } } public static final class ColumnMetadata { private final int columnIndex; private final String columnName; private final Class<?> type; public ColumnMetadata(int columnIndex, String columnName, Class<?> type) { this.columnIndex = columnIndex; this.columnName = columnName; this.type = type; } public Object getValue(Object instance) { return ((Object[]) instance)[columnIndex]; } public int getColumnIndex() { return columnIndex; } public String getColumnName() { return columnName; } public Class<?> getPropertyType() { return type; } @Override public String toString() { return "ColumnMetadata{" + "columnIndex=" + columnIndex + ", columnName='" + columnName + '\'' + ", type=" + type + '}'; } } private final RowMetadata rowMetadata; public RowPropertyHelper(RowPropertyHelper.ColumnMetadata[] columns) { this.rowMetadata = new RowPropertyHelper.RowMetadata(columns); } public RowMetadata getRowMetadata() { return rowMetadata; } @Override public RowMetadata getEntityMetadata(String typeName) { // the type name is ignored in this case! return rowMetadata; } @Override public List<?> mapPropertyNamePathToFieldIdPath(RowMetadata type, String[] propertyPath) { if (propertyPath.length > 1) { throw new IllegalStateException("Nested attributes are not supported"); } String columnName = propertyPath[0]; for (RowPropertyHelper.ColumnMetadata c : rowMetadata.getColumns()) { if (c.getColumnName().equals(columnName)) { return Collections.singletonList(c.getColumnIndex()); } } throw new IllegalArgumentException("Column not found : " + columnName); } @Override public Class<?> getPrimitivePropertyType(RowPropertyHelper.RowMetadata entityType, String[] propertyPath) { // entityType is ignored in this case! Class<?> propType = getColumnAccessor(propertyPath).getPropertyType(); if (propType.isEnum() || primitives.containsKey(propType)) { return propType; } return null; } private ColumnMetadata getColumnAccessor(String[] propertyPath) { if (propertyPath.length > 1) { throw new IllegalStateException("Nested attributes are not supported"); } String columnName = propertyPath[0]; for (RowPropertyHelper.ColumnMetadata c : rowMetadata.getColumns()) { if (c.getColumnName().equals(columnName)) { return c; } } throw new IllegalArgumentException("Column not found : " + columnName); } @Override public boolean hasProperty(RowPropertyHelper.RowMetadata entityType, String[] propertyPath) { if (propertyPath.length > 1) { throw new IllegalStateException("Nested attributes are not supported"); } String columnName = propertyPath[0]; for (RowPropertyHelper.ColumnMetadata c : rowMetadata.getColumns()) { if (c.getColumnName().equals(columnName)) { return true; } } return false; } @Override public boolean hasEmbeddedProperty(RowPropertyHelper.RowMetadata entityType, String[] propertyPath) { return false; } @Override public boolean isRepeatedProperty(RowPropertyHelper.RowMetadata entityType, String[] propertyPath) { return false; } }