All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.query.procedure.internal.ProcedureParameterMetadata Maven / Gradle / Ivy

There is a newer version: 7.0.0.Alpha1
Show newest version
/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or .
 */
package org.hibernate.query.procedure.internal;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.Parameter;

import org.hibernate.QueryParameterException;
import org.hibernate.query.ParameterMetadata;
import org.hibernate.query.QueryParameter;
import org.hibernate.query.procedure.ProcedureParameter;
import org.hibernate.query.procedure.spi.ProcedureParameterImplementor;

/**
 * @author Steve Ebersole
 */
public class ProcedureParameterMetadata implements ParameterMetadata {
	private List parameters;

	private boolean hasNamed;
	private int ordinalParamCount;

	public ProcedureParameterMetadata() {
		parameters = new ArrayList<>(  );
	}

	public void registerParameter(ProcedureParameterImplementor parameter) {
		if ( parameters == null ) {
			parameters = new ArrayList<>();
		}
		parameters.add( parameter );

		this.hasNamed = hasNamed || parameter.getName() != null;
		if ( parameter.getPosition() != null ) {
			ordinalParamCount++;
		}
	}

	@Override
	public boolean hasNamedParameters() {
		return hasNamed;
	}

	@Override
	public boolean hasPositionalParameters() {
		return ordinalParamCount > 0;
	}

	@Override
	public Set> collectAllParameters() {
		final Set> rtn = new HashSet<>();
		for ( ProcedureParameter parameter : parameters ) {
			rtn.add( parameter );
		}
		return rtn;
	}

	@Override
	public Set> collectAllParametersJpa() {
		final Set> rtn = new HashSet<>();
		for ( ProcedureParameter parameter : parameters ) {
			rtn.add( parameter );
		}
		return rtn;
	}

	@Override
	public Set getNamedParameterNames() {
		if ( !hasNamed ) {
			return Collections.emptySet();
		}

		final Set rtn = new HashSet<>();
		for ( ProcedureParameter parameter : parameters ) {
			if ( parameter.getName() != null ) {
				rtn.add( parameter.getName() );
			}
		}
		return rtn;
	}

	@Override
	public int getPositionalParameterCount() {
		return ordinalParamCount;
	}

	@Override
	@SuppressWarnings("unchecked")
	public  QueryParameter getQueryParameter(String name) {
		assert name != null;
		QueryParameter result = null;
		if ( hasNamed ) {
			for ( ProcedureParameter parameter : parameters ) {
				if ( name.equals( parameter.getName() ) ) {
					result = parameter;
					break;
				}
			}
		}
		if ( result != null ) {
			return result;
		}
		throw new QueryParameterException( "could not locate named parameter [" + name + "]" );
	}

	@Override
	@SuppressWarnings("unchecked")
	public  QueryParameter getQueryParameter(Integer position) {
		assert position != null;

		if ( ordinalParamCount > 0 ) {
			for ( ProcedureParameter parameter : parameters ) {
				if ( parameter.getPosition() != null && position.intValue() == parameter.getPosition() ) {
					return parameter;
				}
			}
		}
		throw new QueryParameterException( "could not locate parameter at position [" + position + "]" );
	}

	@Override
	@SuppressWarnings("unchecked")
	public  QueryParameter resolve(Parameter param) {
		// first see if that instance exists here...
		for ( ProcedureParameter parameter : parameters ) {
			if ( parameter == param ) {
				return parameter;
			}
		}

		// otherwise, try name/position from the incoming param
		if ( param.getPosition() != null || param.getName() != null ) {
			for ( ProcedureParameter parameter : parameters ) {
				// name
				if ( param.getName() != null && param.getName().equals( parameter.getName() ) ) {
					return parameter;
				}

				// position
				if ( param.getPosition() != null && param.getPosition().equals( parameter.getPosition() ) ) {
					return parameter;
				}
			}
		}

		return null;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy