Skip to content

Commit

Permalink
HQL-based query interpreter passes repo-sql-impl-test. (No new featur…
Browse files Browse the repository at this point in the history
…es yet, however.)
  • Loading branch information
mederly committed Nov 22, 2015
1 parent 379e680 commit 9dfb7ac
Show file tree
Hide file tree
Showing 39 changed files with 2,541 additions and 379 deletions.
Expand Up @@ -33,6 +33,8 @@ public class ObjectQuery implements DebugDumpable, Serializable {
private ObjectPaging paging;
private boolean allowPartialResults = false;

private boolean useNewQueryInterpreter = true;

public ObjectFilter getFilter() {
return filter;
}
Expand All @@ -57,6 +59,14 @@ public void setAllowPartialResults(boolean allowPartialResults) {
this.allowPartialResults = allowPartialResults;
}

public boolean isUseNewQueryInterpreter() {
return useNewQueryInterpreter;
}

public void setUseNewQueryInterpreter(boolean useNewQueryInterpreter) {
this.useNewQueryInterpreter = useNewQueryInterpreter;
}

public static ObjectQuery createObjectQuery(ObjectFilter filter) {
ObjectQuery query = new ObjectQuery();
query.setFilter(filter);
Expand Down Expand Up @@ -106,6 +116,7 @@ public ObjectQuery cloneEmpty() {
if (this.allowPartialResults) {
clone.allowPartialResults = true;
}
clone.useNewQueryInterpreter = this.useNewQueryInterpreter;
return clone;
}

Expand Down
Expand Up @@ -40,6 +40,7 @@
import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.dialect.H2Dialect;
Expand Down Expand Up @@ -196,6 +197,10 @@ protected <T extends ObjectType> String getInterpretedQuery(Session session, Cla
return HibernateToSqlTranslator.toSql(factory, ((RQueryImpl) rQuery).getQuery().getQueryString());
}

protected String hqlToSql(String hql) {
return HibernateToSqlTranslator.toSql(factory, hql);
}

protected <T extends ObjectType> String getInterpretedQuery(Session session, Class<T> type, File file) throws
Exception {
return getInterpretedQuery(session, type, file, false);
Expand Down

Large diffs are not rendered by default.

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>

<!--
~ Copyright (c) 2010-2015 Evolveum
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<query xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://prism.evolveum.com/xml/ns/public/query-3">
<filter>
<and>
<equal>
<path xmlns="">c:attributes/a1</path>
<value xsi:type="xsd:string">abcdef</value>
</equal>
<equal>
<path xmlns:m="http://example.com/xml/ns/mySchema">c:extension/m:shoeSize</path>
<value xsi:type="xsd:int">42</value>
</equal>
</and>
</filter>
</query>
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>

<!--
~ Copyright (c) 2010-2015 Evolveum
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<query xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://prism.evolveum.com/xml/ns/public/query-3">
<filter>
<equal>
<path xmlns:s="http://midpoint.evolveum.com/blabla">c:attributes/s:foo</path>
<value xsi:type="xsd:string">uid=jbond,ou=People,dc=example,dc=com</value>
</equal>
</filter>
</query>
2 changes: 1 addition & 1 deletion repo/repo-sql-impl-test/testng-integration.xml
Expand Up @@ -26,7 +26,7 @@
</test>
<test name="Query Add Tests" parallel="false" preserve-order="true" verbose="10" enabled="true">
<classes>
<class name="com.evolveum.midpoint.repo.sql.QueryInterpreterTest"/>
<class name="com.evolveum.midpoint.repo.sql.QueryInterpreter2Test"/>
<class name="com.evolveum.midpoint.repo.sql.DeleteTest"/>
<class name="com.evolveum.midpoint.repo.sql.AddGetObjectTest"/>
<class name="com.evolveum.midpoint.repo.sql.AddOverwriteTest"/>
Expand Down
Expand Up @@ -43,6 +43,7 @@
import com.evolveum.midpoint.prism.path.NameItemPathSegment;
import com.evolveum.midpoint.repo.sql.data.common.RAccessCertificationCampaign;
import com.evolveum.midpoint.repo.sql.data.common.container.RAccessCertificationCase;
import com.evolveum.midpoint.repo.sql.query2.QueryEngine2;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SequenceType;
Expand Down Expand Up @@ -1002,8 +1003,14 @@ private <T extends ObjectType> int countObjectsAttempt(Class<T> type, ObjectQuer
SQLQuery sqlQuery = session.createSQLQuery("SELECT COUNT(*) FROM " + RUtil.getTableName(hqlType));
longCount = (Number) sqlQuery.uniqueResult();
} else {
QueryEngine engine = new QueryEngine(getConfiguration(), getPrismContext());
RQuery rQuery = engine.interpret(query, type, null, true, session);
RQuery rQuery;
if (query.isUseNewQueryInterpreter()) {
QueryEngine2 engine = new QueryEngine2(getConfiguration(), getPrismContext());
rQuery = engine.interpret(query, type, null, true, session);
} else {
QueryEngine engine = new QueryEngine(getConfiguration(), getPrismContext());
rQuery = engine.interpret(query, type, null, true, session);
}

longCount = (Number) rQuery.uniqueResult();
}
Expand Down Expand Up @@ -1146,8 +1153,15 @@ private <T extends ObjectType> SearchResultList<PrismObject<T>> searchObjectsAtt
Session session = null;
try {
session = beginReadOnlyTransaction();
QueryEngine engine = new QueryEngine(getConfiguration(), getPrismContext());
RQuery rQuery = engine.interpret(query, type, options, false, session);
RQuery rQuery;

if (query.isUseNewQueryInterpreter()) {
QueryEngine2 engine = new QueryEngine2(getConfiguration(), getPrismContext());
rQuery = engine.interpret(query, type, options, false, session);
} else {
QueryEngine engine = new QueryEngine(getConfiguration(), getPrismContext());
rQuery = engine.interpret(query, type, options, false, session);
}

List<GetObjectResult> objects = rQuery.list();
LOGGER.trace("Found {} objects, translating to JAXB.", new Object[]{(objects != null ? objects.size() : 0)});
Expand Down Expand Up @@ -2160,8 +2174,14 @@ private <T extends ObjectType> void searchObjectsIterativeAttempt(Class<T> type,
Session session = null;
try {
session = beginReadOnlyTransaction();
QueryEngine engine = new QueryEngine(getConfiguration(), getPrismContext());
RQuery rQuery = engine.interpret(query, type, options, false, session);
RQuery rQuery;
if (query.isUseNewQueryInterpreter()) {
QueryEngine engine = new QueryEngine(getConfiguration(), getPrismContext());
rQuery = engine.interpret(query, type, options, false, session);
} else {
QueryEngine2 engine = new QueryEngine2(getConfiguration(), getPrismContext());
rQuery = engine.interpret(query, type, options, false, session);
}

ScrollableResults results = rQuery.scroll(ScrollMode.FORWARD_ONLY);
try {
Expand Down
Expand Up @@ -19,29 +19,55 @@
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.repo.sql.data.common.any.*;
import com.evolveum.midpoint.repo.sql.data.common.any.RAnyConverter;
import com.evolveum.midpoint.repo.sql.data.common.any.RAnyValue;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtBoolean;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtDate;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtLong;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtPolyString;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtReference;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtString;
import com.evolveum.midpoint.repo.sql.data.common.any.ROExtValue;
import com.evolveum.midpoint.repo.sql.data.common.container.RTrigger;
import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference;
import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString;
import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType;
import com.evolveum.midpoint.repo.sql.data.common.other.RReferenceOwner;
import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType;
import com.evolveum.midpoint.repo.sql.data.factory.MetadataFactory;
import com.evolveum.midpoint.repo.sql.util.*;
import com.evolveum.midpoint.repo.sql.query.definition.QueryEntity;
import com.evolveum.midpoint.repo.sql.query.definition.VirtualAny;
import com.evolveum.midpoint.repo.sql.util.ClassMapper;
import com.evolveum.midpoint.repo.sql.util.DtoTranslationException;
import com.evolveum.midpoint.repo.sql.util.EntityState;
import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult;
import com.evolveum.midpoint.repo.sql.util.RUtil;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.hibernate.annotations.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.NamedQueries;
import org.hibernate.annotations.NamedQuery;
import org.hibernate.annotations.Where;

import javax.persistence.*;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.xml.datatype.XMLGregorianCalendar;
import java.io.Serializable;
import java.util.Collection;
Expand Down Expand Up @@ -79,6 +105,8 @@
@NamedQuery(name = "delete.campaignCase", query = "delete RAccessCertificationCase c where c.ownerOid = :oid and c.id = :id"),
@NamedQuery(name = "resolveReferences", query = "select o.oid, o.name from RObject as o where o.oid in (:oid)"),
})
@QueryEntity(anyElements = {
@VirtualAny(jaxbNameLocalPart = "extension")})
@Entity
@Table(name = "m_object", indexes = {
@Index(name = "iObjectNameOrig", columnList = "name_orig"),
Expand Down
Expand Up @@ -27,6 +27,8 @@
import com.evolveum.midpoint.repo.sql.data.common.enums.RShadowKind;
import com.evolveum.midpoint.repo.sql.data.common.enums.RSynchronizationSituation;
import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType;
import com.evolveum.midpoint.repo.sql.query.definition.QueryEntity;
import com.evolveum.midpoint.repo.sql.query.definition.VirtualAny;
import com.evolveum.midpoint.repo.sql.util.DtoTranslationException;
import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult;
import com.evolveum.midpoint.repo.sql.util.RUtil;
Expand Down Expand Up @@ -54,6 +56,8 @@
indexes = {@Index(name = "iShadowResourceRef", columnNames = "resourceRef_targetOid"),
@Index(name = "iShadowDead", columnNames = "dead")})
@ForeignKey(name = "fk_shadow")
@QueryEntity(anyElements = {
@VirtualAny(jaxbNameLocalPart = "attributes")})
public class RShadow<T extends ShadowType> extends RObject<T> implements OperationResult {

private static final Trace LOGGER = TraceManager.getTrace(RShadow.class);
Expand Down
Expand Up @@ -38,5 +38,7 @@

VirtualEntity[] entities() default {};

VirtualAny[] anyElements() default {};

VirtualReference[] references() default {};
}
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package com.evolveum.midpoint.repo.sql.query2.definition;
package com.evolveum.midpoint.repo.sql.query.definition;

import com.evolveum.midpoint.schema.SchemaConstantsGenerated;

Expand All @@ -25,10 +25,11 @@

/**
* @author lazyman
* @author mederly
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Any {
public @interface VirtualAny {

String jaxbNameNamespace() default SchemaConstantsGenerated.NS_COMMON;

Expand Down
Expand Up @@ -37,6 +37,7 @@
import com.evolveum.midpoint.prism.query.ValueFilter;
import com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration;
import com.evolveum.midpoint.repo.sql.query.QueryException;
import com.evolveum.midpoint.repo.sql.query2.definition.AnyDefinition;
import com.evolveum.midpoint.repo.sql.query2.definition.CollectionDefinition;
import com.evolveum.midpoint.repo.sql.query2.definition.Definition;
import com.evolveum.midpoint.repo.sql.query2.definition.EntityDefinition;
Expand Down Expand Up @@ -193,6 +194,8 @@ private <T extends ObjectFilter> Restriction findAndCreateRestriction(T filter,
Validate.notNull(filter);
Validate.notNull(context);

LOGGER.trace("Determining restriction for filter {}", filter);

String alias = context.getHibernateQuery().getPrimaryEntityAlias();

// the order of processing restrictions can be important, so we do the selection via handwritten code
Expand All @@ -210,12 +213,12 @@ private <T extends ObjectFilter> Restriction findAndCreateRestriction(T filter,
} else if (filter instanceof TypeFilter) {
restriction = new TypeRestriction();
} else if (filter instanceof RefFilter) {
ItemPath fullPath = new ItemPath(parent.getItemPathForChildren(), ((RefFilter) filter).getFullPath());
ItemPath fullPath = getFullPath(parent, ((RefFilter) filter).getFullPath());
EntityDefinition entityDefinition = context.findProperEntityDefinition(fullPath);
restriction = new ReferenceRestriction(entityDefinition, alias, entityDefinition);
} else if (filter instanceof ValueFilter) {
ValueFilter valFilter = (ValueFilter) filter;
ItemPath fullPath = new ItemPath(parent.getItemPathForChildren(), valFilter.getFullPath());
ItemPath fullPath = getFullPath(parent, valFilter.getFullPath());

ProperDefinitionSearchResult<PropertyDefinition> propDef = context.findProperDefinition(fullPath, PropertyDefinition.class);
if (propDef != null && propDef.getItemDefinition() != null) {
Expand All @@ -227,10 +230,9 @@ private <T extends ObjectFilter> Restriction findAndCreateRestriction(T filter,
} else {
EntityDefinition entityDefinition = context.findProperEntityDefinition(fullPath);
JpaDefinitionPath jpaDefinitionPath = entityDefinition.translatePath(fullPath);
if (fullPath.first().equivalent(new NameItemPathSegment(ObjectType.F_EXTENSION)) ||
fullPath.first().equivalent(new NameItemPathSegment(ShadowType.F_ATTRIBUTES)) ||
jpaDefinitionPath.containsAnyDefinition()) {
restriction = new AnyPropertyRestriction(entityDefinition, alias, entityDefinition);
AnyDefinition anyDefinition = jpaDefinitionPath.getAnyDefinition();
if (anyDefinition != null) {
restriction = new AnyPropertyRestriction(anyDefinition, entityDefinition, alias, entityDefinition);
} else {
throw new QueryException("Couldn't find a proper restriction for a ValueFilter: " + valFilter.debugDump());
}
Expand All @@ -246,9 +248,19 @@ private <T extends ObjectFilter> Restriction findAndCreateRestriction(T filter,
restriction.setContext(context);
restriction.setParent(parent);
restriction.setFilter(filter);

LOGGER.trace("Restriction for {} is {}", filter.getClass().getSimpleName(), restriction);
return restriction;
}

private ItemPath getFullPath(Restriction parent, ItemPath fullPath) {
if (parent == null) {
return fullPath;
} else {
return new ItemPath(parent.getItemPathForChildren(), fullPath);
}
}

private void interpretPagingAndSorting(ObjectQuery query, InterpretationContext context, boolean countingObjects) {
RootHibernateQuery hibernateQuery = context.getHibernateQuery();
String rootAlias = hibernateQuery.getPrimaryEntityAlias();
Expand Down
Expand Up @@ -20,6 +20,15 @@
import com.evolveum.midpoint.repo.sql.data.common.RObject;
import com.evolveum.midpoint.repo.sql.data.common.any.RAssignmentExtension;
import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString;
import com.evolveum.midpoint.repo.sql.query.definition.JaxbName;
import com.evolveum.midpoint.repo.sql.query.definition.JaxbType;
import com.evolveum.midpoint.repo.sql.query.definition.QueryEntity;
import com.evolveum.midpoint.repo.sql.query.definition.VirtualAny;
import com.evolveum.midpoint.repo.sql.query.definition.VirtualCollection;
import com.evolveum.midpoint.repo.sql.query2.definition.VirtualCollectionDefinition;
import com.evolveum.midpoint.repo.sql.query.definition.VirtualProperty;
import com.evolveum.midpoint.repo.sql.query2.definition.VirtualPropertyDefinition;
import com.evolveum.midpoint.repo.sql.query.definition.VirtualReference;
import com.evolveum.midpoint.repo.sql.util.ClassMapper;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
Expand Down Expand Up @@ -115,6 +124,11 @@ private void addVirtualDefinitionsForClass(EntityDefinition entityDef, Class jpa

}

for (VirtualAny any : qEntity.anyElements()) {
VirtualAnyDefinition def = new VirtualAnyDefinition(new QName(any.jaxbNameNamespace(), any.jaxbNameLocalPart()));
entityDef.addDefinition(def);
}

for (VirtualCollection collection : qEntity.collections()) {
QName jaxbName = createQName(collection.jaxbName());

Expand Down

0 comments on commit 9dfb7ac

Please sign in to comment.