LCOV - code coverage report
Current view: top level - gnm - gnmlayer.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 40 137 29.2 %
Date: 2025-05-31 00:00:17 Functions: 12 44 27.3 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  GDAL/OGR Geography Network support (Geographic Network Model)
       4             :  * Purpose:  GNM layer class.
       5             :  * Authors:  Mikhail Gusev (gusevmihs at gmail dot com)
       6             :  *           Dmitry Baryshnikov, polimax@mail.ru
       7             :  *
       8             :  ******************************************************************************
       9             :  * Copyright (c) 2014, Mikhail Gusev
      10             :  * Copyright (c) 2014-2015, NextGIS <info@nextgis.com>
      11             :  *
      12             :  * Permission is hereby granted, free of charge, to any person obtaining a
      13             :  * copy of this software and associated documentation files (the "Software"),
      14             :  * to deal in the Software without restriction, including without limitation
      15             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      16             :  * and/or sell copies of the Software, and to permit persons to whom the
      17             :  * Software is furnished to do so, subject to the following conditions:
      18             :  *
      19             :  * The above copyright notice and this permission notice shall be included
      20             :  * in all copies or substantial portions of the Software.
      21             :  *
      22             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
      23             :  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      24             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
      25             :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      26             :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      27             :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      28             :  * DEALINGS IN THE SOFTWARE.
      29             :  ****************************************************************************/
      30             : #include "gnm.h"
      31             : #include "gnm_priv.h"
      32             : 
      33             : /**
      34             :  * GNMGenericLayer
      35             :  */
      36          25 : GNMGenericLayer::GNMGenericLayer(OGRLayer *poLayer,
      37          25 :                                  GNMGenericNetwork *poNetwork)
      38          25 :     : m_soLayerName(poLayer->GetName()), m_poLayer(poLayer),
      39          25 :       m_poNetwork(poNetwork)
      40             : {
      41          25 : }
      42             : 
      43             : /**
      44             :  * ~GNMGenericLayer
      45             :  */
      46             : GNMGenericLayer::~GNMGenericLayer() = default;
      47             : 
      48           0 : const char *GNMGenericLayer::GetFIDColumn()
      49             : {
      50           0 :     return GNM_SYSFIELD_GFID;
      51             : }
      52             : 
      53           0 : const char *GNMGenericLayer::GetGeometryColumn()
      54             : {
      55           0 :     return m_poLayer->GetGeometryColumn();
      56             : }
      57             : 
      58           0 : OGRErr GNMGenericLayer::SetIgnoredFields(CSLConstList papszFields)
      59             : {
      60           0 :     return m_poLayer->SetIgnoredFields(papszFields);
      61             : }
      62             : 
      63           0 : OGRErr GNMGenericLayer::Intersection(OGRLayer *pLayerMethod,
      64             :                                      OGRLayer *pLayerResult,
      65             :                                      char **papszOptions,
      66             :                                      GDALProgressFunc pfnProgress,
      67             :                                      void *pProgressArg)
      68             : {
      69           0 :     return m_poLayer->Intersection(pLayerMethod, pLayerResult, papszOptions,
      70           0 :                                    pfnProgress, pProgressArg);
      71             : }
      72             : 
      73           0 : OGRErr GNMGenericLayer::Union(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
      74             :                               char **papszOptions, GDALProgressFunc pfnProgress,
      75             :                               void *pProgressArg)
      76             : {
      77           0 :     return m_poLayer->Union(pLayerMethod, pLayerResult, papszOptions,
      78           0 :                             pfnProgress, pProgressArg);
      79             : }
      80             : 
      81           0 : OGRErr GNMGenericLayer::SymDifference(OGRLayer *pLayerMethod,
      82             :                                       OGRLayer *pLayerResult,
      83             :                                       char **papszOptions,
      84             :                                       GDALProgressFunc pfnProgress,
      85             :                                       void *pProgressArg)
      86             : {
      87           0 :     return m_poLayer->Union(pLayerMethod, pLayerResult, papszOptions,
      88           0 :                             pfnProgress, pProgressArg);
      89             : }
      90             : 
      91           0 : OGRErr GNMGenericLayer::Identity(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
      92             :                                  char **papszOptions,
      93             :                                  GDALProgressFunc pfnProgress,
      94             :                                  void *pProgressArg)
      95             : {
      96           0 :     return m_poLayer->Union(pLayerMethod, pLayerResult, papszOptions,
      97           0 :                             pfnProgress, pProgressArg);
      98             : }
      99             : 
     100           0 : OGRErr GNMGenericLayer::Update(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     101             :                                char **papszOptions,
     102             :                                GDALProgressFunc pfnProgress, void *pProgressArg)
     103             : {
     104           0 :     return m_poLayer->Update(pLayerMethod, pLayerResult, papszOptions,
     105           0 :                              pfnProgress, pProgressArg);
     106             : }
     107             : 
     108           0 : OGRErr GNMGenericLayer::Clip(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     109             :                              char **papszOptions, GDALProgressFunc pfnProgress,
     110             :                              void *pProgressArg)
     111             : {
     112           0 :     return m_poLayer->Clip(pLayerMethod, pLayerResult, papszOptions,
     113           0 :                            pfnProgress, pProgressArg);
     114             : }
     115             : 
     116           0 : OGRErr GNMGenericLayer::Erase(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     117             :                               char **papszOptions, GDALProgressFunc pfnProgress,
     118             :                               void *pProgressArg)
     119             : {
     120           0 :     return m_poLayer->Erase(pLayerMethod, pLayerResult, papszOptions,
     121           0 :                             pfnProgress, pProgressArg);
     122             : }
     123             : 
     124           0 : GIntBig GNMGenericLayer::GetFeaturesRead()
     125             : {
     126           0 :     return m_poLayer->GetFeaturesRead();
     127             : }
     128             : 
     129           0 : int GNMGenericLayer::AttributeFilterEvaluationNeedsGeometry()
     130             : {
     131           0 :     return m_poLayer->AttributeFilterEvaluationNeedsGeometry();
     132             : }
     133             : 
     134             : //! @cond Doxygen_Suppress
     135           0 : OGRErr GNMGenericLayer::InitializeIndexSupport(const char *pszVal)
     136             : {
     137           0 :     return m_poLayer->InitializeIndexSupport(pszVal);
     138             : }
     139             : 
     140           0 : OGRLayerAttrIndex *GNMGenericLayer::GetIndex()
     141             : {
     142           0 :     return m_poLayer->GetIndex();
     143             : }
     144             : 
     145           0 : OGRErr GNMGenericLayer::ISetFeature(OGRFeature *poFeature)
     146             : {
     147           0 :     VALIDATE_POINTER1(poFeature, "GNMGenericLayer::ISetFeature", CE_Failure);
     148             :     std::map<GNMGFID, GIntBig>::iterator it =
     149           0 :         m_mnFIDMap.find(poFeature->GetFID());
     150           0 :     if (it == m_mnFIDMap.end())
     151             :     {
     152           0 :         CPLError(CE_Failure, CPLE_IllegalArg,
     153             :                  "The FID " CPL_FRMT_GIB " is invalid", poFeature->GetFID());
     154           0 :         return OGRERR_NON_EXISTING_FEATURE;
     155             :     }
     156             : 
     157             :     // TODO: check connection rules if feature can be changed.
     158             : 
     159           0 :     poFeature->SetFID(it->second);
     160           0 :     return m_poLayer->SetFeature(poFeature);
     161             : }
     162             : 
     163         128 : OGRErr GNMGenericLayer::ICreateFeature(OGRFeature *poFeature)
     164             : {
     165         128 :     VALIDATE_POINTER1(poFeature, "GNMGenericLayer::ICreateFeature", CE_Failure);
     166         128 :     GNMGFID nFID = m_poNetwork->GetNewGlobalFID();
     167         128 :     poFeature->SetFID(nFID);
     168         128 :     poFeature->SetField(GNM_SYSFIELD_GFID, nFID);
     169         128 :     poFeature->SetField(GNM_SYSFIELD_BLOCKED, GNM_BLOCK_NONE);
     170         128 :     if (m_poNetwork->AddFeatureGlobalFID(nFID, GetName()) != CE_None)
     171           0 :         return OGRERR_FAILURE;
     172         128 :     return m_poLayer->CreateFeature(poFeature);
     173             : }
     174             : 
     175             : //! @endcond
     176             : 
     177           0 : OGRGeometry *GNMGenericLayer::GetSpatialFilter()
     178             : {
     179           0 :     return m_poLayer->GetSpatialFilter();
     180             : }
     181             : 
     182         716 : OGRErr GNMGenericLayer::ISetSpatialFilter(int iGeomField,
     183             :                                           const OGRGeometry *poGeometry)
     184             : {
     185         716 :     return m_poLayer->SetSpatialFilter(iGeomField, poGeometry);
     186             : }
     187             : 
     188         584 : OGRErr GNMGenericLayer::SetAttributeFilter(const char *pszFilter)
     189             : {
     190         584 :     return m_poLayer->SetAttributeFilter(pszFilter);
     191             : }
     192             : 
     193         428 : void GNMGenericLayer::ResetReading()
     194             : {
     195         428 :     m_poLayer->ResetReading();
     196         428 : }
     197             : 
     198        5313 : OGRFeature *GNMGenericLayer::GetNextFeature()
     199             : {
     200        5313 :     OGRFeature *pFeature = m_poLayer->GetNextFeature();
     201        5313 :     if (nullptr == pFeature)
     202           2 :         return nullptr;
     203        5311 :     GNMGFID nGFID = pFeature->GetFieldAsGNMGFID(GNM_SYSFIELD_GFID);
     204        5311 :     m_mnFIDMap[nGFID] = pFeature->GetFID();
     205        5311 :     pFeature->SetFID(nGFID);
     206        5311 :     return pFeature;
     207             : }
     208             : 
     209           0 : OGRErr GNMGenericLayer::SetNextByIndex(GIntBig nIndex)
     210             : {
     211           0 :     return m_poLayer->SetNextByIndex(nIndex);
     212             : }
     213             : 
     214           0 : OGRErr GNMGenericLayer::DeleteFeature(GIntBig nFID)
     215             : {
     216           0 :     OGRFeature *poFeature = GetFeature(nFID);
     217           0 :     if (nullptr == poFeature)
     218           0 :         return CE_Failure;
     219             : 
     220           0 :     nFID = poFeature->GetFID();
     221           0 :     std::map<GNMGFID, GIntBig>::iterator it = m_mnFIDMap.find(nFID);
     222           0 :     if (it == m_mnFIDMap.end())
     223             :     {
     224           0 :         CPLError(CE_Failure, CPLE_IllegalArg,
     225             :                  "The FID " CPL_FRMT_GIB " is invalid", nFID);
     226           0 :         return OGRERR_NON_EXISTING_FEATURE;
     227             :     }
     228             : 
     229           0 :     OGRFeature::DestroyFeature(poFeature);
     230             : 
     231             :     // delete from graph
     232           0 :     if (m_poNetwork->DisconnectFeaturesWithId(static_cast<GNMGFID>(nFID)) !=
     233             :         CE_None)
     234           0 :         return CE_Failure;
     235             : 
     236           0 :     return m_poLayer->DeleteFeature(it->second);
     237             : }
     238             : 
     239        1570 : const char *GNMGenericLayer::GetName()
     240             : {
     241        1570 :     return m_soLayerName;
     242             : }
     243             : 
     244           8 : OGRwkbGeometryType GNMGenericLayer::GetGeomType()
     245             : {
     246           8 :     return m_poLayer->GetGeomType();
     247             : }
     248             : 
     249           0 : int GNMGenericLayer::FindFieldIndex(const char *pszFieldName, int bExactMatch)
     250             : {
     251           0 :     return m_poLayer->FindFieldIndex(pszFieldName, bExactMatch);
     252             : }
     253             : 
     254           0 : OGRSpatialReference *GNMGenericLayer::GetSpatialRef()
     255             : {
     256           0 :     return m_poLayer->GetSpatialRef();
     257             : }
     258             : 
     259           0 : GIntBig GNMGenericLayer::GetFeatureCount(int bForce)
     260             : {
     261           0 :     return m_poLayer->GetFeatureCount(bForce);
     262             : }
     263             : 
     264           0 : OGRErr GNMGenericLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent,
     265             :                                    bool bForce)
     266             : {
     267           0 :     return m_poLayer->GetExtent(iGeomField, psExtent, bForce);
     268             : }
     269             : 
     270          12 : int GNMGenericLayer::TestCapability(const char *pszCapability)
     271             : {
     272          12 :     return m_poLayer->TestCapability(pszCapability);
     273             : }
     274             : 
     275           8 : OGRErr GNMGenericLayer::CreateField(const OGRFieldDefn *poField, int bApproxOK)
     276             : {
     277           8 :     return m_poLayer->CreateField(poField, bApproxOK);
     278             : }
     279             : 
     280           0 : OGRErr GNMGenericLayer::DeleteField(int iField)
     281             : {
     282           0 :     if (iField == FindFieldIndex(GNM_SYSFIELD_GFID, TRUE))
     283           0 :         return OGRERR_UNSUPPORTED_OPERATION;
     284           0 :     if (iField == FindFieldIndex(GNM_SYSFIELD_BLOCKED, TRUE))
     285           0 :         return OGRERR_UNSUPPORTED_OPERATION;
     286           0 :     return m_poLayer->DeleteField(iField);
     287             : }
     288             : 
     289           0 : OGRErr GNMGenericLayer::ReorderFields(int *panMap)
     290             : {
     291           0 :     return m_poLayer->ReorderFields(panMap);
     292             : }
     293             : 
     294           0 : OGRErr GNMGenericLayer::AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn,
     295             :                                        int nFlagsIn)
     296             : {
     297           0 :     if (iField == FindFieldIndex(GNM_SYSFIELD_GFID, TRUE))
     298           0 :         return OGRERR_UNSUPPORTED_OPERATION;
     299           0 :     if (iField == FindFieldIndex(GNM_SYSFIELD_BLOCKED, TRUE))
     300           0 :         return OGRERR_UNSUPPORTED_OPERATION;
     301           0 :     return m_poLayer->AlterFieldDefn(iField, poNewFieldDefn, nFlagsIn);
     302             : }
     303             : 
     304           0 : OGRErr GNMGenericLayer::CreateGeomField(const OGRGeomFieldDefn *poField,
     305             :                                         int bApproxOK)
     306             : {
     307           0 :     return m_poLayer->CreateGeomField(poField, bApproxOK);
     308             : }
     309             : 
     310          21 : OGRErr GNMGenericLayer::SyncToDisk()
     311             : {
     312          21 :     return m_poLayer->SyncToDisk();
     313             : }
     314             : 
     315           0 : OGRStyleTable *GNMGenericLayer::GetStyleTable()
     316             : {
     317           0 :     return m_poLayer->GetStyleTable();
     318             : }
     319             : 
     320           0 : void GNMGenericLayer::SetStyleTableDirectly(OGRStyleTable *poStyleTable)
     321             : {
     322           0 :     return m_poLayer->SetStyleTableDirectly(poStyleTable);
     323             : }
     324             : 
     325           0 : void GNMGenericLayer::SetStyleTable(OGRStyleTable *poStyleTable)
     326             : {
     327           0 :     return m_poLayer->SetStyleTable(poStyleTable);
     328             : }
     329             : 
     330           0 : OGRErr GNMGenericLayer::StartTransaction()
     331             : {
     332           0 :     return m_poLayer->StartTransaction();
     333             : }
     334             : 
     335           0 : OGRErr GNMGenericLayer::CommitTransaction()
     336             : {
     337           0 :     return m_poLayer->CommitTransaction();
     338             : }
     339             : 
     340           0 : OGRErr GNMGenericLayer::RollbackTransaction()
     341             : {
     342           0 :     return m_poLayer->RollbackTransaction();
     343             : }
     344             : 
     345         394 : OGRFeatureDefn *GNMGenericLayer::GetLayerDefn()
     346             : {
     347             :     // TODO: hide GNM_SYSFIELD_GFID filed
     348         394 :     return m_poLayer->GetLayerDefn();
     349             : }

Generated by: LCOV version 1.14