2023-12-01 Fred Gleason <fredg@paravelsystems.com>

* Added support for subclauses in the cart library search filter.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2023-12-01 16:46:34 -05:00
parent 8063f40cbe
commit ce989b725d
3 changed files with 67 additions and 27 deletions

View File

@ -24504,3 +24504,5 @@
event of the appended log. event of the appended log.
2023-12-01 Fred Gleason <fredg@paravelsystems.com> 2023-12-01 Fred Gleason <fredg@paravelsystems.com>
* Optimized the handling of cart numbers when searching for carts. * Optimized the handling of cart numbers when searching for carts.
2023-12-01 Fred Gleason <fredg@paravelsystems.com>
* Added support for subclauses in the cart library search filter.

View File

@ -588,13 +588,14 @@ void RDCartFilter::resizeEvent(QResizeEvent *e)
} }
QString RDCartFilter::phraseFilter(const QString &phrase, bool incl_cuts) QString RDCartFilter::phraseFilter(QString phrase, bool incl_cuts)
{ {
QString sql=""; QString sql="";
QList<unsigned> cart_numbers; QList<unsigned> cart_numbers;
QStringList clauses;
bool ok=false; bool ok=false;
if(phrase.isEmpty()) { if(phrase.trimmed().isEmpty()) {
sql=" "; sql=" ";
} }
else { else {
@ -610,35 +611,46 @@ QString RDCartFilter::phraseFilter(const QString &phrase, bool incl_cuts)
i--; i--;
} }
} }
phrase=words.join(" ").trimmed();
sql+=" ("; //
if(words.size()>0) { // Generate Clauses
QString search=RDEscapeString(words.join(" ")); //
sql+=QString("(`CART`.`TITLE` like '%")+search+"%')||"+ QString accum;
"(`CART`.`ARTIST` like '%"+search+"%')||"+ for(int i=0;i<phrase.size();i++) {
"(`CART`.`CLIENT` like '%"+search+"%')||"+ if(phrase.at(i)==QChar('"')) {
"(`CART`.`AGENCY` like '%"+search+"%')||"+ if(!accum.trimmed().isEmpty()) {
"(`CART`.`ALBUM` like '%"+search+"%')||"+ clauses.push_back(accum.trimmed());
"(`CART`.`LABEL` like '%"+search+"%')||"+ }
"(`CART`.`PUBLISHER` like '%"+search+"%')||"+ accum="";
"(`CART`.`COMPOSER` like '%"+search+"%')||"+ }
"(`CART`.`CONDUCTOR` like '%"+search+"%')||"+ else {
"(`CART`.`SONG_ID` like '%"+search+"%')||"+ accum+=phrase.at(i);
"(`CART`.`USER_DEFINED` like '%"+search+"%')||";
if(incl_cuts) {
sql+=QString("(`CUTS`.`ISCI` like '%")+search+"%')||"+
"(`CUTS`.`ISRC` like '%"+search+"%')||"+
"(`CUTS`.`DESCRIPTION` like '%"+search+"%')||"+
"(`CUTS`.`OUTCUE` like '%"+search+"%')||";
} }
} }
for(int i=0;i<cart_numbers.size();i++) { if(!accum.isEmpty()) {
sql+=QString::asprintf("(`CART`.`NUMBER`=%u)||",cart_numbers.at(i)); clauses.push_back(accum.trimmed());
} }
if(sql.right(2)=="||") {
sql=sql.left(sql.length()-2); //
// Compose SQL
//
if((clauses.size()==0)&&(cart_numbers.size()==0)) {
sql="";
}
else {
sql+=" (";
for(int i=0;i<clauses.size();i++) {
sql+=RDCartFilter::ClauseSql(clauses.at(i),incl_cuts);
}
for(int i=0;i<cart_numbers.size();i++) {
sql+=QString::asprintf("(`CART`.`NUMBER`=%u)||",cart_numbers.at(i));
}
if(sql.right(2)=="||") {
sql=sql.left(sql.length()-2);
}
sql+=") && ";
} }
sql+=") && ";
} }
return sql; return sql;
@ -773,3 +785,28 @@ void RDCartFilter::UpdateModel()
emit filterChanged(d_model_filter_sql,d_model_cart_limit); emit filterChanged(d_model_filter_sql,d_model_cart_limit);
} }
} }
QString RDCartFilter::ClauseSql(const QString &clause,bool incl_cuts)
{
QString search=RDEscapeString(clause);
QString sql=QString("(`CART`.`TITLE` like '%")+search+"%')||"+
"(`CART`.`ARTIST` like '%"+search+"%')||"+
"(`CART`.`CLIENT` like '%"+search+"%')||"+
"(`CART`.`AGENCY` like '%"+search+"%')||"+
"(`CART`.`ALBUM` like '%"+search+"%')||"+
"(`CART`.`LABEL` like '%"+search+"%')||"+
"(`CART`.`PUBLISHER` like '%"+search+"%')||"+
"(`CART`.`COMPOSER` like '%"+search+"%')||"+
"(`CART`.`CONDUCTOR` like '%"+search+"%')||"+
"(`CART`.`SONG_ID` like '%"+search+"%')||"+
"(`CART`.`USER_DEFINED` like '%"+search+"%')||";
if(incl_cuts) {
sql+=QString("(`CUTS`.`ISCI` like '%")+search+"%')||"+
"(`CUTS`.`ISRC` like '%"+search+"%')||"+
"(`CUTS`.`DESCRIPTION` like '%"+search+"%')||"+
"(`CUTS`.`OUTCUE` like '%"+search+"%')||";
}
return sql;
}

View File

@ -57,7 +57,7 @@ class RDCartFilter : public RDWidget
QString service() const; QString service() const;
void setService(const QString &svc); void setService(const QString &svc);
RDLibraryModel *model() const; RDLibraryModel *model() const;
static QString phraseFilter(const QString &phrase,bool incl_cuts); static QString phraseFilter(QString phrase,bool incl_cuts);
static QString groupFilter(const QString &group,const QStringList &groups); static QString groupFilter(const QString &group,const QStringList &groups);
static QString typeFilter(bool incl_audio,bool incl_macro,RDCart::Type mask); static QString typeFilter(bool incl_audio,bool incl_macro,RDCart::Type mask);
@ -94,6 +94,7 @@ class RDCartFilter : public RDWidget
void LoadUserGroups(); void LoadUserGroups();
void LoadServiceGroups(); void LoadServiceGroups();
void UpdateModel(); void UpdateModel();
static QString ClauseSql(const QString &clause,bool incl_cuts);
RDLibraryModel *d_cart_model; RDLibraryModel *d_cart_model;
RDGroupListModel *d_group_model; RDGroupListModel *d_group_model;
QLineEdit *d_filter_edit; QLineEdit *d_filter_edit;