📄 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 + -