Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsvectorlayerjoininfo.cpp 3 : : -------------------------- 4 : : begin : Jun 29, 2017 5 : : copyright : (C) 2017 by Paul Blottiere 6 : : email : paul.blottiere@oslandia.com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgsvectorlayerjoininfo.h" 19 : : #include "qgsvectorlayer.h" 20 : : 21 : 0 : QString QgsVectorLayerJoinInfo::prefixedFieldName( const QgsField &f ) const 22 : : { 23 : 0 : QString name; 24 : : 25 : 0 : if ( auto *lJoinLayer = joinLayer() ) 26 : : { 27 : 0 : if ( prefix().isNull() ) 28 : 0 : name = lJoinLayer->name() + '_'; 29 : : else 30 : 0 : name = prefix(); 31 : : 32 : 0 : name += f.name(); 33 : 0 : } 34 : : 35 : 0 : return name; 36 : 0 : } 37 : : 38 : 0 : void QgsVectorLayerJoinInfo::setUsingMemoryCache( bool enabled ) 39 : : { 40 : 0 : mMemoryCache = enabled; 41 : 0 : } 42 : : 43 : 0 : bool QgsVectorLayerJoinInfo::isUsingMemoryCache() const 44 : : { 45 : 0 : if ( mUpsertOnEdit ) 46 : 0 : return false; 47 : : 48 : 0 : return mMemoryCache; 49 : 0 : } 50 : : 51 : 0 : void QgsVectorLayerJoinInfo::setEditable( bool enabled ) 52 : : { 53 : 0 : mEditable = enabled; 54 : : 55 : 0 : if ( ! mEditable ) 56 : : { 57 : 0 : setCascadedDelete( false ); 58 : 0 : setUpsertOnEdit( false ); 59 : 0 : } 60 : 0 : } 61 : : 62 : 0 : QgsFeature QgsVectorLayerJoinInfo::extractJoinedFeature( const QgsFeature &feature ) const 63 : : { 64 : 0 : QgsFeature joinFeature; 65 : : 66 : 0 : if ( auto *lJoinLayer = joinLayer() ) 67 : : { 68 : 0 : const QVariant idFieldValue = feature.attribute( targetFieldName() ); 69 : 0 : joinFeature.initAttributes( lJoinLayer->fields().count() ); 70 : 0 : joinFeature.setFields( lJoinLayer->fields() ); 71 : 0 : joinFeature.setAttribute( joinFieldName(), idFieldValue ); 72 : : 73 : 0 : const QgsFields joinFields = joinFeature.fields(); 74 : 0 : for ( const auto &field : joinFields ) 75 : : { 76 : 0 : const QString prefixedName = prefixedFieldName( field ); 77 : : 78 : 0 : if ( feature.fieldNameIndex( prefixedName ) != -1 ) 79 : 0 : joinFeature.setAttribute( field.name(), feature.attribute( prefixedName ) ); 80 : 0 : } 81 : 0 : } 82 : : 83 : 0 : return joinFeature; 84 : 0 : } 85 : : 86 : 0 : QStringList QgsVectorLayerJoinInfo::joinFieldNamesSubset( const QgsVectorLayerJoinInfo &info, bool blocklisted ) 87 : : { 88 : 0 : QStringList fieldNames; 89 : : 90 : 0 : if ( blocklisted && !info.joinFieldNamesBlockList().isEmpty() ) 91 : : { 92 : 0 : QStringList *lst = info.joinFieldNamesSubset(); 93 : 0 : if ( lst ) 94 : : { 95 : 0 : for ( const QString &s : std::as_const( *lst ) ) 96 : : { 97 : 0 : if ( !info.joinFieldNamesBlockList().contains( s ) ) 98 : 0 : fieldNames.append( s ); 99 : : } 100 : 0 : } 101 : : else 102 : : { 103 : 0 : if ( auto *lJoinLayer = info.joinLayer() ) 104 : : { 105 : 0 : const QgsFields fields { lJoinLayer->fields() }; 106 : 0 : for ( const QgsField &f : fields ) 107 : : { 108 : 0 : if ( !info.joinFieldNamesBlockList().contains( f.name() ) 109 : 0 : && f.name() != info.joinFieldName() ) 110 : 0 : fieldNames.append( f.name() ); 111 : : } 112 : 0 : } 113 : : } 114 : 0 : } 115 : : else 116 : : { 117 : 0 : QStringList *lst = info.joinFieldNamesSubset(); 118 : 0 : if ( lst ) 119 : : { 120 : 0 : fieldNames = *lst; 121 : 0 : } 122 : : } 123 : : 124 : 0 : return fieldNames; 125 : 0 : } 126 : : 127 : 0 : bool QgsVectorLayerJoinInfo::hasSubset( bool blocklisted ) const 128 : : { 129 : 0 : bool subset = joinFieldNamesSubset(); 130 : : 131 : 0 : if ( blocklisted ) 132 : 0 : subset |= !joinFieldNamesBlockList().isEmpty(); 133 : : 134 : 0 : return subset; 135 : : }