You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-user@db.apache.org by LE-QUERE Gildas - REN <gi...@atosorigin.com> on 2004/11/03 09:29:42 UTC

Re: collection loading and filtering

Hi Jakob, 

I think you have not seen my last post :)

============ JAVA code  =============================

package test.ojb;


import java.util.Vector;

public class A {

    private int oid;

    private String name = null;

    private Vector elements = null;


    public A() {
 super();
   }
   public A(String name) {
 super();

 this.name = name;
   }
   public void add(B b){

     if(elements == null) elements = new Vector();
     elements.addElement(b);
    }
   public boolean isEqual(A a){

     return this.oid == a.getOid();
   }

   public int getOid() {
 return oid;
   }

}

package test.ojb;


public class B {

   private int oid;

   private String value = null;

   private String filter = null;


   public B(){
 super();
   }
   public B(String filter, String value) {
 super();

 this.filter = filter;
 this.value = value;
   }
   public boolean isEqual(B b){

     return this.oid == b.getOid();
   }

   public int getOid() {
 return oid;
   }

   public String getFilter() {
 return filter;
   }

   public String getValue() {
 return value;
   }
}

package test.ojb;

import java.util.Collection;

import org.apache.log4j.Category;
import org.apache.log4j.Logger;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.broker.PersistenceBrokerFactory;
import org.apache.ojb.broker.query.Criteria;
import org.apache.ojb.broker.query.Query;
import org.apache.ojb.broker.query.QueryByCriteria;
import org.apache.ojb.broker.query.QueryFactory;

/**
 * Projection test with OJB 1.0.0
 */
public class ProjectionTest {

 private static Category logger = null;

 private PersistenceBroker broker = null;

 public ProjectionTest(){

  if(logger == null) logger = Logger.getInstance(ProjectionTest.class) ;

  this.broker = PersistenceBrokerFactory.defaultPersistenceBroker();
 }

 public static void main(String[] args) {

  ProjectionTest projectionTest = new ProjectionTest();

  // uncomment the following line to initialize the database
  //projectionTest.initDB();



  // load the collection with a SQL statement
  B[] sqlResult = projectionTest.getFilteredArray1("xxx", "yyy");


  // load the collection with OJB projection
  B[] ojbResult = projectionTest.getFilteredArray2("xxx", "yyy");

  if(sqlResult != null && ojbResult != null){

   if(sqlResult.length == ojbResult.length){

    logger.info("result size SQL == result size OJB ");

    // log obj results
    for (int i=0;i<ojbResult.length;i++)
     logger.info("B<" + ojbResult[i].getFilter() + ", " +
ojbResult[i].getValue() + ">");
   }
   else
    logger.info("result size SQL != result size OJB - Test KO.");
  }
 }

