Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Difference between revisions of "EclipseLink/Development/AdditionalCriteria"

(Additional Criteria Requirements and Design)
(Metadata)
Line 39: Line 39:
 
The following new element will be added to <entity> and <mapped-superclass> complex elements to facilitate the additional criteria support.
 
The following new element will be added to <entity> and <mapped-superclass> complex elements to facilitate the additional criteria support.
  
<code>
+
<xsd:element name="additional-criteria" type="orm:additional-criteria" maxOccurs="unbounded"/>
  <xsd:choice>
+
    <xsd:element name="additional-criteria" type="orm:additional-criteria" maxOccurs="unbounded"/>
+
    <xsd:element name="additional-criteria-callback-method" type="orm:additional-criteria-callback-method" maxOccurs="unbounded"/>
+
  </xsd:choice>
+
</code>
+
  
The additional-criteria will be applied to all queries. Users can then further configure those queries using additional criteria callback method(s), say to append login credentials to the query.
+
The additional-criteria will be applied to all queries.
  
 
=== Additional Criteria ===
 
=== Additional Criteria ===
Line 64: Line 59:
 
       *  
 
       *  
 
       * Additional criteria can be specified as a single item or as multiples using
 
       * Additional criteria can be specified as a single item or as multiples using
       * the plural AdditionalCriterias annotation. Additional criteria(s) can not be
+
       * the plural AdditionalCriterias annotation.
      * specified in conjunction with an additional criteria callback.  
+
       *
       *  
+
 
       * @author Guy Pelletier
 
       * @author Guy Pelletier
 
       * @since EclipseLink 2.2
 
       * @since EclipseLink 2.2
Line 113: Line 107:
 
   </additional-criteria>
 
   </additional-criteria>
 
</pre>
 
</pre>
 
=== Additional Criteria Callback - through existing EntityListener ===
 
 
The users will be able to control how the additionalJoinExpression is expressed through an EntityListener. We will allow them to decorate the entity listener with a new callback annotation (AdditionalCallbackMethod) to specify those methods that should be used to generate additional join expressions.
 
 
Using a callback class, users can further control which additional criteria is used for individual query classes. See the AdditionalCriteriaCallbackMethod below.
 
 
Multiple additional callback methods for the same query class will be allowed and cause each callback method to be called (although the order of invocation is not predictable)
 
 
<pre>
 
  <xsd:complexType name="entity-listener">
 
    <xsd:annotation>
 
      <xsd:documentation>
 
 
        Defines an entity listener to be invoked at lifecycle events
 
        for the entities that list this listener.
 
 
      </xsd:documentation>
 
    </xsd:annotation>
 
    <xsd:sequence>
 
      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
 
      <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/>
 
      <xsd:element name="post-persist" type="orm:post-persist"
 
                  minOccurs="0"/>
 
      <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/>
 
      <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/>
 
      <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/>
 
      <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/>
 
      <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/>
 
      <xsd:element name="additional-criteria-method" type="orm:additional-criteria-method" maxOccurs="unbounded"/>
 
    </xsd:sequence>
 
    <xsd:attribute name="class" type="xsd:string" use="required"/>
 
  </xsd:complexType>
 
</pre>
 
 
==== Additional Criteria Callback Method ====
 
 
The additional criteria callback method(s) control which methods from the callback class are used to control the additional criteria and to which queries they apply.
 
 
<pre>
 
<xsd:complexType name="additional-criteria-callback-method">
 
  <xsd:annotation>
 
    <xsd:documentation>
 
 
      /**
 
      * An additional criteria callback method(s) is specified on an additional
 
      * criteria callback class. It also defines the EclipseLink queries that should
 
      * call the method on execution.
 
      *
 
      * @author Guy Pelletier
 
      * @since EclipseLink 2.2
 
      */
 
      @Target({METHOD})
 
      @Retention(RUNTIME)
 
      public @interface AdditionalCriteriaCallbackMethod {   
 
          /**
 
          * (Optional) The list of EclipseLink query classes that will accept the
 
          * additional criteria. E.g. ReadAllQuery.class, DeleteObjectQuery.class.
 
          * By defaul the callback method is applied to all queries.
 
          *
 
          * There can be multiple AdditionalCriteriaCallbackMethod on a callback
 
          * class.
 
          */
 
          Class[] value() default {};
 
      }
 
 
 
    </xsd:documentation>
 
  </xsd:annotation>
 
  <xsd:sequence>
 
      <xsd:element name="query-class" type="xsd:string" maxOccurs="unbounded"/>
 
  </xsd:sequence>
 
  <xsd:attribute name="name" type="xsd:string" use="required"/>
 
</xsd:complexType>
 
</pre>
 
 
==== Example ====
 
 
<pre>
 
 
@EntityListener(CustomerUserCriteria.class)
 
 
public class CustomerUserCriteria {
 
  @AdditionalCriteriaCallbackMethod
 
  public void handleAll(DatabaseQuery query) {}
 
 
  @AdditionalCriteriaCallbackMethod({ReadAllQuery.class, ReadObject.class})
 
  public void handleRead(DatabaseQuery query) {}
 
 
  @AdditionalCriteriaCallbackMethod({DeleteObjectQuery.class, DeleteAllQuery.class})
 
  public void handleDelete(DatabaseQuery query) {}
 
}
 
 
<entity-listener class="CustomerUserCriteria"/>
 
 
<entity-listener class="CustomerUserCriteria">
 
  <additional-criteria-callback-method name="handleAll"/>
 
  <additional-criteria-callback-method name="handleRead">
 
    <query-class>ReadAllQuery</query-class>
 
    <query-class>ReadObjectQuery</query-class>
 
  </additional-criteria-callback-method>
 
  <additional-criteria-callback-method name="handleDelete">
 
    <query-class>org.eclipse.persistence.queries.DeleteAllQuery</query-class>
 
    <query-class>org.eclipse.persistence.queries.DeleteObjectQuery</query-class>
 
  </additional-criteria-callback-method>
 
