/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsmodel.query.relational; import java.util.Iterator; import java.util.List; import org.eclipse.persistence.tools.workbench.mappingsmodel.ProblemConstants; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWQuery; import org.eclipse.persistence.tools.workbench.mappingsmodel.query.MWQueryable; import org.eclipse.persistence.tools.workbench.utility.node.Node; import org.eclipse.persistence.tools.workbench.utility.node.Problem; import org.eclipse.persistence.expressions.Expression; import org.eclipse.persistence.mappings.converters.ObjectTypeConverter; import org.eclipse.persistence.mappings.foundation.AbstractDirectMapping; import org.eclipse.persistence.oxm.XMLDescriptor; import org.eclipse.persistence.queries.ObjectLevelReadQuery; import org.eclipse.persistence.queries.ReportQuery; public final class MWReportAttributeItem extends MWAttributeItem { private volatile String name; public static final String NAME_PROPERTY = "name"; private volatile String function; public static final String FUNCTION_PROPERTY = "function"; public static final String AVERAGE_FUNCTION = "Average"; public static final String COUNT_FUNCTION = "Count"; public static final String DISTINCT_FUNCTION = "Distinct"; public static final String MAXIMUM_FUNCTION = "Maximum"; public static final String MINIMUM_FUNCTION = "Minimum"; public static final String STANDARD_DEVIATION_FUNCTION = "Standard Deviation"; public static final String VARIANCE_FUNCTION = "Variance"; public static final String SUM_FUNCTION = "Sum"; public static final String NO_FUNCTION = "None"; public static final String[] FUNCTIONS = new String[] {NO_FUNCTION, AVERAGE_FUNCTION, COUNT_FUNCTION, DISTINCT_FUNCTION, MAXIMUM_FUNCTION, MINIMUM_FUNCTION, SUM_FUNCTION, STANDARD_DEVIATION_FUNCTION, VARIANCE_FUNCTION}; // ******************* Static Methods ************** public static XMLDescriptor buildDescriptor() { XMLDescriptor descriptor = new XMLDescriptor(); descriptor.setJavaClass(MWReportAttributeItem.class); descriptor.getInheritancePolicy().setParentClass(MWAttributeItem.class); descriptor.addDirectMapping("name", "item-name/text()"); AbstractDirectMapping functionMapping = (AbstractDirectMapping) descriptor.addDirectMapping("function", "function/text()"); ObjectTypeConverter converter = new ObjectTypeConverter(functionMapping); converter.addConversionValue(AVERAGE_FUNCTION, AVERAGE_FUNCTION); converter.addConversionValue(COUNT_FUNCTION, COUNT_FUNCTION); converter.addConversionValue(DISTINCT_FUNCTION, DISTINCT_FUNCTION); converter.addConversionValue(MAXIMUM_FUNCTION, MAXIMUM_FUNCTION); converter.addConversionValue(MINIMUM_FUNCTION, MINIMUM_FUNCTION); converter.addConversionValue(STANDARD_DEVIATION_FUNCTION, STANDARD_DEVIATION_FUNCTION); converter.addConversionValue(VARIANCE_FUNCTION, VARIANCE_FUNCTION); converter.addConversionValue(SUM_FUNCTION, SUM_FUNCTION); functionMapping.setConverter(converter); functionMapping.setNullValue(NO_FUNCTION); return descriptor; } // ****************** Constructors ************ /** Default constructor - for TopLink use only*/ private MWReportAttributeItem() { super(); } MWReportAttributeItem(MWQuery parent, String itemName, MWQueryable queryable) { super(parent, queryable); this.name = itemName; } MWReportAttributeItem(MWQuery parent, String itemName, Iterator queryables) { super(parent, queryables); this.name = itemName; } MWReportAttributeItem(MWQuery parent, String itemName, Iterator queryables, Iterator allowsNull) { super(parent, queryables, allowsNull); this.name = itemName; } /** Initialize persistent state*/ protected void initialize(Node parentNode) { super.initialize(parentNode); this.function = NO_FUNCTION; } // ****************** Accessors ************ public String getName() { return this.name; } public void setName(String name) { Object old = this.name; this.name = name; firePropertyChanged(NAME_PROPERTY, old, this.name); } public String getFunction() { return this.function; } public void setFunction(String function) { String old = this.function; this.function = function; firePropertyChanged(FUNCTION_PROPERTY, old, this.function); } // ****************** MWQueryItem implementation ************ public void removeSelfFromParent() { ((MWReportQuery) getParentQuery()).removeAttributeItem(this); } // ****************** Problem Handling************ public void addQueryableNullProblemTo(List currentProblems) { if (getFunction() != COUNT_FUNCTION) { currentProblems.add(queryableNullProblem()); } } public Problem queryableNullProblem() { return buildProblem( ProblemConstants.QUERYABLE_NULL_FOR_REPORT_ITEM, getParentQuery().signature(), getName()); } public Problem queryableInvalidProblem(MWQueryable queryable) { return buildProblem(ProblemConstants.QUERYABLE_NOT_VALID_FOR_REPORT_QUERY_ATTRIBUTE, getName(), getParentQuery().signature()); } public boolean isQueryableValid(MWQueryable queryable) { return queryable.isValidForReportQueryAttribute(); } // ****************** Runtime Conversion ************ protected void adjustRuntimeQuery(ObjectLevelReadQuery readQuery) { ReportQuery reportQuery = (ReportQuery) readQuery; Expression expression = getQueryableArgument().runtimeExpression(reportQuery.getExpressionBuilder()); if (getFunction() == NO_FUNCTION) { reportQuery.addItem(getName(), expression); } else if (getFunction() == AVERAGE_FUNCTION) { reportQuery.addAverage(getName(), expression); } else if (getFunction() == COUNT_FUNCTION) { if (getName() != null) { reportQuery.addCount(getName(), expression); } else { reportQuery.addCount(); } } else if (getFunction() == DISTINCT_FUNCTION) { reportQuery.addItem(getName(), expression.distinct()); } else if (getFunction() == MAXIMUM_FUNCTION) { reportQuery.addMaximum(getName(), expression); } else if (getFunction() == MINIMUM_FUNCTION) { reportQuery.addMinimum(getName(), expression); } else if (getFunction() == STANDARD_DEVIATION_FUNCTION) { reportQuery.addStandardDeviation(getName(), expression); } else if (getFunction() == SUM_FUNCTION) { reportQuery.addSum(getName(), expression); } else if (getFunction() == VARIANCE_FUNCTION) { reportQuery.addVariance(getName(), expression); } else { reportQuery.addItem(getName(), expression.getFunction(getFunction())); } } public String displayString() { if (getQueryableArgument().getQueryableArgumentElement().getQueryable() == null && getFunction() == COUNT_FUNCTION) { return getFunction(); } return getName() + "->" + super.displayString() + " (" + getFunction() + ")"; } }