Re: DataRow to CDO comparison

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Fri Nov 14 2008 - 11:39:32 EST

  • Next message: Demetrios Kyriakis: "Include modeler.bat back in the distribution?"

    Doesn't look too bad to me. Alternatively you can write a
    PropertyVisitor and use it with ClassDescriptor:

    ClassDescriptor cd = entityResolver.getClassDescriptor(...);
    cd.visitProperties(new PropertyVisitor() {

         public boolean visitAttribute(AttributeProperty property) {
             ...
             // property.writeProperty(..);
             return true;
         }

         public boolean visitToOne(ToOneProperty property) {
             ...
             return true;
         }

         public boolean visitToMany(ToManyProperty property) {
             ...
             return true;
         }
    });

    Probably not much of a saving in terms of lines of code, but hopefully
    will make things a bit more organized.

    Andrus

    On Nov 14, 2008, at 4:53 PM, Andrey Razumovsky wrote:

    > I want to apply all changes and commit.
    > My snippet isn't the best code in the world, but it seems to be
    > working (my
    > DataMap is quite simple).
    >
    > for (ObjAttribute attr : objEntity.getAttributes()) {
    > if (!attr.isFlattened()) {
    > local.writeProperty(attr.getName(),
    > row.get(attr.getDbAttributeName()));
    > }
    > }
    > for (ObjRelationship rel : objEntity.getRelationships()) {
    > if (!rel.isToMany() && rel.getDbRelationships().size() == 1) {
    > List<DbJoin> joins = rel.getDbRelationships().get(0).getJoins();
    > if (joins.size() == 1) {
    > String joinId = joins.get(0).getSourceName();
    > Object linkedId = row.get(joinId);
    > if (linkedId != null) {
    > Object linked = DataObjectUtils.objectForPK(context,
    > rel.getTargetEntityName(),
    > linkedId);
    > local.writeProperty(rel.getName(), linked);
    > }
    > else {
    > local.writeProperty(rel.getName(), null);
    > }
    > }
    > }
    > }
    >
    > I'm sure I can improve it somehow..
    >
    >
    > 2008/11/14, Andrus Adamchik <andru..bjectstyle.org>:
    >>
    >> Yeah, 'objectFromDataRow' is intended for backend updates of the data
    >> objects, so it works under assumption that the data in the DataRow
    >> is a DB
    >> data, and after a refresh, the object is still COMMITTED.
    >>
    >> So do you want to compare the values or actually apply all changes
    >> to the
    >> object with the goal of committing them?
    >>
    >> Andrus
    >>
    >>
    >> On Nov 13, 2008, at 4:31 PM, Andrey Razumovsky wrote:
    >>
    >>> Suggest I have a DataRow with fresh data which I want to apply to my
    >>> database, and already a row with same id exists in DB, so
    >>> CayenneDataObject local = (CayenneDataObject)
    >>> DataObjectUtils.objectForPK(context, id);
    >>> is not null.
    >>>
    >>> How can I now compare it with a DataRow? It's logical to use
    >>> DataObject fresh= context.objectFromDataRow(entityName, dataRow,
    >>> resfresh);
    >>>
    >>> BUT:
    >>> if refresh is false, "fresh" object contains old values (those
    >>> from local,
    >>> not from dataRow).
    >>> if refresh is true, "fresh" and "local" objects get new values, but
    >>> property
    >>> change operations are not registered, so context.commitChanges()
    >>> does
    >>> nothing.
    >>>
    >>> What's the elegant way to refresh object with new dataRow values?
    >>>
    >>
    >>



    This archive was generated by hypermail 2.0.0 : Fri Nov 14 2008 - 11:40:10 EST