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

org.revenj.patterns.OlapCubeQuery Maven / Gradle / Ivy

The newest version!
package org.revenj.patterns;

import java.util.*;

public interface OlapCubeQuery {
	Set getDimensions();

	Set getFacts();

	List> analyze(
			List dimensions,
			List facts,
			Collection> order,
			Specification filter,
			Integer limit,
			Integer offset);

	default List> analyze(
			List dimensions,
			List facts,
			Specification filter) {
		return analyze(dimensions, facts, null, filter, null, null);
	}

	default List> analyze(
			List dimensions,
			List facts) {
		return analyze(dimensions, facts, null, null, null, null);
	}

	default OlapCubeQueryBuilder builder() {
		return new OlapCubeQueryBuilder<>(this);
	}

	class OlapCubeQueryBuilder {

		private final OlapCubeQuery query;
		private final List dimensions = new ArrayList<>();
		private final List facts = new ArrayList<>();
		private Integer resultLimit;
		private Integer resultOfset;
		private final Map order = new LinkedHashMap<>();

		OlapCubeQueryBuilder(OlapCubeQuery query) {
			this.query = query;
		}

		public OlapCubeQueryBuilder use(String dimensionOrFact) {
			if (query.getDimensions().contains(dimensionOrFact)) {
				dimensions.add(dimensionOrFact);
			} else if (query.getFacts().contains(dimensionOrFact)) {
				facts.add(dimensionOrFact);
			} else {
				throw new IllegalArgumentException("Unknown dimension or fact: " + dimensionOrFact +
						". Use getDimensions or getFacts method for available dimensions and facts");
			}
			return this;
		}

		public OlapCubeQueryBuilder ascending(String result) {
			return orderBy(result, true);
		}

		public OlapCubeQueryBuilder descending(String result) {
			return orderBy(result, false);
		}

		private OlapCubeQueryBuilder orderBy(String result, boolean ascending) {
			if(!query.getDimensions().contains(result) && !query.getFacts().contains(result)) {
				throw new IllegalArgumentException("Unknown result: " + result
						+ ". Result can be only field from used dimensions and facts.");
			}
			order.put(result, ascending);
			return this;
		}

		public OlapCubeQueryBuilder take(int limit) {
			return limit(limit);
		}

		public OlapCubeQueryBuilder limit(int limit) {
			if (limit < 1) {
				throw new IllegalArgumentException("Invalid limit value. Limit must be positive");
			}
			resultLimit = limit;
			return this;
		}

		public OlapCubeQueryBuilder skip(int offset) {
			return offset(offset);
		}

		public OlapCubeQueryBuilder offset(int offset) {
			if (offset < 1) {
				throw new IllegalArgumentException("Invalid offset value. Offset must be positive");
			}
			resultOfset = offset;
			return this;
		}

		public List> analyze() {
			return query.analyze(
					dimensions,
					facts,
					order.entrySet(),
					null,
					resultLimit,
					resultOfset
			);
		}

		public List> analyze(Specification specification) {
			return query.analyze(
					dimensions,
					facts,
					order.entrySet(),
					specification,
					resultLimit,
					resultOfset
			);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy