/*
* RHQ Management Platform
* Copyright (C) 2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.server.search.translation.jpql;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import org.rhq.core.domain.search.SearchSubsystem;
import org.rhq.enterprise.server.search.translation.SearchTranslator;
/**
* A construct used by {@link SearchTranslator}s which helps to classify the type of condition that should be generated
* as part of the larger JPQL statement generated during translation. As each {@link SearchTranslator} is passed the
* various bits that were parsed out of the user's search expression, it has the responsibility to return a valid JPQL
* fragment
*
* @author Joseph Marques
* @see Type
*/
public class SearchFragment {
/**
* This indicates the representative form of the JPQL fragment.
*/
public enum Type {
/**
* A full where-clause fragment that can be included in a larger JPQL statement. This should be used in cases
* where the target can be found using (arbitrarily long) path expressions (by traversing over {@link OneToOne}
* or {@link ManyToOne} mappings, e.g. "alertDefinition.resource.resourceType.category = 'PLATFORM'", which
* might be useful to support filtering resources that have any alerts on platforms. Granted, the path
* expression is rarely ever that long, but it shows what's possible for this type's corresponding JPQL fragment.
*/
WHERE_CLAUSE,
/**
* More complicated filters can sometimes not restrict data by using path expressions because they need to
* navigate across {@link OneToMany} or {@link ManyToMany} mappings. In this case, since the fragment is
* intended to be used in a larger JPQL statement, a sub-query must be employed which will allow the use of
* joins (to navigate those more complex entity mappings). These sub-queries must always return a list of
* primary keys for the type of entity represented by the {@link SearchSubsystem} for the corresponding
* {@link SearchTranslator} in question.
*/
PRIMARY_KEY_SUBQUERY;
}
private final Type type;
private final String jpqlFragment;
public SearchFragment(Type type, String jpqlFragment) {
this.type = type;
this.jpqlFragment = jpqlFragment;
}
public Type getType() {
return type;
}
public String getJPQLFragment() {
return jpqlFragment;
}
}