I had the same problem on DAS C++, now it's throwing an exception when it
finds a row that does not contain all the pk columns.

I'm not used to the DAS Java, but I will explain how I did it on DAS C++,
maybe this can help you ; )

It reads the ResultSet metadata to find the pk columns. If the PK is defined
on the config, so it look for the columns defined as pk on the config. In
case it does not find the pk column(or columns if it is a compound pk), it
looks for the ID columns according to DAS Convention Over Configuration
rules. Otherwise it throws the exception.

Does it help? : )

Regards,
Adriano Crestani

On 7/27/07, Amita Vadhavkar <[EMAIL PROTECTED]> wrote:
>
> Further on this,
> Need to consider single and compound PKs case.
> When select does not include complete PK (all PK columns from compound PK)
> ,
> DAS needs to throw exception.
>
> As a fix proposing below changes:-
>
> A>In ResultMetadata - introduce new HashMap tableToPrimaryKeys , fill it
> during constuctor
> and provide get method - getAllPKsForTable(tableName).
>
> B> In ResultSetRow - add method
> checkResultSetMissesPK(allTableNamesFromQueryResultSet)
> which will take each table and check if all PKs are there in result set.
> If
> not it will mark that TableData with hasValidPKs=FALSE.
>
> C> There is already another check in TableData.addData(), which marks this
> flag FALSE, if any PK in result set has NULL data.
>
> B> and C> together will provide complete check
>
> D>In ResultSetRow, call,
> checkResultSetMissesPK(allTableNamesFromQueryResultSet) from processRow()
> and processRecursiveRow(). With this, all TableData will be set with
> proper
> hasValidPK, during ResultSetProcessor.processResultSet() and consequently,
> in ResultSetProcessor.addRowToGraph()  will be able to do judgement if any
> table is missing PK, in which case DAS will throw RuntimeException and
> will
> not form DataGraph.
>
> Any comments/suggestions? Based on this I will work on patch for
> JIRA-1464.
>
> Regards,
> Amita
>
> On 7/19/07, haleh mahbod <[EMAIL PROTECTED]> wrote:
> >
> > It is best to throw an exception for PK not being there, otherwise an
> > empty
> > result set can have two meaning:Empty or something went wrong
> >
> > On 7/18/07, Adriano Crestani <[EMAIL PROTECTED]> wrote:
> > >
> > > Amita,
> > >
> > > There is now way for DAS to  keep the  relationship  data  consistence
> > if
> > > both, pk and fk, are not completely defined. Without them DAS cannot
> > > predict
> > > the relationship.
> > >
> > > As Brent said, I think it could throw an exception when the PK is
> > missing,
> > > no matter if there are relationships or not. Because, as far as I
> know,
> > a
> > > table that has no complete PK retrieved on the ResultSet  is being
> > omitted
> > > from the graph and I don't think this is a good approach.
> > >
> > > But when only the fk is missing, I think it is ok to omit the
> > relationship
> > > between the data objects on the graph. This way the user has the
> option
> > to
> > > decide if the references(relationships) will be included or not on the
> > > graph.
> > >
> > > Regards,
> > > Adriano Crestani
> > >
> > > On 7/18/07, Brent Daniel <[EMAIL PROTECTED]> wrote:
> > > >
> > > > Amita,
> > > >
> > > > Definitely, the DAS should enforce the requirement that the PK
> should
> > > > be returned for each table in the results. I would consider this a
> > > > case where the DAS should throw an exception.
> > > >
> > > > Brent
> > > >
> > > > On 7/18/07, Amita Vadhavkar <[EMAIL PROTECTED]> wrote:
> > > > > Sorry for the leng  thy mail....
> > > > >
> > > > > Tried to check the case when the database has parent-child tables
> > and
> > > > DAS
> > > > > SELECT Command may/may not
> > > > > contain the PKs of the tables. And found some quite confusing
> > > > cases/results,
> > > > > which are effectively giving
> > > > > user a wrong impression of the data in tables.
> > > > >
> > > > > Looks like there are places where we are allowing partial results,
> > > wrong
> > > > > association in parent and child rows.
> > > > > As RDB DAS logic revolves around PKs, can we state clearly that
> > > > > "When Query SELECT does not include PK for a table, the data graph
> > > will
> > > > be
> > > > > empty for that table"
> > > > > ? i.e. in the below analysis, instead of giving wrong/partial
> > result,
> > > at
> > > > > least consistently give no result?
> > > > > And make necessary code corrections to adhere to this statement?
> > > > >
> > > > > Or any alternative approaches?
> > > > >
> > > > > What DAS C++ is doing for this case? Just curious.
> > > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------
> > > > > Say, take below data -
> > > > > Parent: SINGER(ID, NAME), Child:SONG (ID, TITLE, SINGERID)
> > > > > Data:
> > > > > SINGER
> > > > > ID     NAME
> > > > > --------------------
> > > > > 1      Jonh
> > > > > 2      Jane
> > > > >
> > > > > SONG
> > > > > ID   TITLE       SINGERID
> > > > > -------------------------------------
> > > > > 10   ABCD          1
> > > > > 20   Lamb           1
> > > > > 30   La ra ra        2
> > > > >
> > > > > There are total 8 cases that I can see. viz.
> > > > >
> > > > > No relationship in config
> > > > > --------------------------------------------------
> > > > >     parent PK in SEL   child PK in SEL    Result
> > > > >
> > ----------------------------------------------------------------------
> > > > > [1]   present              present                correct
> > > > > [2]   present              missing                wrong
> > > > > [3]   missing              present                wrong
> > > > > [4]   missing              missing               wrong
> > > > >
> > > > > Relationship in config
> > > > > [5]   present            present                 correct
> > > > > [6]   present            missing                 wrong
> > > > > [7]   missing            present                 wrong
> > > > > [8]   missing            missing                wrong
> > > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------
> > > > > When relationship is not defined in DAS Config
> > > > > DAS Client code:
> > > > > ----------------
> > > > > DAS das = DAS.FACTORY.createDAS(getConfig("cfg.xml"),
> > > getConnection());
> > > > > Command select = das.getCommand("withNoRel-5/6/7/8");
> > > > > DataObject root = select.executeQuery();
> > > > > List singers = root.getList("SINGER");
> > > > >     if(singers != null){
> > > > >         System.out.println("Singer size:"+singers.size());
> > > > >         for(int i=0; i<singers.size(); i++){
> > > > >             System.out.println("SINGER NAME:"+
> > > > > ((DataObject)singers.get(i)).getString("NAME"));
> > > > >         }
> > > > >
> > > > >     }
> > > > >
> > > > > List songs = root.getList("SONG");//as there is no relationship
> > > > > (explicit/implicit)
> > > > >
> > > > >     if(songs != null){
> > > > >         System.out.println("Songs size "+songs .size());
> > > > >         for(int ii=0; ii<songs.size(); ii++){
> > > > >             System.out.println("SONG TITLE:"+
> > > > > ((DataObject)songs.get(ii)).getString("TITLE"));
> > > > >         }
> > > > >     }
> > > > >
> > > > > }
> > > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------
> > > > > Result:
> > > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------
> > > > > [1] SELECT SINGER.ID, SINGER.NAME, SONG.ID, SONG.TITLE FROM
> SINGER,
> > > SONG
> > > > > WHERE SINGER.ID = SONG.SINGERID
> > > > > Singer size:2
> > > > > SINGER NAME:John
> > > > > SINGER NAME:Jane
> > > > > Songs size 3
> > > > > SONG TITLE:ABCD
> > > > > SONG TITLE:Lamb
> > > > > SONG TITLE:La ra ra
> > > > >
> > > > > [2] SELECT SINGER.ID, SINGER.NAME, SONG.TITLE FROM SINGER, SONG
> > WHERE
> > > > > SINGER.ID = SONG.SINGERID
> > > > > Singer size:2
> > > > > SINGER NAME:John
> > > > > SINGER NAME:Jane
> > > > > Songs size 1
> > > > > SONG TITLE:ABCD
> > > > >
> > > > > [3] SELECT SINGER.NAME, SONG.ID, SONG.TITLE FROM SINGER, SONG
> WHERE
> > > > > SINGER.ID = SONG.SINGERID
> > > > > Singer size:1
> > > > > SINGER NAME:John
> > > > > Songs size 3
> > > > > SONG TITLE:ABCD
> > > > > SONG TITLE:Lamb
> > > > > SONG TITLE:La ra ra
> > > > >
> > > > > [4] SELECT SINGER.NAME, SONG.TITLE FROM SINGER, SONG WHERE
> SINGER.ID=
> > > > > SONG.SINGERID
> > > > > Singer size:1
> > > > > SINGER NAME:John
> > > > > Songs size 1
> > > > > SONG TITLE:ABCD
> > > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------
> > > > > When relationship one-to-many (sing) is defined in DAS Config
> > > > > DAS Client code:
> > > > > ----------------
> > > > > DAS das = DAS.FACTORY.createDAS(getConfig("cfg.xml"),
> > > getConnection());
> > > > > Command select = das.getCommand("withRel-1/2/3/4");
> > > > > DataObject root = select.executeQuery();
> > > > > List singers = root.getList("SINGER");
> > > > > if(singers != null){
> > > > >     System.out.println("Singer size:"+singers.size());
> > > > >     for(int i=0; i<singers.size(); i++){
> > > > >         System.out.println("SINGER NAME:"+
> > > > > ((DataObject)singers.get(i)).getString("NAME"));
> > > > >
> > > > >         List songs = ((DataObject)singers.get(i)).getList("sing");
> > > //use
> > > > > relationship
> > > > >         if(songs != null){
> > > > >             System.out.println("Songs size "+songs .size()+" for
> > > singer
> > > > > :"+((DataObject)singers.get(i)).getString("NAME"));
> > > > >             for(int ii=0; ii<songs.size(); ii++){
> > > > >                 System.out.println("SONG TITLE:"+
> > > > > ((DataObject)songs.get(ii)).getString("TITLE"));
> > > > >             }
> > > > >         }
> > > > >
> > > > >     }
> > > > > }
> > > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------
> > > > > Result:
> > > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------
> > > > > [5] SELECT SINGER.ID, SINGER.NAME, SONG.ID, SONG.TITLE FROM
> SINGER,
> > > SONG
> > > > > WHERE SINGER.ID = SONG.SINGERID
> > > > > Singer size:2
> > > > > SINGER NAME:John
> > > > > Songs size 2 for singer :John
> > > > > SONG TITLE:ABCD
> > > > > SONG TITLE:Lamb
> > > > > SINGER NAME:Jane
> > > > > Songs size 1 for singer :Jane
> > > > > SONG TITLE:La ra ra
> > > > >
> > > > > [6] SELECT SINGER.ID, SINGER.NAME, SONG.TITLE FROM SINGER, SONG
> > WHERE
> > > > > SINGER.ID = SONG.SINGERID
> > > > > Singer size:2
> > > > > SINGER NAME:John
> > > > > Songs size 0 for singer :John
> > > > > SINGER NAME:Jane
> > > > > Songs size 1 for singer :Jane
> > > > > SONG TITLE:ABCD
> > > > >
> > > > > [7] SELECT SINGER.NAME, SONG.ID, SONG.TITLE FROM SINGER, SONG
> WHERE
> > > > > SINGER.ID = SONG.SINGERID
> > > > > Singer size:1
> > > > > SINGER NAME:John
> > > > > Songs size 3 for singer :John
> > > > > SONG TITLE:ABCD
> > > > > SONG TITLE:Lamb
> > > > > SONG TITLE:La ra ra
> > > > >
> > > > > [8] SELECT SINGER.NAME, SONG.TITLE FROM SINGER, SONG WHERE
> SINGER.ID=
> > > > > SONG.SINGERID
> > > > > Singer size:1
> > > > > SINGER NAME:John
> > > > > Songs size 1 for singer :John
> > > > > SONG TITLE:ABCD
> > > > >
> > > >
> > >
> >
> -------------------------------------------------------------------------------------
> > > > >
> > > > > Regards,
> > > > >
> > > > > Amita
> > > > >
> > > >
> > > >
> ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > >
> > > >
> > >
> >
>

Reply via email to