From: <one...@us...> - 2002-11-05 15:24:40
|
Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/impl In directory usw-pr-cvs1:/tmp/cvs-serv4736/hibernate/impl Modified Files: SessionFactoryImpl.java SessionImpl.java Log Message: queries against mapped classes now pick up *all* subclasses, wether mapped as subclasses or not fixed a bug when the same classname appeared twice in a query Index: SessionFactoryImpl.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/impl/SessionFactoryImpl.java,v retrieving revision 1.56 retrieving revision 1.57 diff -C2 -d -r1.56 -r1.57 *** SessionFactoryImpl.java 30 Oct 2002 15:28:04 -0000 1.56 --- SessionFactoryImpl.java 5 Nov 2002 15:24:35 -0000 1.57 *************** *** 589,601 **** public String[] getImplementors(Class clazz) { ! if ( classPersisters.containsKey(clazz) ) return null; ArrayList results = new ArrayList(); ! Iterator iter = classPersisters.keySet().iterator(); while ( iter.hasNext() ) { ! Object o = iter.next(); ! if ( o instanceof String ) continue; ! Class persistent = (Class) o; ! if ( clazz.isAssignableFrom(persistent) ) { ! results.add( persistent.getName() ); } } --- 589,606 ---- public String[] getImplementors(Class clazz) { ! //if ( classPersisters.containsKey(clazz) ) return null; ArrayList results = new ArrayList(); ! Iterator iter = classPersisters.values().iterator(); while ( iter.hasNext() ) { ! ClassPersister p = (ClassPersister) iter.next(); ! if ( ! (p instanceof Queryable) && ( ! clazz.equals( p.getMappedClass() ) || ( ! ( ! ( (Queryable) p ).isInherited() ) && ! clazz.isAssignableFrom( p.getMappedClass() ) ! ) ! ) ! ) { ! results.add( p.getClassName() ); } } Index: SessionImpl.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/impl/SessionImpl.java,v retrieving revision 1.147 retrieving revision 1.148 diff -C2 -d -r1.147 -r1.148 *** SessionImpl.java 5 Nov 2002 11:48:07 -0000 1.147 --- SessionImpl.java 5 Nov 2002 15:24:35 -0000 1.148 *************** *** 1057,1063 **** QueryTranslator[] q = getQueries(query, false); ! if (q.length==0) return Collections.EMPTY_LIST; ! ! List result = null; dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called --- 1057,1061 ---- QueryTranslator[] q = getQueries(query, false); ! List results = Collections.EMPTY_LIST; dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called *************** *** 1067,1078 **** for ( int i=0; i<q.length; i++ ) { ! List currentResult = q[i].find(this, values, types, true, selection, namedParams); ! if (result==null) { ! result = currentResult; ! } ! else { ! result.addAll(currentResult); ! } ! } } --- 1065,1071 ---- for ( int i=0; i<q.length; i++ ) { ! List currentResults = q[i].find(this, values, types, true, selection, namedParams); ! currentResults.addAll(results); ! results = currentResults; } } *************** *** 1080,1084 **** dontFlushFromFind--; } ! return result; } --- 1073,1077 ---- dontFlushFromFind--; } ! return results; } *************** *** 1123,1126 **** --- 1116,1121 ---- QueryTranslator[] q = getQueries(query, true); + if (q.length==0) return Collections.EMPTY_LIST.iterator(); + Iterator result = null; Iterator[] results = null; *************** *** 1147,1152 **** if (values.length!=0) log.trace( "parameters: " + StringHelper.toString(values) ); } ! ! QueryTranslator q = factory.getScalarQuery(query); autoFlushIfRequired( q.getQuerySpaces() ); return q.scroll(values, types, selection, namedParams, this); --- 1142,1149 ---- if (values.length!=0) log.trace( "parameters: " + StringHelper.toString(values) ); } ! String[] concreteQueries = QueryTranslator.concreteQueries(query, factory); ! if ( concreteQueries.length>1 ) throw new HibernateException("This query cannot be scrolled: " + query); ! if ( concreteQueries.length==0 ) return null; //TODO: fix this and return an empty ScrollableResults ! QueryTranslator q = factory.getScalarQuery( concreteQueries[0] ); autoFlushIfRequired( q.getQuerySpaces() ); return q.scroll(values, types, selection, namedParams, this); *************** *** 1168,1174 **** } ! QueryTranslator q = factory.getQuery(query); ! autoFlushIfRequired( q.getQuerySpaces() ); ! return q.findIdentifiers(values, types, this); } --- 1165,1182 ---- } ! QueryTranslator[] q = getQueries(query, false); ! ! List result = Collections.EMPTY_LIST; ! ! //execute the queries and return all result lists as a single list ! ! for ( int i=0; i<q.length; i++ ) { ! ! List currentResult = q[i].findIdentifiers(values, types, this); ! currentResult.addAll(result); ! result = currentResult; ! } ! ! return result; } *************** *** 1989,1993 **** for (int i=0; i<fields.length; i++) { Object result = wrap( fields[i], types[i] ); ! if ( result!=fields[i] ) { // && result!=null <---- what was that for?? fields[i] = result; substitute = true; --- 1997,2001 ---- for (int i=0; i<fields.length; i++) { Object result = wrap( fields[i], types[i] ); ! if ( result!=fields[i] ) { fields[i] = result; substitute = true; *************** *** 2543,2556 **** public List filter(Object collection, String filter, Object[] values, Type[] types, QueryImpl.RowSelection selection, Map namedParams) throws SQLException, HibernateException { ! FilterTranslator q = getFilterTranslator(collection, filter, values, types, selection, namedParams, false); dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called ! try { ! return q.find(this, values, types, true, selection, namedParams); } finally { dontFlushFromFind--; } } --- 2551,2575 ---- public List filter(Object collection, String filter, Object[] values, Type[] types, QueryImpl.RowSelection selection, Map namedParams) throws SQLException, HibernateException { ! String[] concreteFilters = QueryTranslator.concreteQueries(filter, factory); ! FilterTranslator[] filters = new FilterTranslator[ concreteFilters.length ]; ! ! for ( int i=0; i<concreteFilters.length; i++ ) { ! filters[i] = getFilterTranslator(collection, concreteFilters[i], values, types, selection, namedParams, false); ! } dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called ! ! List results = Collections.EMPTY_LIST; try { ! for ( int i=0; i<concreteFilters.length; i++ ) { ! List currentResults = filters[i].find(this, values, types, true, selection, namedParams); ! currentResults.addAll(results); ! results = currentResults; ! } } finally { dontFlushFromFind--; } + return results; } *************** *** 2558,2571 **** public Iterator iterateFilter(Object collection, String filter, Object[] values, Type[] types, QueryImpl.RowSelection selection, Map namedParams) throws SQLException, HibernateException { ! FilterTranslator q = getFilterTranslator(collection, filter, values, types, selection, namedParams, true); ! ! dontFlushFromFind++; //stops flush being called multiple times if this method is recursively called ! ! try { ! return q.iterate(values, types, selection, namedParams, this); } ! finally { ! dontFlushFromFind--; } } --- 2577,2605 ---- public Iterator iterateFilter(Object collection, String filter, Object[] values, Type[] types, QueryImpl.RowSelection selection, Map namedParams) throws SQLException, HibernateException { ! String[] concreteFilters = QueryTranslator.concreteQueries(filter, factory); ! FilterTranslator[] filters = new FilterTranslator[ concreteFilters.length ]; ! ! for ( int i=0; i<concreteFilters.length; i++ ) { ! filters[i] = getFilterTranslator(collection, concreteFilters[i], values, types, selection, namedParams, true); } ! ! if (filters.length==0) return Collections.EMPTY_LIST.iterator(); ! ! Iterator result = null; ! Iterator[] results = null; ! boolean many = filters.length>1; ! if (many) results = new Iterator[filters.length]; ! ! //execute the queries and return all results as a single iterator ! for ( int i=0; i<filters.length; i++ ) { ! ! result = filters[i].iterate(values, types, selection, namedParams, this); ! if ( many ) { ! results[i] = result; ! } ! } + + return many ? new JoinedIterator(results) : result; } |