Hi Andy,

 

This is a good initiative, thank you.

JDO 2 needs alternate ways to define fetch plans.

 

Some food for thoughts here:

·         possibility to add the DFG of a class into a fetch group

·         possibility to add all fields of a class into a fetch group

·         possibility to add all primitive fields of a class into a fetch group

·         possibility to add all reference fields of a class into a fetch group

·         possibility to add all collections fields of a class into a fetch 
group

·         possibility to remove all primitive fields of a class into a fetch 
group

·         possibility to remove all reference fields of a class into a fetch 
group

·         possibility to remove all collections fields of a class into a fetch 
group

·         possibility to create a global fetch plan without fetch groups at all

 

pm.setFetchPlan( "Person(             name,age, 

address( {dfg} ,

                 country( {all} , -flagIMG ) ), 

accounts( {simple} , +{references} )           )"   ) ;

 

Person actually references the candidate class, so I suppose it could be 
optional.

 

This method will load name and age from a Person, then will load the configured 
DFG from the reference to Address, then will load all fields but flagIMG from 
the reference to Country into address, and finally will load simple fields and 
unary references to other objects from the collection of Accounts. We should 
also probably support depth in that mechanism.

 

Having this “SSFP” (Single String Fetch Plan) will allow to tune the system 
externally, from JMX or a configuration file for instance.

 

Many users told me it is quite difficult to define fetch plans from independent 
fetch groups configured in various classes (and possibly various JDO files). 
They would like a way to execute a query with a fetch plan defined next to the 
query, by APIs, or by configuration.

 

Just my 2 cents.

 

Rgds,

....: Eric Samson, Founder & CTO, Xcalia

Service your Data!

 

-----Message d'origine-----
De : Andy Jefferson [mailto:[EMAIL PROTECTED] 
Envoyé : mardi 13 novembre 2007 11:33
À : [email protected]; JDO Expert Group
Objet : JDO2.1/2.2 Proposal : Dynamic Fetch Groups

 

Below is a proposal that could possibly be included in a JDO2.2 (or in JDO2.1 

if feedback is positive for that, and JPOX already implements it).

 

========================================

Problem : fetch groups are static, defined in metadata (XML/annotations).  

Sometimes it would be more convenient to be able to define fetch groups  

dynamically, for example based on user interaction in a web system.

 

========================================

Proposal :

We add a new interface defining a FetchGroup, where a FetchGroup has a  

symbolic name and is for a class defining the fields of that class that are  

in the fetch group.

 

public interface FetchGroup

{

    String getName(); // Symbolic name (as also used in MetaData)

    String getClassName(); // Class to which this group refers

    FetchGroup add(String fieldName); // Add a field

    FetchGroup remove(String fieldName); // Remove a field

 

    boolean hasField(String fieldName);

    String[] getFieldNames();

 

    void setPostLoad(boolean postLoad);

    boolean getPostLoad();

}

 

We allow users to register/deregister their FetchGroups with the PMF

 

PersistenceManagerFactory

{

    ...

    void addFetchGroup(FetchGroup grp);

    void removeFetchGroup(String name, Class cls);

    FetchGroup createFetchGroup(String name, Class cls);

    FetchGroup getFetchGroup(String grpName, Class cls);

    FetchGroup[] getFetchGroups();

    void clearFetchGroups();

}

 

========================================

Usage:

FetchGroup grp1 = pmf.createFetchGroup("myGroup1", MyClass.class);

grp1.add("field1").add("field2").add("field4");

pmf.addFetchGroup(grp1); // FetchGroup registered

 

pm.getFetchPlan().setGroup("myGroup1"); // FetchGroup used in this plan

// FetchPlan now has MyClass {field1, field2, field4}

 

We can then also allow dynamic changes like

pmf.getFetchGroup("myGroup1", MyClass.class).add("field7");

and this is directly reflected in the FetchPlan

 

 

 

Possible changes:-

1. PMF has createFetchGroup and addFetchGroup and we could merge these so when 

creating a FetchGroup it is added

2. Doesnt support "recursion-depth" specification when adding a field to a 

FetchGroup, so we could add a method "add(String fieldName, int depth)"

 

 

-- 

Andy  (Java Persistent Objects - http://www.jpox.org)

Reply via email to