LCOV - code coverage report
Current view: top level - gnm - gnmlayer.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 42 139 30.2 %
Date: 2025-02-18 14:19:29 Functions: 14 46 30.4 %

          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 :     : OGRLayer(), m_soLayerName(poLayer->GetName()), m_poLayer(poLayer),
      39          25 :       m_poNetwork(poNetwork)
      40             : {
      41          25 : }
      42             : 
      43             : /**
      44             :  * ~GNMGenericLayer
      45             :  */
      46          50 : GNMGenericLayer::~GNMGenericLayer()
      47             : {
      48          50 : }
      49             : 
      50           0 : const char *GNMGenericLayer::GetFIDColumn()
      51             : {
      52           0 :     return GNM_SYSFIELD_GFID;
      53             : }
      54             : 
      55           0 : const char *GNMGenericLayer::GetGeometryColumn()
      56             : {
      57           0 :     return m_poLayer->GetGeometryColumn();
      58             : }
      59             : 
      60           0 : OGRErr GNMGenericLayer::SetIgnoredFields(CSLConstList papszFields)
      61             : {
      62           0 :     return m_poLayer->SetIgnoredFields(papszFields);
      63             : }
      64             : 
      65           0 : OGRErr GNMGenericLayer::Intersection(OGRLayer *pLayerMethod,
      66             :                                      OGRLayer *pLayerResult,
      67             :                                      char **papszOptions,
      68             :                                      GDALProgressFunc pfnProgress,
      69             :                                      void *pProgressArg)
      70             : {
      71           0 :     return m_poLayer->Intersection(pLayerMethod, pLayerResult, papszOptions,
      72           0 :                                    pfnProgress, pProgressArg);
      73             : }
      74             : 
      75           0 : OGRErr GNMGenericLayer::Union(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
      76             :                               char **papszOptions, GDALProgressFunc pfnProgress,
      77             :                               void *pProgressArg)
      78             : {
      79           0 :     return m_poLayer->Union(pLayerMethod, pLayerResult, papszOptions,
      80           0 :                             pfnProgress, pProgressArg);
      81             : }
      82             : 
      83           0 : OGRErr GNMGenericLayer::SymDifference(OGRLayer *pLayerMethod,
      84             :                                       OGRLayer *pLayerResult,
      85             :                                       char **papszOptions,
      86             :                                       GDALProgressFunc pfnProgress,
      87             :                                       void *pProgressArg)
      88             : {
      89           0 :     return m_poLayer->Union(pLayerMethod, pLayerResult, papszOptions,
      90           0 :                             pfnProgress, pProgressArg);
      91             : }
      92             : 
      93           0 : OGRErr GNMGenericLayer::Identity(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
      94             :                                  char **papszOptions,
      95             :                                  GDALProgressFunc pfnProgress,
      96             :                                  void *pProgressArg)
      97             : {
      98           0 :     return m_poLayer->Union(pLayerMethod, pLayerResult, papszOptions,
      99           0 :                             pfnProgress, pProgressArg);
     100             : }
     101             : 
     102           0 : OGRErr GNMGenericLayer::Update(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     103             :                                char **papszOptions,
     104             :                                GDALProgressFunc pfnProgress, void *pProgressArg)
     105             : {
     106           0 :     return m_poLayer->Update(pLayerMethod, pLayerResult, papszOptions,
     107           0 :                              pfnProgress, pProgressArg);
     108             : }
     109             : 
     110           0 : OGRErr GNMGenericLayer::Clip(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     111             :                              char **papszOptions, GDALProgressFunc pfnProgress,
     112             :                              void *pProgressArg)
     113             : {
     114           0 :     return m_poLayer->Clip(pLayerMethod, pLayerResult, papszOptions,
     115           0 :                            pfnProgress, pProgressArg);
     116             : }
     117             : 
     118           0 : OGRErr GNMGenericLayer::Erase(OGRLayer *pLayerMethod, OGRLayer *pLayerResult,
     119             :                               char **papszOptions, GDALProgressFunc pfnProgress,
     120             :                               void *pProgressArg)
     121             : {
     122           0 :     return m_poLayer->Erase(pLayerMethod, pLayerResult, papszOptions,
     123           0 :                             pfnProgress, pProgressArg);
     124             : }
     125             : 
     126           0 : GIntBig GNMGenericLayer::GetFeaturesRead()
     127             : {
     128           0 :     return m_poLayer->GetFeaturesRead();
     129             : }
     130             : 
     131           0 : int GNMGenericLayer::AttributeFilterEvaluationNeedsGeometry()
     132             : {
     133           0 :     return m_poLayer->AttributeFilterEvaluationNeedsGeometry();
     134             : }
     135             : 
     136             : //! @cond Doxygen_Suppress
     137           0 : OGRErr GNMGenericLayer::InitializeIndexSupport(const char *pszVal)
     138             : {
     139           0 :     return m_poLayer->InitializeIndexSupport(pszVal);
     140             : }
     141             : 
     142           0 : OGRLayerAttrIndex *GNMGenericLayer::GetIndex()
     143             : {
     144           0 :     return m_poLayer->GetIndex();
     145             : }
     146             : 
     147           0 : OGRErr GNMGenericLayer::ISetFeature(OGRFeature *poFeature)
     148             : {
     149           0 :     VALIDATE_POINTER1(poFeature, "GNMGenericLayer::ISetFeature", CE_Failure);
     150             :     std::map<GNMGFID, GIntBig>::iterator it =
     151           0 :         m_mnFIDMap.find(poFeature->GetFID());
     152           0 :     if (it == m_mnFIDMap.end())
     153             :     {
     154           0 :         CPLError(CE_Failure, CPLE_IllegalArg,
     155             :                  "The FID " CPL_FRMT_GIB " is invalid", poFeature->GetFID());
     156           0 :         return OGRERR_NON_EXISTING_FEATURE;
     157             :     }
     158             : 
     159             :     // TODO: check connection rules if feature can be changed.
     160             : 
     161           0 :     poFeature->SetFID(it->second);
     162           0 :     return m_poLayer->SetFeature(poFeature);
     163             : }
     164             : 
     165         128 : OGRErr GNMGenericLayer::ICreateFeature(OGRFeature *poFeature)
     166             : {
     167         128 :     VALIDATE_POINTER1(poFeature, "GNMGenericLayer::ICreateFeature", CE_Failure);
     168         128 :     GNMGFID nFID = m_poNetwork->GetNewGlobalFID();
     169         128 :     poFeature->SetFID(nFID);
     170         128 :     poFeature->SetField(GNM_SYSFIELD_GFID, nFID);
     171         128 :     poFeature->SetField(GNM_SYSFIELD_BLOCKED, GNM_BLOCK_NONE);
     172         128 :     if (m_poNetwork->AddFeatureGlobalFID(nFID, GetName()) != CE_None)
     173           0 :         return OGRERR_FAILURE;
     174         128 :     return m_poLayer->CreateFeature(poFeature);
     175             : }
     176             : 
     177             : //! @endcond
     178             : 
     179           0 : OGRGeometry *GNMGenericLayer::GetSpatialFilter()
     180             : {
     181           0 :     return m_poLayer->GetSpatialFilter();
     182             : }
     183             : 
     184         716 : OGRErr GNMGenericLayer::ISetSpatialFilter(int iGeomField,
     185             :                                           const OGRGeometry *poGeometry)
     186             : {
     187         716 :     return m_poLayer->SetSpatialFilter(iGeomField, poGeometry);
     188             : }
     189             : 
     190         584 : OGRErr GNMGenericLayer::SetAttributeFilter(const char *pszFilter)
     191             : {
     192         584 :     return m_poLayer->SetAttributeFilter(pszFilter);
     193             : }
     194             : 
     195         426 : void GNMGenericLayer::ResetReading()
     196             : {
     197         426 :     m_poLayer->ResetReading();
     198         426 : }
     199             : 
     200        5313 : OGRFeature *GNMGenericLayer::GetNextFeature()
     201             : {
     202        5313 :     OGRFeature *pFeature = m_poLayer->GetNextFeature();
     203        5313 :     if (nullptr == pFeature)
     204           2 :         return nullptr;
     205        5311 :     GNMGFID nGFID = pFeature->GetFieldAsGNMGFID(GNM_SYSFIELD_GFID);
     206        5311 :     m_mnFIDMap[nGFID] = pFeature->GetFID();
     207        5311 :     pFeature->SetFID(nGFID);
     208        5311 :     return pFeature;
     209             : }
     210             : 
     211           0 : OGRErr GNMGenericLayer::SetNextByIndex(GIntBig nIndex)
     212             : {
     213           0 :     return m_poLayer->SetNextByIndex(nIndex);
     214             : }
     215             : 
     216           0 : OGRErr GNMGenericLayer::DeleteFeature(GIntBig nFID)
     217             : {
     218           0 :     OGRFeature *poFeature = GetFeature(nFID);
     219           0 :     if (nullptr == poFeature)
     220           0 :         return CE_Failure;
     221             : 
     222           0 :     nFID = poFeature->GetFID();
     223           0 :     std::map<GNMGFID, GIntBig>::iterator it = m_mnFIDMap.find(nFID);
     224           0 :     if (it == m_mnFIDMap.end())
     225             :     {
     226           0 :         CPLError(CE_Failure, CPLE_IllegalArg,
     227             :                  "The FID " CPL_FRMT_GIB " is invalid", nFID);
     228           0 :         return OGRERR_NON_EXISTING_FEATURE;
     229             :     }
     230             : 
     231           0 :     OGRFeature::DestroyFeature(poFeature);
     232             : 
     233             :     // delete from graph
     234           0 :     if (m_poNetwork->DisconnectFeaturesWithId((GNMGFID)nFID) != CE_None)
     235           0 :         return CE_Failure;
     236             : 
     237           0 :     return m_poLayer->DeleteFeature(it->second);
     238             : }
     239             : 
     240        1570 : const char *GNMGenericLayer::GetName()
     241             : {
     242        1570 :     return m_soLayerName;
     243             : }
     244             : 
     245           8 : OGRwkbGeometryType GNMGenericLayer::GetGeomType()
     246             : {
     247           8 :     return m_poLayer->GetGeomType();
     248             : }
     249             : 
     250           0 : int GNMGenericLayer::FindFieldIndex(const char *pszFieldName, int bExactMatch)
     251             : {
     252           0 :     return m_poLayer->FindFieldIndex(pszFieldName, bExactMatch);
     253             : }
     254             : 
     255           0 : OGRSpatialReference *GNMGenericLayer::GetSpatialRef()
     256             : {
     257           0 :     return m_poLayer->GetSpatialRef();
     258             : }
     259             : 
     260           0 : GIntBig GNMGenericLayer::GetFeatureCount(int bForce)
     261             : {
     262           0 :     return m_poLayer->GetFeatureCount(bForce);
     263             : }
     264             : 
     265           0 : OGRErr GNMGenericLayer::IGetExtent(int iGeomField, OGREnvelope *psExtent,
     266             :                                    bool bForce)
     267             : {
     268           0 :     return m_poLayer->GetExtent(iGeomField, psExtent, bForce);
     269             : }
     270             : 
     271          12 : int GNMGenericLayer::TestCapability(const char *pszCapability)
     272             : {
     273          12 :     return m_poLayer->TestCapability(pszCapability);
     274             : }
     275             : 
     276           8 : OGRErr GNMGenericLayer::CreateField(const OGRFieldDefn *poField, int bApproxOK)
     277             : {
     278           8 :     return m_poLayer->CreateField(poField, bApproxOK);
     279             : }
     280             : 
     281           0 : OGRErr GNMGenericLayer::DeleteField(int iField)
     282             : {
     283           0 :     if (iField == FindFieldIndex(GNM_SYSFIELD_GFID, TRUE))
     284           0 :         return OGRERR_UNSUPPORTED_OPERATION;
     285           0 :     if (iField == FindFieldIndex(GNM_SYSFIELD_BLOCKED, TRUE))
     286           0 :         return OGRERR_UNSUPPORTED_OPERATION;
     287           0 :     return m_poLayer->DeleteField(iField);
     288             : }
     289             : 
     290           0 : OGRErr GNMGenericLayer::ReorderFields(int *panMap)
     291             : {
     292           0 :     return m_poLayer->ReorderFields(panMap);
     293             : }
     294             : 
     295           0 : OGRErr GNMGenericLayer::AlterFieldDefn(int iField, OGRFieldDefn *poNewFieldDefn,
     296             :                                        int nFlagsIn)
     297             : {
     298           0 :     if (iField == FindFieldIndex(GNM_SYSFIELD_GFID, TRUE))
     299           0 :         return OGRERR_UNSUPPORTED_OPERATION;
     300           0 :     if (iField == FindFieldIndex(GNM_SYSFIELD_BLOCKED, TRUE))
     301           0 :         return OGRERR_UNSUPPORTED_OPERATION;
     302           0 :     return m_poLayer->AlterFieldDefn(iField, poNewFieldDefn, nFlagsIn);
     303             : }
     304             : 
     305           0 : OGRErr GNMGenericLayer::CreateGeomField(const OGRGeomFieldDefn *poField,
     306             :                                         int bApproxOK)
     307             : {
     308           0 :     return m_poLayer->CreateGeomField(poField, bApproxOK);
     309             : }
     310             : 
     311          21 : OGRErr GNMGenericLayer::SyncToDisk()
     312             : {
     313          21 :     return m_poLayer->SyncToDisk();
     314             : }
     315             : 
     316           0 : OGRStyleTable *GNMGenericLayer::GetStyleTable()
     317             : {
     318           0 :     return m_poLayer->GetStyleTable();
     319             : }
     320             : 
     321           0 : void GNMGenericLayer::SetStyleTableDirectly(OGRStyleTable *poStyleTable)
     322             : {
     323           0 :     return m_poLayer->SetStyleTableDirectly(poStyleTable);
     324             : }
     325             : 
     326           0 : void GNMGenericLayer::SetStyleTable(OGRStyleTable *poStyleTable)
     327             : {
     328           0 :     return m_poLayer->SetStyleTable(poStyleTable);
     329             : }
     330             : 
     331           0 : OGRErr GNMGenericLayer::StartTransaction()
     332             : {
     333           0 :     return m_poLayer->StartTransaction();
     334             : }
     335             : 
     336           0 : OGRErr GNMGenericLayer::CommitTransaction()
     337             : {
     338           0 :     return m_poLayer->CommitTransaction();
     339             : }
     340             : 
     341           0 : OGRErr GNMGenericLayer::RollbackTransaction()
     342             : {
     343           0 :     return m_poLayer->RollbackTransaction();
     344             : }
     345             : 
     346         394 : OGRFeatureDefn *GNMGenericLayer::GetLayerDefn()
     347             : {
     348             :     // TODO: hide GNM_SYSFIELD_GFID filed
     349         394 :     return m_poLayer->GetLayerDefn();
     350             : }

Generated by: LCOV version 1.14