org.eclipse.persistence.internal.expressions.TableAliasLookup Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of eclipselink Show documentation
Show all versions of eclipselink Show documentation
EclipseLink build based upon Git transaction f2b9fc5
/*
* Copyright (c) 1998, 2020 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 v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.internal.expressions;
import java.io.*;
import java.util.Map;
import org.eclipse.persistence.internal.helper.*;
/**
* INTERNAL:
* Represents the aliased tables an ObjectExpression will be translated to,
* along with any of its derived TableExpressions.
* For bug 2778339 / CR 2456, this Lookup also represents identity. Two
* expressions with the same Lookup will be translated to the same table(s).
*/
public class TableAliasLookup implements Serializable {// CR#3718, implements Serializable
protected DatabaseTable[] keys;
protected DatabaseTable[] values;
protected int lastUsed;
/* Have these aliases already been added to a FROM clause? */
protected boolean haveBeenAddedToStatement;
/**
* TableAliasLookup constructor comment.
*/
public TableAliasLookup() {
super();
keys = new DatabaseTable[5];
values = new DatabaseTable[5];
lastUsed = 0;
}
/**
* TableAliasLookup constructor comment.
*/
public TableAliasLookup(int initialSize) {
super();
keys = new DatabaseTable[initialSize];
values = new DatabaseTable[initialSize];
lastUsed = 0;
}
// Add all of our values to the map
public void addToMap(Map map) {
for (int i = 0; i < lastUsed; i++) {
map.put(keys[i], values[i]);
}
}
public DatabaseTable get(DatabaseTable key) {
int index = lookupIndexOf(key);
if (index == -1) {
return null;
}
return values[index];
}
private void grow() {
DatabaseTable[] newKeys = new DatabaseTable[(lastUsed * 2)];
DatabaseTable[] newValues = new DatabaseTable[(lastUsed * 2)];
for (int i = 0; i < lastUsed; i++) {
newKeys[i] = keys[i];
newValues[i] = values[i];
}
keys = newKeys;
values = newValues;
}
/**
* INTERNAL:
* Answers if the aliases have already been added to a statement.
* This insures that a subselect will not re-add aliases already
* in a parent FROM clause.
* For CR#4223
*/
public boolean haveBeenAddedToStatement() {
return haveBeenAddedToStatement;
}
/**
* isEmpty method comment.
*/
public boolean isEmpty() {
return keys[0] == null;
}
public DatabaseTable keyAtValue(DatabaseTable value) {
int index = lookupValueIndexOf(value);
if (index == -1) {
return null;
}
return keys[index];
}
public DatabaseTable[] keys() {
return keys;
}
private int lookupIndexOf(DatabaseTable table) {
for (int i = 0; i < lastUsed; i++) {
if (keys[i].equals(table)) {
return i;
}
}
return -1;
}
private int lookupValueIndexOf(DatabaseTable table) {
for (int i = 0; i < lastUsed; i++) {
if (values[i].equals(table)) {
return i;
}
}
return -1;
}
/**
* put method comment.
*/
public DatabaseTable put(DatabaseTable key, DatabaseTable value) {
int index = lookupIndexOf(key);
if (index == -1) {
keys[lastUsed] = key;
values[lastUsed++] = value;
if (lastUsed >= keys.length) {
grow();
}
} else {
values[index] = value;
}
return value;
}
/**
* INTERNAL:
* Called when aliases are added to a statement.
* This insures that a subselect will not re-add aliases already
* in a parent FROM clause.
* For CR#4223
*/
public void setHaveBeenAddedToStatement(boolean value) {
haveBeenAddedToStatement = value;
}
/**
* size method comment.
*/
public int size() {
return lastUsed;
}
@Override
public String toString() {
int max = size() - 1;
StringBuilder buf = new StringBuilder();
buf.append("{");
for (int i = 0; i <= max; i++) {
String s1 = keys[i].toString();
String s2 = values[i].toString();
buf.append(s1 + "=" + s2);
if (i < max) {
buf.append(", ");
}
}
buf.append("}");
return buf.toString();
}
public DatabaseTable[] values() {
return values;
}
}