</entity-listener>
 
</pre>
 
 
==== Notes ====
 
* The org.eclipse.persistence.queries package will be appended by default to the query-class.
 
  
 
== Enabling/Disabling additional criteria ==
 
== Enabling/Disabling additional criteria ==

Revision as of 14:43, 23 September 2010

Additional Criteria Requirements and Design

Enhancement Request: bug 322008

This work will introduce an additional criteria EclipseLink users can apply to a descriptors default queries in turn providing them with a filtering option. This filtering option will allow for the user to enable and disable the filter (or portions of it) as needed at runtime.

See the following blog from Doug discussing filters and their current usage though a descriptor customizer.

http://java-persistence.blogspot.com/2010/08/eclipselink-filters-how-to.html

A point form list of requirements are then as follows:

  • Simplify the definition and usage of EclipseLink's additional join expressions using Eclipselink metadata.
  • Allow additional criteria to be specified through the use of annotations and xml.
  • Allow users the option to enable and disable additional criteria.
  • Allow for xml mapping file merging and overridding using the eclipselink-orm.xml
  • Allow for JPQL fragments to specify the details of the additional criteria.
  • Allow for a mechanism to pass parameters to the additional criteria.
  • Easy to use and forward compatible.
  • Respect the general JPA look and feel.

Metadata

The additional criteria will be available in the form of annotations and/or xml where additional criteria can be overriden from the eclipselink-orm.xml. XML file merging will be available as well in its current form, simply expanded to include the additional criteria and additional criteria callback methods.

An example of the XML override is as follows:

  • mapping.xml defines:
    • additional-criteria named - A
    • additional-criteria named - B
  • eclipselink.xml defines:
    • additional-criteria named - A
    • additional-criteria named - C

The outcome if the following additional criteria list appended to the descriptors query event manager:

  • A - from eclipselink-orm.xml
  • B - from mapping.xml
  • C - from eclipselink-orm.xml

The following new element will be added to <entity> and <mapped-superclass> complex elements to facilitate the additional criteria support.

<xsd:element name="additional-criteria" type="orm:additional-criteria" maxOccurs="unbounded"/>

The additional-criteria will be applied to all queries.

Additional Criteria

The additional criteria(s) will be used to form the existing additionalJoinExpression from the descriptor's query manager. See the JPQL fragment section below that will discuss how this value will be populated. The additional criterias will be stored on the query manager, keyed by name and can be enabled/disabled using properties set on the EntityManager.

<xsd:complexType name="additional-criteria">
  <xsd:annotation>
    <xsd:documentation>

      /**
       * Can be specified at the Entity or MappedSuperclass level. When specified at 
       * the mapped superclass level, it applies to all inheriting entities unless 
       * those entities define their own additional criteria, at which point the 
       * additional criteria from the mapped superclass is ignored. 
       * 
       * Additional criteria can be specified as a single item or as multiples using
       * the plural AdditionalCriterias annotation.
       *
       * @author Guy Pelletier
       * @since EclipseLink 2.2
       */
      @Target({TYPE})
      @Retention(RUNTIME)
      public @interface AdditionalCriteria {
          /**
           * (Optional) The name of the additional criteria. Naming allows the 
           * capability of turning off individual criteria based on name. 
           */
          String name() default "default";
    
          /**
           * (Optional) By default, the additional criteria is not enabled and applied.
           */
          boolean enabled() default false;
    
          /**
           * (Required) The JPQL fragment to use as the additional criteria.
           */
          String value();
      }

    </xsd:documentation>
  </xsd:annotation>
  <xsd:sequence>
      <xsd:element name="criteria" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute name="name" type="xsd:string"/>
  <xsd:attribute name="enabled" type="xsd:boolean"/>
</xsd:complexType>

Example

  @AdditionalCriteria(
    name="CitySpecified",
    enabled=true,
    value="address.city IS NOT NULL"
  )

  <additional-criteria name="CitySpecified" enabled="true">
    <criteria>address.city IS NOT NULL</criteria>
  </additional-criteria>

Enabling/Disabling additional criteria

The additional criteria will be enable and disabled using EntityManager properties:

The following properties will be added to org.eclipse.persistence.config.PersistenceUnitProperties

  • eclipselink-enable-additional-criteria
  • eclipselink-disable-additional-criteria

Both properties accept the 'entity-name:additional-criteria-name' format to specify which additional criteria to enable/disable.

Example:

eclipselink-enable-additional-criteria = model.Employee:CompanyFilter

This would then enable the additional criteria named 'CompanayFilter' on the model.Employee's DescriptorQueryManager.

These properties are passed to the EntityManager through the following API:

  1. setProperties
  2. setProperty
  3. find
  4. refresh
  5. remove

Passing parameters to the additional criteria

... work in progress ...

Core

JPQL fragment

The current notion will be to tie into the existing JPQL parser to parse the additional criteria where the only alias allowed will be 'this'. We will prepend the select statement, e.g. "Select this from <class> this where" and harness the selection criteria from that resulting query and appended to the executing query.

For an additional criteria group, each selection criteria harnessed from each additional criteria within the group will be joined with an 'AND'

Items that will not be supported in the JPQL fragment are:

  • multiple selects
  • order by
  • group by
  • ... more to come ...

Query manager

Will be responsible for controlling the additional criteria that is applied to the queries. That is, it will take into consideration the additional criteria that is enabled. The query manager is responsible for directing the executing query to the related/associated callback method from the callback class (entity listener or entity class itself).

The query manager will store the list of user decorated additional criteria.

Back to the top