Changeset 16396

Show
Ignore:
Timestamp:
05/17/08 12:00:13 (2 months ago)
Author:
piotras
Message:

Refactored multilang fallback query generation

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/branch-1-8/src/core/midgard/src/midgard_core_query_builder.c

    r16393 r16396  
    151151        if(multilang_fallback) { 
    152152                 
    153                 gchar *ml_str = __get_multilang_select(builder); 
    154                 g_string_append_printf(sql, " %s ", ml_str); 
    155                 g_free(ml_str); 
     153                //gchar *ml_str = __get_multilang_select(builder); 
     154                //g_string_append_printf(sql, " %s ", ml_str); 
     155                //g_free(ml_str); 
    156156        } 
    157157 
     
    163163            tables = builder->tables; 
    164164         
    165         /* MULTILANG FALLBACK */ 
    166         if(multilang_fallback)  
    167                 g_string_append_printf(sql,  
    168                                 ", CASE WHEN lang=%d THEN 1 ELSE 0 END AS midgard_fallback_language ", 
    169                                 mgd_lang(builder->mgd)); 
    170  
    171165        g_string_append(sql, " FROM "); 
    172166        g_string_append(sql, tables); 
     
    181175                MIDGARD_QUERY_CONSTRAINT(builder->stack->data), sql); 
    182176 
     177        /* MULTILANG FALLBACK */ 
     178        if(multilang_fallback) { 
     179 
     180                g_string_append_printf(sql, " AND %s_i.id IN (", builder->schema->table); 
     181                g_string_append_printf(sql, " SELECT ABS(MIN(i_id)) as i_id FROM (SELECT sid, " 
     182                                "CASE WHEN lang=%d THEN %s_i.id*-1 ELSE %s_i.id END AS i_id FROM " 
     183                                "%s  WHERE %s_i.sid = %s.id AND lang IN (%d,%d) ", 
     184                                mgd_get_default_lang(builder->mgd), 
     185                                builder->schema->table, builder->schema->table, 
     186                                tables, builder->schema->table, builder->schema->table, 
     187                                mgd_get_default_lang(builder->mgd), mgd_lang(builder->mgd)); 
     188 
     189                if(g_slist_length(builder->stack) > 0) { 
     190                 
     191                        g_string_append(sql, " AND "); 
     192                        midgard_query_constraint_add_sql( 
     193                                                MIDGARD_QUERY_CONSTRAINT(builder->stack->data), sql); 
     194                } 
     195 
     196                g_string_append(sql, " ) AS midgard_multilang_fallback_table GROUP BY sid )"); 
     197        } 
     198 
    183199        if (builder->schema->use_lang == 1) { 
    184200                g_string_append(sql, " AND "); 
     
    188204                g_string_append(sql, "_i.sid");   
    189205                
    190                 if(!builder->unset_lang) { 
     206                if(!builder->unset_lang  
     207                                && builder->lang >= 0) { 
    191208 
    192209                        g_string_append(sql, " AND "); 
    193210                        g_string_append(sql, builder->schema->table); 
    194                         /* Default behaviour , we get multilang records  
    195                          * with lang 0 and other lang set, thus we have  
    196                          * "full" list of objects , even some of them are  
    197                          * not translated yet.*/  
    198                         if(builder->lang < 0) { 
    199                                 g_string_append_printf(sql, 
    200                                                 "_i.lang IN (%d, %d)", 
    201                                                 mgd_get_default_lang(builder->mgd),  
    202                                                 mgd_lang(builder->mgd)); 
    203                         } else { 
    204                                 /* builder->lang is set with set_lang method, so  
    205                                  * we get only those records with lang being set 
    206                                  * and we ignore all others , even woth lang 0  
    207                                  */ 
    208211                                g_string_append_printf(sql, 
    209212                                                "_i.lang = %d ", 
    210                                                 builder->lang); 
    211                         } 
     213                                                builder->lang);                  
    212214                }        
    213215        }            
     
    230232                                " %s.metadata_deleted = FALSE", 
    231233                                builder->schema->table); 
    232         } 
    233  
    234         /* MULTILANG FALLBACK */ 
    235         if(multilang_fallback) { 
    236  
    237                 /* Unfortunatelly we can not use QB's API and order method :( */         
    238                 g_string_append(sql, " ORDER BY midgard_fallback_language DESC "); 
    239234        } 
    240235                         
     
    249244                        g_string_append(sql, ", "); 
    250245                } else { 
    251                         if(!multilang_fallback) 
    252                                 g_string_append(sql, " ORDER BY "); 
    253                         else  
    254                                 g_string_append(sql, ", "); 
    255                 } 
     246                        g_string_append(sql, " ORDER BY "); 
     247                } 
    256248                MidgardQueryOrder *order = g_array_index( 
    257249                        builder->orders, MidgardQueryOrder*, i);         
    258250                g_string_append(sql, midgard_query_order_get_sql(order)); 
    259251        } 
    260  
    261         /* MULTILANG FALLBACK */ 
    262         if(multilang_fallback) 
    263                 g_string_append(sql, " ) AS midgard_multilang_table GROUP BY sid"); 
    264252 
    265253        if (mode < MQB_SELECT_COUNT && builder->limit != G_MAXUINT)