|
|
| · · · · · · · | |
|
Re: Fwd: Filter by Selection on Grid
Hi, Hmmm... although I did do a complete svn co before submitting my previous patch, I think I am making it all complicated by bringing in too many things together. I think you're right. Probably its better to do one thing at a time :) Attached is a patch to correct the Sort issue. It does an in-place string replace if the sort order is changed by the user. Once this goes ahead, I have a few more patches coming up: 1. IS DISTINCT FROM to replace '<>' in the WHERE conditions 2. Documentation addition in the html about the recent Selection/Sort changes. 3. Ensure that a thread->IsRunning() in frmEdit.cpp (line: ~414) doesn't cause a crash. Robins Tharakan
---------- Forwarded message ---------- From: Dave Page <dpage(at)postgresql(dot)org> Date: Feb 7, 2008 4:50 PM Subject: Re: [pgadmin-hackers] Fwd: Filter by Selection on Grid To: Robins Tharakan <tharakan(at)gmail(dot)com> Cc: pgadmin-hackers(at)postgresql(dot)org Hi. On Feb 6, 2008 5:42 PM, Robins Tharakan <tharakan(at)gmail(dot)com> wrote: > Hi, > > The attached patch does this: > 1. Sanitize the if-else bracket style for the earlier patch. > 2. Use 'IS DISTINCT FROM' instead of <> in an exclusion condition. > > Two issues remain that I can't resolve: > 1. Rightly as you point out thread->IsRunning() needs to be called only if > it exists. On rigorous testing the application bombs if this thread is > non-existent (backtrace attached). Any good way to check whether a thread is > running ? Any flag etc ? to SVN, and cleaned up the formatting, added the test to ensure thread is valid, and added the proper quoting. So at this point you should svn update and start working from svn trunk again to add the IS DISTINCT FROM and duplicate sort prevention. > 2. The case of selection and deselection of the same field name can > (ideally) cause a bit of a complication. > Consider this: > a. M=10 AND M <> 10 > b. M = 10 AND (N = 10 OR M <> 10) > If we are to filter out the old test condition replacing it with a new test > condition using a string parser how does it understand the difference > between case (a) and case (b) ? Unless I am missing the point, I think to > effectively resolve this would need a inverted tree structure for the where > clause which I think is a bit of an overkill for now ? not going to be used by someone at the same time as they manually author filter strings - so I say we just document the potential issue and leave it at that. I'm more concerned about the sorting side where it should be trivial to detect the duplicate. Speaking of which, this feature should have a paragraph or two in the docs - I forgot to mention that, sorry (we've been waiting to release 8.3 for months so I'm somewhat rusty at this!). Thanks, Dave. Index: pgadmin/frm/frmEditGrid.cpp
===================================================================
--- pgadmin/frm/frmEditGrid.cpp (revision 7069)
+++ pgadmin/frm/frmEditGrid.cpp (working copy)
@@ -563,16 +563,32 @@
sqlTable *table=sqlGrid->GetTable();
wxString column_label = qtIdent(table->GetColLabelValueUnformatted(curcol));
+ wxString old_sort_string = GetSortCols().Trim();
wxString new_sort_string;
- size_t old_sort_string_length = GetSortCols().Trim().Len();
-
- if (old_sort_string_length > 0) {
- new_sort_string = GetSortCols().Trim() + wxT(" , ");
+ if (old_sort_string.Find(column_label) == wxNOT_FOUND)
+ {
+ if (old_sort_string.Len() > 0) {
+ new_sort_string = old_sort_string + wxT(" , ");
+ }
+
+ new_sort_string += column_label + wxT(" ASC ");
+ }
+ else
+ {
+ if (old_sort_string.Find(column_label + wxT(" ASC")) == wxNOT_FOUND)
+ {
+ // Previous occurrence was for DESCENDING sort
+ new_sort_string = old_sort_string;
+ new_sort_string.Replace(column_label + wxT(" DESC"), column_label + wxT(" ASC"));
+ }
+ else
+ {
+ // Previous occurrence was for ASCENDING sort. Nothing to do
+ new_sort_string = old_sort_string;
+ }
}
-
- new_sort_string += column_label + wxT(" ASC ");
-
+
SetSortCols(new_sort_string);
Go();
@@ -585,18 +601,34 @@
sqlTable *table=sqlGrid->GetTable();
wxString column_label = qtIdent(table->GetColLabelValueUnformatted(curcol));
+ wxString old_sort_string = GetSortCols().Trim();
wxString new_sort_string;
- size_t old_sort_string_length = GetSortCols().Trim().Len();
-
- if (old_sort_string_length > 0) {
- new_sort_string = GetSortCols().Trim() + wxT(" , ");
+ if (old_sort_string.Find(column_label) == wxNOT_FOUND)
+ {
+ if (old_sort_string.Len() > 0) {
+ new_sort_string = old_sort_string + wxT(" , ");
+ }
+
+ new_sort_string += column_label + wxT(" DESC ");
+ }
+ else
+ {
+ if (old_sort_string.Find(column_label + wxT(" DESC")) == wxNOT_FOUND)
+ {
+ // Previous occurrence was for ASCENDING sort
+ new_sort_string = old_sort_string;
+ new_sort_string.Replace(column_label + wxT(" ASC"), column_label + wxT(" DESC"));
+ }
+ else
+ {
+ // Previous occurrence was for DESCENDING sort. Nothing to do
+ new_sort_string = old_sort_string;
+ }
}
-
- new_sort_string += column_label + wxT(" DESC ");
-
+
SetSortCols(new_sort_string);
-
+
Go();
}
|