/* * Copyright (c) 2006-2011 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit.emulation.hibernate3.ast.fromClause; import java.util.*; import mockit.emulation.hibernate3.ast.*; final class FromClassOrOuterQueryPath { final boolean isFQName; final String entityClassName; final String alias; final List<Object> result; FromJoin join; FromClassOrOuterQueryPath(String path, String alias) { isFQName = path.contains("."); entityClassName = path; this.alias = alias; result = new ArrayList<Object>(); } static FromClassOrOuterQueryPath parse(Tokens tokens) { if (tokens.hasNext()) { PathAndAlias path = new PathAndAlias(tokens); return new FromClassOrOuterQueryPath(path.path, path.alias); } throw new QuerySyntaxException(tokens); } int depth() { return 1 + (join == null ? 0 : join.depth()); } int tupleCount() { if (join == null) { return result.size(); } else { int count = 0; for (Object entity : result) { count += join.tupleCount(entity); } return count; } } void matches(Collection<?> entities) { for (Object entity : entities) { Class<?> entityClass = entity.getClass(); String className = isFQName ? entityClass.getName() : entityClass.getSimpleName(); if (className.equals(entityClassName) && (join == null || join.matches(entity, alias))) { result.add(entity); } } } public int columnIndex(String alias) { if (this.alias.equals(alias)) { return 0; } else if (join != null) { return join.columnIndex(alias); } else { return -1; } } void getAliases(Map<String, Object> aliasToValue) { aliasToValue.put(alias, null); FromJoin join = this.join; while (join != null) { aliasToValue.put(join.pathAndAlias.alias, null); join = join.nextJoin; } } }