 public void initDB(){
  // objects with a relationship 1:N
  A a1 = new A("xxx");
  A a2 = new A("fff");

  // populate the "elements" relationship
  for(int i=0; i<3;i++){

   // a1 contains two categories of filter
   a1.add(new B("yyy", "aby" + i));
   a1.add(new B("zzz", "abz" + i));

   // a2 contains two categories of filter
   a2.add(new B("yyy", "bby" + i));
   a2.add(new B("zzz", "bbz" + i));
  }
  broker.beginTransaction();

  // store all into the DB (auto-update=true)
  broker.store(a1);
  broker.store(a2);

  broker.commitTransaction();

  // make sure the relationship is loaded from the DB
  broker.serviceObjectCache().clear();

 }
 // example realized with a SQL (SQL92) statement
 public  B[] getFilteredArray1(String name, String filter){

  B[] ret = null;
  StringBuffer sqlStatement = new StringBuffer();

  sqlStatement.append("select b.* from T_A a, T_B b where b.a_oid=A.oid and
a.name='");
  sqlStatement.append(name);
  sqlStatement.append("' and b.filter='");
  sqlStatement.append(filter);
  sqlStatement.append("'");

  Query query = QueryFactory.newQuery(B.class, sqlStatement.toString());

  Collection col = broker.getCollectionByQuery(query);

  broker.serviceObjectCache().clear();

  if(col != null){

   ret = new B[col.size()];

   col.toArray(ret);
  }
  return ret;
 }
 // example realize with a SQL (SQL92) statement
 public B[] getFilteredArray2(String name, String filter){

  B[] ret = null;
  Criteria criteria = new Criteria();

  // criteria relative to A
  criteria.addEqualTo("name", name);
  criteria.addEqualTo("elements.filter", filter);

  QueryByCriteria query = QueryFactory.newQuery(A.class, criteria);

  query.setObjectProjectionAttribute("elements");

  Collection col = broker.getCollectionByQuery(query);

  broker.serviceObjectCache().clear();

  if(col != null){

   ret = new B[col.size()];

   col.toArray(ret);
  }
  return ret;
 }
}

================== SQL for Oracle 8i ===========================

SPOOL projtest.log

drop table T_A;

create table T_A (
 OID  INTEGER   NOT NULL,
 name  VARCHAR2 ( 16 )  NULL,
 constraint PK_A PRIMARY KEY (OID)
);

commit;


drop table T_B;

create table T_B (
 OID  INTEGER   NOT NULL,
 filter  VARCHAR2 ( 16 )  NULL,
 value  VARCHAR2 ( 16 )  NULL,
 a_OID  INTEGER   NULL,
 constraint PK_B PRIMARY KEY (OID)
);

commit;

SPOOL OFF

Exit 0 ;

.
/
=================== repository.xml ==================================

<?xml version='1.0' encoding='ISO-8859-1'  ?>
 <descriptor-repository version="1.0" isolation-level="read-uncommitted"
        proxy-prefetching-limit="50">

<!-- Datasource for Proto1, this connection is used as the default -->
<!-- Driver P6Spy : com.p6spy.engine.spy.P6SpyDriver -->
<!-- Driver Oracle : oracle.jdbc.driver.OracleDriver -->
<jdbc-connection-descriptor

        jcd-alias="sim"
        default-connection="true"
     platform="Oracle"
     jdbc-level="2.0"
     driver="com.p6spy.engine.spy.P6SpyDriver"
     protocol="jdbc"
     subprotocol="oracle:thin"
     dbalias="@xxxxxx"
     username="xxxxxxx"
     password="xxxxxxx"
  eager-release="false"
        batch-mode="false"
        useAutoCommit="1"
        ignoreAutoCommitExceptions="false"
>
        <sequence-manager
className="org.apache.ojb.broker.util.sequence.SequenceManagerNextValImpl">
            <attribute attribute-name="autoNaming" attribute-value="true"/>
        </sequence-manager>

</jdbc-connection-descriptor>

<!-- Mapping  -->

<class-descriptor
 class="test.ojb.A"
 table="T_A"
 isolation-level="read-uncommitted"
 accept-locks="true"
 refresh="true">

 <field-descriptor
  name="oid"
  column="oid"
  jdbc-type="INTEGER"
  primarykey="true"
  autoincrement="true"
  nullable="false"/>

 <field-descriptor
  name="name"
  column="name"
  jdbc-type="VARCHAR"/>

 <!-- elements relationship -->
 <collection-descriptor
  name="elements"
  element-class-ref="test.ojb.B"
  auto-update="true"
  auto-retrieve="true"
  auto-delete="true"
  proxy="true"

 >
  <inverse-foreignkey field-ref="aOid"/>
 </collection-descriptor>

</class-descriptor>

<class-descriptor
 class="test.ojb.B"
 table="T_B" isolation-level="read-uncommitted"
 accept-locks="true" refresh="true" >

 <field-descriptor
  name="oid"
  column="oid"
  jdbc-type="INTEGER"
  primarykey="true"
  autoincrement="true"/>

 <field-descriptor
  name="filter"
  column="filter"
  jdbc-type="VARCHAR"/>

 <field-descriptor
  name="value"
  column="value"
  jdbc-type="VARCHAR"/>

 <field-descriptor
  name="aOid"
  column="a_OID"
  jdbc-type="INTEGER"  access="anonymous"/>

</class-descriptor>


 </descriptor-repository>

========================== END source ==============================

Gildas


---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-user-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-user-help@db.apache.org