Changeset 16366

Show
Ignore:
Timestamp:
05/12/08 15:36:54 (2 months ago)
Author:
piotras
Message:

Added multilingual fallback language support

Files:

Legend:

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

    r16035 r16366  
    3232#include "midgard_mysql.h" 
    3333 
     34void _midgard_core_qb_set_metadata_sql(GString *str, const gchar *table) 
     35{ 
     36        if(table == NULL) { 
     37                 
     38                g_string_append(str, 
     39                        "guid, sitegroup, " 
     40                        "metadata_creator, " 
     41                        "metadata_created, " 
     42                        "metadata_revisor, " 
     43                        "metadata_revised, " 
     44                        "metadata_revision, " 
     45                        "metadata_locker, " 
     46                        "metadata_locked, " 
     47                        "metadata_approver, " 
     48                        "metadata_approved, " 
     49                        "metadata_authors, metadata_owner, " 
     50                        "metadata_schedule_start, " 
     51                        "metadata_schedule_end, " 
     52                        "metadata_hidden, " 
     53                        "metadata_nav_noentry, metadata_size, metadata_published, " 
     54                        "metadata_exported, " 
     55                        "metadata_imported," 
     56                        "metadata_deleted, metadata_score, "); 
     57 
     58                return; 
     59        } 
     60 
     61        g_string_append_printf(str, 
     62                        "%s.guid, %s.sitegroup, " 
     63                        "%s.metadata_creator, " 
     64                        "NULLIF(%s.metadata_created,'0000-00-00 00:00:00') AS metadata_created, " 
     65                        "%s.metadata_revisor, " 
     66                        "NULLIF(%s.metadata_revised,'0000-00-00 00:00:00') AS metadata_revised, " 
     67                        "%s.metadata_revision, " 
     68                        "%s.metadata_locker, " 
     69                        "NULLIF(%s.metadata_locked,'0000-00-00 00:00:00') AS metadata_locked, " 
     70                        "%s.metadata_approver, " 
     71                        "NULLIF(%s.metadata_approved,'0000-00-00 00:00:00') AS metadata_approved, " 
     72                        "%s.metadata_authors, %s.metadata_owner, " 
     73                        "NULLIF(%s.metadata_schedule_start,'0000-00-00 00:00:00') AS metadata_schedule_start, " 
     74                        "NULLIF(%s.metadata_schedule_end,'0000-00-00 00:00:00') AS metadata_schedule_end, " 
     75                        "%s.metadata_hidden, " 
     76                        "%s.metadata_nav_noentry, %s.metadata_size, %s.metadata_published, " 
     77                        "NULLIF(%s.metadata_exported,'0000-00-00 00:00:00') AS metadata_exported, " 
     78                        "NULLIF(%s.metadata_imported,'0000-00-00 00:00:00') AS metadata_imported," 
     79                        "%s.metadata_deleted, %s.metadata_score, ", 
     80                        table, table, table, table, table, table, table, table, table, 
     81                        table, table, table, table, table, table, table, table, table, 
     82                        table, table, table, table, table);  
     83} 
     84 
     85gchar *__get_multilang_select(MidgardQueryBuilder *builder) 
     86{ 
     87        GString *str = g_string_new("SELECT "); 
     88        _midgard_core_qb_set_metadata_sql(str, NULL); 
     89 
     90        guint n_props, i, j = 0; 
     91        MidgardObjectClass *klass = MIDGARD_OBJECT_CLASS(g_type_class_peek(builder->type)); 
     92        GParamSpec **pspecs =  
     93                g_object_class_list_properties(G_OBJECT_CLASS(klass), &n_props); 
     94 
     95        if(!pspecs)  
     96                g_error("__get_multilang_select. No properties."); 
     97         
     98        for(i = 0; i < n_props; i++) { 
     99         
     100                /* UGLY, FIXME */ 
     101                if(g_str_equal(pspecs[i]->name, "guid") 
     102                                || g_str_equal(pspecs[i]->name, "sitegroup") 
     103                                || g_str_equal(pspecs[i]->name, "metadata") 
     104                                || g_str_equal(pspecs[i]->name, "action")) 
     105                        continue; 
     106 
     107                if(j > 0) 
     108                        g_string_append_printf(str, ", %s", pspecs[i]->name); 
     109                else  
     110                        g_string_append_printf(str, " %s", pspecs[i]->name); 
     111 
     112                j++; 
     113        } 
     114 
     115        g_string_append(str, " FROM ( "); 
     116 
     117        return g_string_free(str, FALSE); 
     118} 
     119 
     120gboolean _midgard_core_qb_is_multilingual(MidgardQueryBuilder *builder) 
     121{ 
     122        if(builder->unset_lang) 
     123                return FALSE; 
     124         
     125        if(builder->lang < 0) 
     126                return TRUE; 
     127 
     128        return FALSE; 
     129} 
     130 
    34131gchar *_midgard_core_qb_get_sql( 
    35132                MidgardQueryBuilder *builder, guint mode, gchar *select) 
     
    43140            return NULL; 
    44141        } 
    45          
    46         GString *sql = g_string_new("SELECT "); 
     142        gboolean multilang_fallback = _midgard_core_qb_is_multilingual(builder); 
     143        GString *sql = g_string_new(""); 
     144 
     145        /* MULTILANG FALLBACK */ 
     146        if(multilang_fallback) { 
     147                 
     148                gchar *ml_str = __get_multilang_select(builder); 
     149                g_string_append_printf(sql, " %s ", ml_str); 
     150                g_free(ml_str); 
     151        } 
     152 
     153        g_string_append(sql, "SELECT "); 
    47154        g_string_append(sql, select); 
    48155        g_free(select); 
     
    51158            tables = builder->tables; 
    52159         
     160        /* MULTILANG FALLBACK */ 
     161        if(multilang_fallback)  
     162                g_string_append_printf(sql,  
     163                                ", CASE WHEN lang=%d THEN 1 ELSE 0 END AS midgard_fallback_language ", 
     164                                mgd_lang(builder->mgd)); 
     165 
    53166        g_string_append(sql, " FROM "); 
    54167        g_string_append(sql, tables); 
     
    81194                                g_string_append_printf(sql, 
    82195                                                "_i.lang IN (%d, %d)", 
    83                                                 mgd_lang(builder->mgd), 
    84                                                 mgd_get_default_lang(builder->mgd)); 
     196                                                mgd_get_default_lang(builder->mgd),  
     197                                                mgd_lang(builder->mgd)); 
    85198                        } else { 
    86199                                /* builder->lang is set with set_lang method, so  
     
    92205                                                builder->lang); 
    93206                        } 
    94                 } 
    95                 
     207                }        
    96208        }            
    97209 
     
    114226                                builder->schema->table); 
    115227        } 
     228 
     229        /* MULTILANG FALLBACK */ 
     230        if(multilang_fallback) { 
     231 
     232                /* Unfortunatelly we can not use QB's API and order method :( */         
     233                g_string_append(sql, " ORDER BY midgard_fallback_language DESC"); 
     234        } 
     235                         
    116236        /* TODO: The following code adds the ORDER BY ordering 
    117237         * constraints to the SQL query. Commented out because 
     
    124244                        g_string_append(sql, ", "); 
    125245                } else { 
    126                         g_string_append(sql, " ORDER BY "); 
     246                        if(!multilang_fallback) 
     247                                g_string_append(sql, " ORDER BY "); 
    127248                } 
    128249                MidgardQueryOrder *order = g_array_index( 
     
    131252        } 
    132253 
    133         if (mode < MQB_SELECT_COUNT && builder->limit != G_MAXUINT) { 
    134                 g_string_append_printf(sql, " LIMIT %u", builder->limit); 
    135                 if (builder->offset != 0) { 
    136                         g_string_append_printf( 
    137                                 sql, " OFFSET %u", builder->offset); 
    138                 } 
    139         } 
     254        /* MULTILANG FALLBACK */ 
     255        if(multilang_fallback) 
     256                g_string_append(sql, " ) AS midgard_multilang_table GROUP BY sid"); 
     257 
     258        if (mode < MQB_SELECT_COUNT && builder->limit != G_MAXUINT)  
     259                g_string_append_printf(sql, " LIMIT %u", builder->limit); 
     260 
     261        if (builder->offset != 0) { 
     262                g_string_append_printf( 
     263                                sql, " OFFSET %u", builder->offset); 
     264        } 
    140265 
    141266        return g_string_free(sql, FALSE);