📄 pathexpressionparser.java
字号:
private PropertyMapping getPropertyMapping() {
return currentPropertyMapping;
}
private void setType() throws QueryException {
if ( currentProperty == null ) {
type = getPropertyMapping().getType();
}
else {
type = getPropertyType();
}
}
protected Type getPropertyType() throws QueryException {
String propertyPath = getPropertyPath();
Type propertyType = getPropertyMapping().toType( propertyPath );
if ( propertyType == null ) {
throw new QueryException( "could not resolve property type: " + propertyPath );
}
return propertyType;
}
protected String[] currentColumns() throws QueryException {
String propertyPath = getPropertyPath();
String[] propertyColumns = getPropertyMapping().toColumns( currentName, propertyPath );
if ( propertyColumns == null ) {
throw new QueryException( "could not resolve property columns: " + propertyPath );
}
return propertyColumns;
}
private void reset(QueryTranslatorImpl q) {
//join = q.createJoinFragment(useThetaStyleJoin);
dotcount = 0;
currentName = null;
currentProperty = null;
collectionName = null;
collectionRole = null;
componentPath.setLength( 0 );
type = null;
collectionName = null;
columns = null;
expectingCollectionIndex = false;
continuation = false;
currentPropertyMapping = null;
}
public void start(QueryTranslatorImpl q) {
if ( !continuation ) {
reset( q );
path.setLength( 0 );
joinSequence = new JoinSequence( q.getFactory() ).setUseThetaStyle( useThetaStyleJoin );
}
}
public void end(QueryTranslatorImpl q) throws QueryException {
ignoreInitialJoin = false;
Type propertyType = getPropertyType();
if ( propertyType != null && propertyType.isCollectionType() ) {
collectionRole = ( ( CollectionType ) propertyType ).getRole();
collectionName = q.createNameForCollection( collectionRole );
prepareForIndex( q );
}
else {
columns = currentColumns();
setType();
}
//important!!
continuation = false;
}
private void prepareForIndex(QueryTranslatorImpl q) throws QueryException {
QueryableCollection collPersister = q.getCollectionPersister( collectionRole );
if ( !collPersister.hasIndex() ) throw new QueryException( "unindexed collection before []: " + path );
String[] indexCols = collPersister.getIndexColumnNames();
if ( indexCols.length != 1 ) throw new QueryException( "composite-index appears in []: " + path );
//String[] keyCols = collPersister.getKeyColumnNames();
JoinSequence fromJoins = new JoinSequence( q.getFactory() )
.setUseThetaStyle( useThetaStyleJoin )
.setRoot( collPersister, collectionName )
.setNext( joinSequence.copy() );
if ( !continuation ) addJoin( collectionName, collPersister.getCollectionType() );
joinSequence.addCondition( collectionName + '.' + indexCols[0] + " = " ); //TODO: get SQL rendering out of here
CollectionElement elem = new CollectionElement();
elem.elementColumns = collPersister.getElementColumnNames(collectionName);
elem.elementType = collPersister.getElementType();
elem.isOneToMany = collPersister.isOneToMany();
elem.alias = collectionName;
elem.joinSequence = joinSequence;
collectionElements.addLast( elem );
setExpectingCollectionIndex();
q.addCollection( collectionName, collectionRole );
q.addFromJoinOnly( collectionName, fromJoins );
}
static final class CollectionElement {
Type elementType;
boolean isOneToMany;
String alias;
String[] elementColumns;
JoinSequence joinSequence;
StringBuffer indexValue = new StringBuffer();
}
public CollectionElement lastCollectionElement() {
return ( CollectionElement ) collectionElements.removeLast();
}
public void setLastCollectionElementIndexValue(String value) {
( ( CollectionElement ) collectionElements.getLast() ).indexValue.append( value );
}
public boolean isExpectingCollectionIndex() {
return expectingCollectionIndex;
}
protected void setExpectingCollectionIndex() throws QueryException {
expectingCollectionIndex = true;
}
public JoinSequence getWhereJoin() {
return joinSequence;
}
public String getWhereColumn() throws QueryException {
if ( columns.length != 1 ) {
throw new QueryException( "path expression ends in a composite value: " + path );
}
return columns[0];
}
public String[] getWhereColumns() {
return columns;
}
public Type getWhereColumnType() {
return type;
}
public String getName() {
return currentName == null ? collectionName : currentName;
}
public String getCollectionSubquery(Map enabledFilters) throws QueryException {
return CollectionSubqueryFactory.createCollectionSubquery( joinSequence, enabledFilters, currentColumns() );
}
public boolean isCollectionValued() throws QueryException {
//TODO: is there a better way?
return collectionName != null && !getPropertyType().isCollectionType();
}
public void addAssociation(QueryTranslatorImpl q) throws QueryException {
q.addJoin( getName(), joinSequence );
}
public String addFromAssociation(QueryTranslatorImpl q) throws QueryException {
if ( isCollectionValued() ) {
return addFromCollection( q );
}
else {
q.addFrom( currentName, joinSequence );
return currentName;
}
}
public String addFromCollection(QueryTranslatorImpl q) throws QueryException {
Type collectionElementType = getPropertyType();
if ( collectionElementType == null ) {
throw new QueryException( "must specify 'elements' for collection valued property in from clause: " + path );
}
if ( collectionElementType.isEntityType() ) {
// an association
QueryableCollection collectionPersister = q.getCollectionPersister( collectionRole );
Queryable entityPersister = ( Queryable ) collectionPersister.getElementPersister();
String clazz = entityPersister.getEntityName();
final String elementName;
if ( collectionPersister.isOneToMany() ) {
elementName = collectionName;
//allow index() function:
q.decoratePropertyMapping( elementName, collectionPersister );
}
else { //many-to-many
q.addCollection( collectionName, collectionRole );
elementName = q.createNameFor( clazz );
addJoin( elementName, ( AssociationType ) collectionElementType );
}
q.addFrom( elementName, clazz, joinSequence );
currentPropertyMapping = new CollectionPropertyMapping( collectionPersister );
return elementName;
}
else {
// collections of values
q.addFromCollection( collectionName, collectionRole, joinSequence );
return collectionName;
}
}
String getCollectionName() {
return collectionName;
}
String getCollectionRole() {
return collectionRole;
}
String getCollectionOwnerName() {
return collectionOwnerName;
}
String getOneToOneOwnerName() {
return oneToOneOwnerName;
}
AssociationType getOwnerAssociationType() {
return ownerAssociationType;
}
String getCurrentProperty() {
return currentProperty;
}
String getCurrentName() {
return currentName;
}
public void fetch(QueryTranslatorImpl q, String entityName) throws QueryException {
if ( isCollectionValued() ) {
q.setCollectionToFetch( getCollectionRole(), getCollectionName(), getCollectionOwnerName(), entityName );
}
else {
q.addEntityToFetch( entityName, getOneToOneOwnerName(), getOwnerAssociationType() );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -