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

dev.dsf.fhir.search.parameters.basic.AbstractUrlAndVersionParameter Maven / Gradle / Ivy

package dev.dsf.fhir.search.parameters.basic;

import java.sql.Array;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Objects;

import org.hl7.fhir.r4.model.MetadataResource;

import dev.dsf.fhir.function.BiFunctionWithSqlException;

public abstract class AbstractUrlAndVersionParameter
		extends AbstractCanonicalUrlParameter
{
	public static final String PARAMETER_NAME = "url";

	private final String resourceColumn;

	public AbstractUrlAndVersionParameter(Class resourceType, String resourceColumn)
	{
		super(resourceType, PARAMETER_NAME);

		this.resourceColumn = resourceColumn;
	}

	@Override
	public String getFilterQuery()
	{
		String versionSubQuery = hasVersion() ? " AND " + resourceColumn + "->>'version' = ?" : "";

		return switch (valueAndType.type)
		{
			case PRECISE -> resourceColumn + "->>'url' = ?" + versionSubQuery;
			case BELOW -> resourceColumn + "->>'url' LIKE ?" + versionSubQuery;
		};
	}

	@Override
	public int getSqlParameterCount()
	{
		return hasVersion() ? 2 : 1;
	}

	@Override
	public void modifyStatement(int parameterIndex, int subqueryParameterIndex, PreparedStatement statement,
			BiFunctionWithSqlException arrayCreator) throws SQLException
	{
		if (subqueryParameterIndex == 1)
		{
			switch (valueAndType.type)
			{
				case PRECISE:
					statement.setString(parameterIndex, valueAndType.url);
					return;

				case BELOW:
					statement.setString(parameterIndex, valueAndType.url + "%");
					return;
			}
		}
		else if (subqueryParameterIndex == 2)
			statement.setString(parameterIndex, valueAndType.version);
	}

	@Override
	protected boolean resourceMatches(R resource)
	{
		return switch (valueAndType.type)
		{
			case PRECISE -> resource.hasUrl() && Objects.equals(resource.getUrl(), valueAndType.url)
					&& (valueAndType.version == null
							|| (resource.hasVersion() && Objects.equals(resource.getVersion(), valueAndType.version)));

			case BELOW ->
				resource.hasUrl() && resource.getUrl().startsWith(valueAndType.url) && (valueAndType.version == null
						|| (resource.hasVersion() && Objects.equals(resource.getVersion(), valueAndType.version)));
		};
	}

	@Override
	protected String getSortSql(String sortDirectionWithSpacePrefix)
	{
		return resourceColumn + "->>'url'" + sortDirectionWithSpacePrefix;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy