geode-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jbarr...@apache.org
Subject [geode-native] branch develop updated: GEODE-4977: Make query results behave like standard containers (#288)
Date Fri, 04 May 2018 15:00:10 GMT
This is an automated email from the ASF dual-hosted git repository.

jbarrett pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-native.git


The following commit(s) were added to refs/heads/develop by this push:
     new bea1798   GEODE-4977: Make query results behave like standard containers (#288)
bea1798 is described below

commit bea179817c7e8c589b4f87845f8651c076ef2920
Author: Jacob Barrett <jbarrett@pivotal.io>
AuthorDate: Fri May 4 08:00:05 2018 -0700

     GEODE-4977: Make query results behave like standard containers (#288)
    
    * Adds begin/end to Struct.
    * Remove Java style hasNext/next methods.
    * Cleanup SelectResults::iterator.
    * Remove unused / untested methods.
    * Refactor for .NET Enumerable.
    * Removes SelectResultsIterator.
    * Workaround for Solaris for-range virtual method compiler bug.
    * Adds missing Serializable::create(std::basic_string<>)
    * Adds missing CacheableKey::create(std::basic_string<>)
    * Renames C++ Struct::length to size.
    * Renames .NET Struct::Length to Count.
---
 clicache/integration-test/ThinClientCqIRTestsN.cs  |   5 +-
 .../integration-test/ThinClientHARegionTestsN.cs   |   2 +-
 clicache/integration-test/ThinClientQueryTestsN.cs |  14 +--
 .../integration-test/ThinClientRegionQueryTests.cs |   2 +-
 .../ThinClientRemoteParamQueryStructSetTests.cs    |   2 +-
 .../ThinClientRemoteQueryExclusivenessTests.cs     |   4 +-
 .../ThinClientRemoteQueryFailoverTests.cs          |   2 +-
 .../ThinClientRemoteQueryStructSetTests.cs         |   2 +-
 .../ThinClientSecurityAuthzTestBaseN.cs            |   4 +-
 .../ThinClientStringArrayTestsN.cs                 |   5 +-
 clicache/src/ISelectResults.hpp                    |  22 +----
 clicache/src/ResultSet.cpp                         |  35 +------
 clicache/src/ResultSet.hpp                         |  31 ++----
 clicache/src/SelectResultsIterator.cpp             |  54 ++--------
 clicache/src/SelectResultsIterator.hpp             |  59 +++--------
 clicache/src/Struct.cpp                            |  35 +------
 clicache/src/Struct.hpp                            |  46 +++------
 clicache/src/StructSet.cpp                         |  42 ++------
 clicache/src/StructSet.hpp                         |  35 ++-----
 cppcache/CMakeLists.txt                            |   1 +
 cppcache/include/geode/CacheableString.hpp         |  42 ++++++++
 cppcache/include/geode/ResultSet.hpp               |  44 +--------
 cppcache/include/geode/SelectResults.hpp           |  31 +++---
 cppcache/include/geode/SelectResultsIterator.hpp   | 109 ---------------------
 cppcache/include/geode/Struct.hpp                  |  36 +++----
 cppcache/include/geode/StructSet.hpp               |  41 +-------
 cppcache/integration-test-2/CMakeLists.txt         |   4 +-
 cppcache/integration-test-2/StructTest.cpp         | 101 +++++++++++++++++++
 cppcache/integration-test-2/framework/Cluster.cpp  |   8 ++
 cppcache/integration-test/CMakeLists.txt           |   7 +-
 cppcache/integration-test/CacheHelper.cpp          |  12 +--
 cppcache/integration-test/CacheHelper.hpp          |  11 ++-
 cppcache/integration-test/QueryHelper.hpp          |  91 +++++++----------
 cppcache/integration-test/ThinClientDistOps2.hpp   |   2 +-
 cppcache/integration-test/ThinClientHelper.hpp     |  22 +++--
 cppcache/integration-test/ThinClientSecurity.hpp   |  16 +--
 .../testThinClientCacheableStringArray.cpp         |  33 +++----
 .../integration-test/testThinClientCqDurable.cpp   |  11 +--
 .../testThinClientCqHAFailover.cpp                 |  32 ++----
 cppcache/integration-test/testThinClientCqIR.cpp   |  74 +++++++-------
 .../testThinClientHAQueryFailover.cpp              |   1 -
 .../integration-test/testThinClientPdxEnum.cpp     |  22 ++---
 ...oolExecuteFunctionDisableChunkHandlerThread.cpp |   6 +-
 ...hinClientPoolExecuteFunctionThrowsException.cpp |   2 +-
 .../testThinClientPoolExecuteHAFunction.cpp        |   2 +-
 .../testThinClientPoolExecuteHAFunctionPrSHOP.cpp  |   2 +-
 .../testThinClientRegionQueryExclusiveness.cpp     |   2 +-
 .../testThinClientRemoteQueryFailover.cpp          |   1 -
 .../testThinClientRemoteQueryFailoverPdx.cpp       |   1 -
 .../testThinClientRemoteQueryRS.cpp                |   3 -
 .../testThinClientRemoteQuerySS.cpp                |   4 +-
 .../testThinClientSecurityAuthorizationMU.cpp      |  27 +++--
 cppcache/internal/CMakeLists.txt                   |  17 ++++
 cppcache/internal/hacks/range.h                    |  63 ++++++++++++
 cppcache/src/ResultSetImpl.cpp                     |  14 +--
 cppcache/src/ResultSetImpl.hpp                     |  38 +++----
 cppcache/src/SelectResultsIterator.cpp             |  61 ------------
 cppcache/src/Struct.cpp                            |  40 +++-----
 cppcache/src/StructSetImpl.cpp                     |  35 +++----
 cppcache/src/StructSetImpl.hpp                     |  49 ++++-----
 cppcache/src/ThinClientRegion.cpp                  |   1 -
 cppcache/test/CacheableKeyCreateTests.cpp          |  36 +++++++
 cppcache/test/StructSetTest.cpp                    |  28 ++++++
 tests/cli/NewFwkLib/CacheServer.cs                 |   4 +-
 tests/cli/NewFwkLib/QueryTest/QueryTests.cs        |   2 +-
 tests/cli/QueryHelper/QueryHelperN.cs              |   7 +-
 tests/cpp/fwklib/QueryHelper.hpp                   |   3 +-
 67 files changed, 648 insertions(+), 952 deletions(-)

diff --git a/clicache/integration-test/ThinClientCqIRTestsN.cs b/clicache/integration-test/ThinClientCqIRTestsN.cs
index b0bb6ad..10657cc 100644
--- a/clicache/integration-test/ThinClientCqIRTestsN.cs
+++ b/clicache/integration-test/ThinClientCqIRTestsN.cs
@@ -163,11 +163,8 @@ namespace Apache.Geode.Client.UnitTests
       Thread.Sleep(18000); // sleep 0.3min to allow server c query to complete
       Util.Log("Results size {0}.", results.Size);
 
-      SelectResultsIterator<object> iter = results.GetIterator();
-
-      while (iter.HasNext)
+      foreach (var item in results)
       {
-        object item = iter.Next();
         if (item != null)
         {
           Struct st = item as Struct;
diff --git a/clicache/integration-test/ThinClientHARegionTestsN.cs b/clicache/integration-test/ThinClientHARegionTestsN.cs
index 8f17929..2751e8c 100644
--- a/clicache/integration-test/ThinClientHARegionTestsN.cs
+++ b/clicache/integration-test/ThinClientHARegionTestsN.cs
@@ -687,7 +687,7 @@ namespace Apache.Geode.Client.UnitTests
           killRes = ksd.BeginInvoke(null, null);
         }
 
-        Int32 resultSize = results.Size;
+        var resultSize = results.Size;
 
         if (i % 100 == 0)
         {
diff --git a/clicache/integration-test/ThinClientQueryTestsN.cs b/clicache/integration-test/ThinClientQueryTestsN.cs
index 4c5eeb9..dff5311 100644
--- a/clicache/integration-test/ThinClientQueryTestsN.cs
+++ b/clicache/integration-test/ThinClientQueryTestsN.cs
@@ -138,7 +138,7 @@ namespace Apache.Geode.Client.UnitTests
 
       Query<object> qry = qs.NewQuery<object>("select distinct * from /" + QERegionName);
       ISelectResults<object> results = qry.Execute();
-      Int32 count = results.Size;
+      var count = results.Size;
       Assert.AreEqual(4, count, "Expected 4 as number of portfolio objects.");
 
       // Bring down the region
@@ -151,7 +151,7 @@ namespace Apache.Geode.Client.UnitTests
       Util.Log("Going to execute the query");
       Query<object> qry = qs.NewQuery<object>("select distinct * from /" + QERegionName);
       ISelectResults<object> results = qry.Execute();
-      Int32 count = results.Size;
+      var count = results.Size;
       Assert.AreEqual(4, count, "Expected 4 as number of portfolio objects.");
     }
 
@@ -644,7 +644,7 @@ namespace Apache.Geode.Client.UnitTests
         foreach (Struct si in ss)
         {
           rows++;
-          fields = (Int32)si.Length;
+          fields = (Int32)si.Count;
         }
 
         Util.Log("Query index {0} has {1} rows and {2} fields.", qryIdx, rows, fields);
@@ -736,7 +736,7 @@ namespace Apache.Geode.Client.UnitTests
         foreach (Struct si in ss)
         {
           rows++;
-          fields = (Int32)si.Length;
+          fields = (Int32)si.Count;
         }
 
         Util.Log("Query index {0} has {1} rows and {2} fields.", qryIdx, rows, fields);
@@ -933,7 +933,7 @@ namespace Apache.Geode.Client.UnitTests
           killRes = ksd.BeginInvoke(null, null);
         }
 
-        Int32 resultSize = results.Size;
+        var resultSize = results.Size;
 
         if (i % 100 == 0)
         {
@@ -972,7 +972,7 @@ namespace Apache.Geode.Client.UnitTests
           killRes = ksd.BeginInvoke(null, null);
         }
 
-        Int32 resultSize = results.Size;
+        var resultSize = results.Size;
 
         if (i % 100 == 0)
         {
@@ -1180,7 +1180,7 @@ namespace Apache.Geode.Client.UnitTests
 
         ISelectResults<object> results = region.Query<object>(qrystr.Query);
 
-        if (results.Size != QueryStatics.RegionQueryRowCounts[qryIdx])
+        if (results.Size != (ulong) QueryStatics.RegionQueryRowCounts[qryIdx])
         {
           ErrorOccurred = true;
           Util.Log("FAIL: Query # {0} expected result size is {1}, actual is {2}", qryIdx,
diff --git a/clicache/integration-test/ThinClientRegionQueryTests.cs b/clicache/integration-test/ThinClientRegionQueryTests.cs
index 2f1df77..e64d26e 100644
--- a/clicache/integration-test/ThinClientRegionQueryTests.cs
+++ b/clicache/integration-test/ThinClientRegionQueryTests.cs
@@ -182,7 +182,7 @@ namespace Apache.Geode.Client.UnitTests
 
         ISelectResults<object> results = region.Query<object>(qrystr.Query);
 
-        if (results.Size != QueryStatics.RegionQueryRowCounts[qryIdx])
+        if (results.Size != (ulong) QueryStatics.RegionQueryRowCounts[qryIdx])
         {
           ErrorOccurred = true;
           Util.Log("FAIL: Query # {0} expected result size is {1}, actual is {2}", qryIdx,
diff --git a/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs b/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs
index bb5de3e..4618d91 100644
--- a/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs
+++ b/clicache/integration-test/ThinClientRemoteParamQueryStructSetTests.cs
@@ -224,7 +224,7 @@ namespace Apache.Geode.Client.UnitTests
         foreach (Struct si in ss)
         {
           rows++;
-          fields = (Int32)si.Length;
+          fields = (Int32)si.Count;
         }
 
         Util.Log("Query index {0} has {1} rows and {2} fields.", qryIdx, rows, fields);
diff --git a/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs b/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs
index a22e77d..6476da2 100644
--- a/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryExclusivenessTests.cs
@@ -136,7 +136,7 @@ namespace Apache.Geode.Client.UnitTests
 
       Query<object> qry = qs.NewQuery<object>("select distinct * from /" + QERegionName);
       ISelectResults<object> results = qry.Execute();
-      Int32 count = results.Size;
+      var count = results.Size;
       Assert.AreEqual(4, count, "Expected 4 as number of portfolio objects.");
 
       // Bring down the region
@@ -149,7 +149,7 @@ namespace Apache.Geode.Client.UnitTests
       Util.Log("Going to execute the query");
       Query<object> qry = qs.NewQuery<object>("select distinct * from /" + QERegionName);
       ISelectResults<object> results = qry.Execute();
-      Int32 count = results.Size;
+      var count = results.Size;
       Assert.AreEqual(4, count, "Expected 4 as number of portfolio objects.");
     }
 
diff --git a/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs b/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs
index 61b2dd2..a40b069 100644
--- a/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryFailoverTests.cs
@@ -158,7 +158,7 @@ namespace Apache.Geode.Client.UnitTests
           killRes = ksd.BeginInvoke(null, null);
         }
 
-        Int32 resultSize = results.Size;
+        var resultSize = results.Size;
 
         if (i % 100 == 0)
         {
diff --git a/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs b/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs
index 9780e19..cc4237a 100644
--- a/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs
+++ b/clicache/integration-test/ThinClientRemoteQueryStructSetTests.cs
@@ -204,7 +204,7 @@ namespace Apache.Geode.Client.UnitTests
         foreach (Struct si in ss)
         {
           rows++;
-          fields = (Int32)si.Length;
+          fields = (Int32)si.Count;
         }
 
         Util.Log("Query index {0} has {1} rows and {2} fields.", qryIdx, rows, fields);
diff --git a/clicache/integration-test/ThinClientSecurityAuthzTestBaseN.cs b/clicache/integration-test/ThinClientSecurityAuthzTestBaseN.cs
index bee0da7..406ad50 100644
--- a/clicache/integration-test/ThinClientSecurityAuthzTestBaseN.cs
+++ b/clicache/integration-test/ThinClientSecurityAuthzTestBaseN.cs
@@ -318,8 +318,8 @@ namespace Apache.Geode.Client.UnitTests
               {
                 Assert.AreEqual(numOps, queryResults.Size);
               }
-              //CacheableHashSet querySet = new CacheableHashSet(queryResults.Size);
-              List<string> querySet = new List<string>(queryResults.Size);
+
+              var querySet = new List<string>((int) queryResults.Size);
               ResultSet<object> rs = queryResults as ResultSet<object>;
               foreach ( object result in  rs)
               {
diff --git a/clicache/integration-test/ThinClientStringArrayTestsN.cs b/clicache/integration-test/ThinClientStringArrayTestsN.cs
index 907c148..da45644 100644
--- a/clicache/integration-test/ThinClientStringArrayTestsN.cs
+++ b/clicache/integration-test/ThinClientStringArrayTestsN.cs
@@ -156,11 +156,8 @@ namespace Apache.Geode.Client.UnitTests
       ISelectResults<object> results = qry.Execute();
       Util.Log("Results size {0}.", results.Size);
 
-      SelectResultsIterator<object> iter = results.GetIterator();
-
-      while (iter.HasNext)
+      foreach (var item in results)
       {
-        /*IGeodeSerializable*/ object item = iter.Next();
         Portfolio port = item as Portfolio;
         if (port == null)
         {
diff --git a/clicache/src/ISelectResults.hpp b/clicache/src/ISelectResults.hpp
index d94c21f..7ba2010 100644
--- a/clicache/src/ISelectResults.hpp
+++ b/clicache/src/ISelectResults.hpp
@@ -43,38 +43,26 @@ namespace Apache
       /// </summary>
       generic<class TResult>
       public interface class ISelectResults
-        : public System::Collections::Generic::IEnumerable</*IGeodeSerializable^*/TResult>
+        : public System::Collections::Generic::IEnumerable<TResult>
       {
       public:
 
         /// <summary>
-        /// True if this <c>ISelectResults</c> is modifiable.
-        /// </summary>
-        property bool IsModifiable
-        {
-          bool get( );
-        }
-
-        /// <summary>
         /// The size of the <c>ISelectResults</c>.
         /// </summary>
-        property System::Int32 Size
+        property size_t Size
         {
-          System::Int32 get( );
+          size_t get( );
         }
 
         /// <summary>
         /// Get an object at the given index.
         /// </summary>
-        property /*Apache::Geode::Client::IGeodeSerializable^*/TResult GFINDEXER( size_t )
+        property TResult GFINDEXER( size_t )
         {
-          /*Apache::Geode::Client::IGeodeSerializable^*/TResult get( size_t index );
+          TResult get( size_t index );
         }
 
-        /// <summary>
-        /// Get an iterator for the result set.
-        /// </summary>
-        Apache::Geode::Client::SelectResultsIterator<TResult>^ GetIterator( );
       };
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/ResultSet.cpp b/clicache/src/ResultSet.cpp
index e91c9ad..ed66bae 100644
--- a/clicache/src/ResultSet.cpp
+++ b/clicache/src/ResultSet.cpp
@@ -32,20 +32,7 @@ namespace Apache
     {
 
       generic<class TResult>
-      bool ResultSet<TResult>::IsModifiable::get( )
-      {
-        try
-        {
-          return m_nativeptr->get()->isModifiable( );
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
-      }
-
-      generic<class TResult>
-      System::Int32 ResultSet<TResult>::Size::get( )
+      size_t ResultSet<TResult>::Size::get( )
       {
         try
         {
@@ -62,21 +49,7 @@ namespace Apache
       {
         try
         {
-          return (TypeRegistry::GetManagedValueGeneric<TResult>(m_nativeptr->get()->operator[](static_cast<System::Int32>(index))));
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
-      }
-
-      generic<class TResult>
-      SelectResultsIterator<TResult>^ ResultSet<TResult>::GetIterator()
-      {
-        try
-        {
-          return SelectResultsIterator<TResult>::Create(std::make_unique<apache::geode::client::SelectResultsIterator>(
-            m_nativeptr->get()->getIterator()));
+          return TypeRegistry::GetManagedValueGeneric<TResult>(m_nativeptr->get()->operator[](index));
         }
         finally
         {
@@ -87,13 +60,13 @@ namespace Apache
       generic<class TResult>
       System::Collections::Generic::IEnumerator<TResult>^ ResultSet<TResult>::GetEnumerator( )
       {
-        return GetIterator( );
+        return SelectResultsIterator<TResult>::Create(this);
       }
 
       generic<class TResult>
       System::Collections::IEnumerator^ ResultSet<TResult>::GetIEnumerator()
       {
-        return GetIterator();
+        return SelectResultsIterator<TResult>::Create(this);
       }
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/ResultSet.hpp b/clicache/src/ResultSet.hpp
index 1bda218..29989d3 100644
--- a/clicache/src/ResultSet.hpp
+++ b/clicache/src/ResultSet.hpp
@@ -53,44 +53,33 @@ namespace Apache
       public:
 
         /// <summary>
-        /// True if this <c>ResultSet</c> is modifiable.
-        /// </summary>
-        virtual property bool IsModifiable
-        {
-          virtual bool get();
-        }
-
-        /// <summary>
         /// The size of the <c>ResultSet</c>.
         /// </summary>
-        virtual property System::Int32 Size
+        virtual property size_t Size
         {
-          virtual System::Int32 get();
+          virtual size_t get();
         }
 
         /// <summary>
         /// Get an object at the given index.
         /// </summary>
-        virtual property /*IGeodeSerializable^*/TResult GFINDEXER(size_t)
+        virtual property TResult GFINDEXER(size_t)
         {
-          virtual /*IGeodeSerializable^*/TResult get(size_t index);
+          virtual TResult get(size_t index);
         }
 
         /// <summary>
-        /// Get an iterator for the result set.
-        /// </summary>
-        virtual SelectResultsIterator<TResult>^ GetIterator();
-
-        /// <summary>
         /// Returns an enumerator that iterates through the collection.
         /// </summary>
         /// <returns>
         /// A <c>System.Collections.Generic.IEnumerator</c> that
         /// can be used to iterate through the <c>ResultSet</c>.
         /// </returns>
-        virtual System::Collections::Generic::IEnumerator</*IGeodeSerializable^*/TResult>^
-          GetEnumerator();
+        virtual System::Collections::Generic::IEnumerator<TResult>^ GetEnumerator();
+
 
+        virtual System::Collections::IEnumerator^ GetIEnumerator()
+          = System::Collections::IEnumerable::GetEnumerator;
 
       internal:
 
@@ -111,9 +100,6 @@ namespace Apache
 
       private:
 
-        virtual System::Collections::IEnumerator^ GetIEnumerator() sealed
-          = System::Collections::IEnumerable::GetEnumerator;
-
         /// <summary>
         /// Private constructor to wrap a native object pointer
         /// </summary>
@@ -125,6 +111,7 @@ namespace Apache
 
         native_shared_ptr<native::ResultSet>^ m_nativeptr;
       };
+
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
diff --git a/clicache/src/SelectResultsIterator.cpp b/clicache/src/SelectResultsIterator.cpp
index 9db0f85..5149e6c 100644
--- a/clicache/src/SelectResultsIterator.cpp
+++ b/clicache/src/SelectResultsIterator.cpp
@@ -30,67 +30,27 @@ namespace Apache
       generic<class TResult>
       TResult SelectResultsIterator<TResult>::Current::get( )
       {
-        try
-        {
-          return TypeRegistry::GetManagedValueGeneric<TResult>(m_nativeptr->get()->current( ));
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
+        return m_results[m_index];
       }
 
       generic<class TResult>
-      bool SelectResultsIterator<TResult>::MoveNext( )
+      Object^ SelectResultsIterator<TResult>::Current2::get( )
       {
-        try
-        {
-          return m_nativeptr->get()->moveNext( );
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
+        return m_results[m_index];
       }
 
       generic<class TResult>
-      void SelectResultsIterator<TResult>::Reset( )
+      bool SelectResultsIterator<TResult>::MoveNext( )
       {
-        try
-        {
-          m_nativeptr->get()->reset( );
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
+         return ++m_index < m_results->Size;
       }
 
       generic<class TResult>
-      TResult SelectResultsIterator<TResult>::Next( )
+      void SelectResultsIterator<TResult>::Reset( )
       {
-        try
-        {
-          return TypeRegistry::GetManagedValueGeneric<TResult>(m_nativeptr->get()->next( ));
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
+        m_index = -1;
       }
 
-      generic<class TResult>
-      bool SelectResultsIterator<TResult>::HasNext::get()
-      {
-        try
-        {
-          return m_nativeptr->get()->hasNext();
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
-      }
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
diff --git a/clicache/src/SelectResultsIterator.hpp b/clicache/src/SelectResultsIterator.hpp
index b33e6b3..b4fd644 100644
--- a/clicache/src/SelectResultsIterator.hpp
+++ b/clicache/src/SelectResultsIterator.hpp
@@ -17,14 +17,7 @@
 
 #pragma once
 
-
-#include "geode_defs.hpp"
-#include "begin_native.hpp"
-#include <geode/SelectResultsIterator.hpp>
-#include "end_native.hpp"
-
-#include "native_unique_ptr.hpp"
-
+#include "ISelectResults.hpp"
 
 using namespace System;
 
@@ -34,8 +27,6 @@ namespace Apache
   {
     namespace Client
     {
-      namespace native = apache::geode::client;
-
       interface class IGeodeSerializable;
 
       /// <summary>
@@ -43,7 +34,7 @@ namespace Apache
       /// </summary>
       generic<class TResult>
       public ref class SelectResultsIterator sealed
-        : public System::Collections::Generic::IEnumerator</*Apache::Geode::Client::IGeodeSerializable^*/TResult>
+        : public System::Collections::Generic::IEnumerator<TResult>
       {
       public:
 
@@ -55,9 +46,14 @@ namespace Apache
         /// The element in the collection at the current position
         /// of the enumerator.
         /// </returns>
-        virtual property /*Apache::Geode::Client::IGeodeSerializable^*/TResult Current
+        property TResult Current
         {
-          virtual /*Apache::Geode::Client::IGeodeSerializable^*/TResult get( );
+          virtual TResult get( );
+        }
+
+        property Object^ Current2
+        {
+          virtual Object^ get( ) = System::Collections::IEnumerator::Current::get;
         }
 
         /// <summary>
@@ -76,19 +72,6 @@ namespace Apache
         /// </summary>
         virtual void Reset( );
 
-        /// <summary>
-        /// Get the current element and move to the next one.
-        /// </summary>
-        /*Apache::Geode::Client::IGeodeSerializable^*/TResult Next( );
-
-        /// <summary>
-        /// Check if there is a next element.
-        /// </summary>
-        property bool HasNext
-        {
-          bool get( );
-        }
-
         ~SelectResultsIterator() {};
 
       internal:
@@ -101,36 +84,26 @@ namespace Apache
         /// <returns>
         /// The managed wrapper object; null if the native pointer is null.
         /// </returns>
-        inline static Apache::Geode::Client::SelectResultsIterator<TResult>^ Create(
-          std::unique_ptr<native::SelectResultsIterator> nativeptr )
+        inline static SelectResultsIterator<TResult>^ Create(
+          ISelectResults<TResult>^ results )
         {
-          return ( nativeptr != nullptr ?
-            gcnew Apache::Geode::Client::SelectResultsIterator<TResult>( std::move(nativeptr) ) : nullptr );
+          return results == nullptr ? nullptr :
+            gcnew SelectResultsIterator<TResult>(results);
         }
 
 
       private:
 
-        virtual property Object^ ICurrent
-        {
-          virtual Object^ get( ) sealed
-            = System::Collections::IEnumerator::Current::get
-          {
-            return Current;
-          }
-        }
-
         /// <summary>
         /// Private constructor to wrap a native object pointer
         /// </summary>
         /// <param name="nativeptr">The native object pointer</param>
-        inline SelectResultsIterator(
-        std::unique_ptr<native::SelectResultsIterator> nativeptr )
+        inline SelectResultsIterator(ISelectResults<TResult>^ results) : m_results(results)
         {
-          m_nativeptr = gcnew native_unique_ptr<native::SelectResultsIterator>(std::move(nativeptr));
         }
 
-        native_unique_ptr<native::SelectResultsIterator>^ m_nativeptr;
+        ISelectResults<TResult>^ m_results;
+        int m_index = -1;
       };
     }  // namespace Client
   }  // namespace Geode
diff --git a/clicache/src/Struct.cpp b/clicache/src/Struct.cpp
index 4339412..018191a 100644
--- a/clicache/src/Struct.cpp
+++ b/clicache/src/Struct.cpp
@@ -36,12 +36,12 @@ namespace Apache
     {
       namespace native = apache::geode::client;
 
-      Object^ Struct::default::get(size_t index)
+      Object^ Struct::default::get(int32_t index)
       {
         try
         {
           return (TypeRegistry::GetManagedValueGeneric<Object^>(
-            static_cast<native::Struct*>(m_nativeptr->get())->operator[](static_cast<System::Int32>(index))));
+            static_cast<native::Struct*>(m_nativeptr->get())->operator[](index)));
         }
         finally
         {
@@ -66,7 +66,7 @@ namespace Apache
       {
         try
         {
-          return StructSet</*TResult*/Object^>::Create(
+          return StructSet<Object^>::Create(
             static_cast<native::Struct*>(m_nativeptr->get())->getStructSet());
         }
         finally
@@ -76,36 +76,11 @@ namespace Apache
       }
 
 
-      bool Struct/*<TResult>*/::HasNext()
+      int32_t Struct::Count::get()
       {
         try
         {
-          return static_cast<native::Struct*>(m_nativeptr->get())->hasNext();
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
-      }
-
-      size_t Struct/*<TResult>*/::Length::get()
-      {
-        try
-        {
-          return static_cast<native::Struct*>(m_nativeptr->get())->length();
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
-      }
-
-      Object^ Struct/*<TResult>*/::Next()
-      {
-        try
-        {
-          return (TypeRegistry::GetManagedValueGeneric<Object^>(
-            static_cast<native::Struct*>(m_nativeptr->get())->next()));
+          return static_cast<native::Struct*>(m_nativeptr->get())->size();
         }
         finally
         {
diff --git a/clicache/src/Struct.hpp b/clicache/src/Struct.hpp
index 4c016ef..a6932e9 100644
--- a/clicache/src/Struct.hpp
+++ b/clicache/src/Struct.hpp
@@ -46,7 +46,6 @@ namespace Apache
       /// returned after executing a Query obtained from a QueryService which in turn
       /// is obtained from a Cache.
       /// </remarks>
-      //generic<class TResult>
       public ref class Struct sealed
         : public Apache::Geode::Client::Serializable
       {
@@ -58,9 +57,9 @@ namespace Apache
         /// <returns>
         /// The value of the field or null if index is out of bounds.
         /// </returns>
-        property /*Apache::Geode::Client::IGeodeSerializable^*//*TResult*/ Object^ GFINDEXER( size_t )
+        property Object^ GFINDEXER( int32_t )
         {
-          /*Apache::Geode::Client::IGeodeSerializable^*/ /*TResult*/ Object^ get( size_t index );
+          Object^ get( int32_t index );
         }
 
         /// <summary>
@@ -70,9 +69,9 @@ namespace Apache
         /// <exception cref="IllegalArgumentException">
         /// if the field name is not found.
         /// </exception>
-        property /*Apache::Geode::Client::IGeodeSerializable^*//*TResult*/Object^ GFINDEXER( String^ )
+        property Object^ GFINDEXER( String^ )
         {
-          /*Apache::Geode::Client::IGeodeSerializable^*//*TResult*/Object^ get( String^ fieldName );
+          Object^ get( String^ fieldName );
         }
 
         /// <summary>
@@ -81,37 +80,20 @@ namespace Apache
         /// <returns>
         /// A reference to the parent <c>StructSet</c> of this <c>Struct</c>.
         /// </returns>
-        property Apache::Geode::Client::StructSet</*TResult*/Object^>^ Set
+        property Apache::Geode::Client::StructSet<Object^>^ Set
         {
-          Apache::Geode::Client::StructSet</*TResult*/Object^>^ get( );
+          Apache::Geode::Client::StructSet<Object^>^ get( );
         }
 
         /// <summary>
-        /// Check whether another field value is available to iterate over
-        /// in this <c>Struct</c>.
-        /// </summary>
-        /// <returns>true if available otherwise false.</returns>
-        bool HasNext( );
-
-        /// <summary>
         /// Get the number of field values available.
         /// </summary>
         /// <returns>the number of field values available.</returns>
-        property size_t Length
+        property int32_t Count
         {
-          size_t get( );
+          int32_t get( );
         }
 
-        /// <summary>
-        /// Get the next field value item available in this <c>Struct</c>.
-        /// </summary>
-        /// <returns>
-        /// A reference to the next item in the <c>Struct</c>
-        /// or null if no more available.
-        /// </returns>
-        /*Apache::Geode::Client::IGeodeSerializable^*//*TResult*/Object^ Next( );
-
-
       private:
 
         /// <summary>
@@ -129,21 +111,19 @@ namespace Apache
         /// <summary>
         /// Factory function to register wrapper
         /// </summary>
-        inline static Apache::Geode::Client::IGeodeSerializable^ /*Struct^*/ /*<TResult>*/ Create( ::std::shared_ptr<apache::geode::client::Serializable> obj )
+        inline static Apache::Geode::Client::IGeodeSerializable^ Create( ::std::shared_ptr<apache::geode::client::Serializable> obj )
         {
           return ( obj != nullptr ?
-            gcnew Apache::Geode::Client::Struct/*<TResult>*/( obj ) : nullptr );
-          /*return ( obj != nullptr ?
-            gcnew Struct( obj ) : nullptr );*/
+            gcnew Apache::Geode::Client::Struct( obj ) : nullptr );
         }
 
         inline static Apache::Geode::Client::IGeodeSerializable^ CreateDeserializable( )
         {
-          return gcnew Apache::Geode::Client::Struct/*<TResult>*/(  ) ;
-          //return gcnew Struct(  ) ;
+          return gcnew Apache::Geode::Client::Struct(  ) ;
         }
       };
+
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
- //namespace 
+
diff --git a/clicache/src/StructSet.cpp b/clicache/src/StructSet.cpp
index 769e3e5..185b36b 100644
--- a/clicache/src/StructSet.cpp
+++ b/clicache/src/StructSet.cpp
@@ -32,24 +32,11 @@ namespace Apache
     {
 
       generic<class TResult>
-      bool StructSet<TResult>::IsModifiable::get( )
+      size_t StructSet<TResult>::Size::get( )
       {
         try
         {
-          return m_nativeptr->get()->isModifiable( );
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
-      }
-
-      generic<class TResult>
-      System::Int32 StructSet<TResult>::Size::get( )
-      {
-        try
-        {
-          return static_cast<int>(m_nativeptr->get()->size( ));
+          return m_nativeptr->get()->size( );
         }
         finally
         {
@@ -62,20 +49,7 @@ namespace Apache
       {
         try
         {
-          return TypeRegistry::GetManagedValueGeneric<TResult>((m_nativeptr->get()->operator[](static_cast<System::Int32>(index))));
-        }
-        finally
-        {
-          GC::KeepAlive(m_nativeptr);
-        }
-      }
-
-      generic<class TResult>
-      SelectResultsIterator<TResult>^ StructSet<TResult>::GetIterator( )
-      {
-        try
-        {
-          return SelectResultsIterator<TResult>::Create(std::make_unique<apache::geode::client::SelectResultsIterator>(m_nativeptr->get()->getIterator()));
+          return TypeRegistry::GetManagedValueGeneric<TResult>(m_nativeptr->get()->operator[](index));
         }
         finally
         {
@@ -86,17 +60,17 @@ namespace Apache
       generic<class TResult>
       System::Collections::Generic::IEnumerator<TResult>^ StructSet<TResult>::GetEnumerator( )
       {
-        return GetIterator( );
+        return SelectResultsIterator<TResult>::Create(this);
       }
 
       generic<class TResult>
       System::Collections::IEnumerator^ StructSet<TResult>::GetIEnumerator( )
       {
-        return GetIterator( );
+        return SelectResultsIterator<TResult>::Create(this);
       }
 
       generic<class TResult>
-      size_t StructSet<TResult>::GetFieldIndex( String^ fieldName )
+      int32_t StructSet<TResult>::GetFieldIndex( String^ fieldName )
       {
         _GF_MG_EXCEPTION_TRY2/* due to auto replace */
 
@@ -113,11 +87,11 @@ namespace Apache
       }
 
       generic<class TResult>
-      String^ StructSet<TResult>::GetFieldName(size_t index)
+      String^ StructSet<TResult>::GetFieldName(int32_t index)
       {
         try
         {
-          return marshal_as<String^>(m_nativeptr->get()->getFieldName(static_cast<System::Int32> (index)));
+          return marshal_as<String^>(m_nativeptr->get()->getFieldName(index));
         }
         finally
         {
diff --git a/clicache/src/StructSet.hpp b/clicache/src/StructSet.hpp
index cbc586a..4fa1126 100644
--- a/clicache/src/StructSet.hpp
+++ b/clicache/src/StructSet.hpp
@@ -52,23 +52,14 @@ namespace Apache
       public:
 
         /// <summary>
-        /// True if this <c>StructSet</c> is modifiable.
-        /// </summary>
-        /// <returns>returns false always at this time.</returns>
-        virtual property bool IsModifiable
-        {
-          virtual bool get( );
-        }
-
-        /// <summary>
         /// The size of the <c>StructSet</c>.
         /// </summary>
         /// <returns>
         /// the number of items in the <c>StructSet</c>.
         /// </returns>
-        virtual property System::Int32 Size
+        virtual property size_t Size
         {
-          virtual System::Int32 get( );
+          virtual size_t get( );
         }
 
         /// <summary>
@@ -78,21 +69,12 @@ namespace Apache
         /// if the index is out of bounds.
         /// </exception>
         /// <returns>Item at the given index.</returns>
-        virtual property /*Apache::Geode::Client::IGeodeSerializable^*/TResult GFINDEXER( size_t )
+        virtual property TResult GFINDEXER( size_t )
         {
-          virtual /*Apache::Geode::Client::IGeodeSerializable^*/TResult get( size_t index );
+          virtual TResult get( size_t index );
         }
 
         /// <summary>
-        /// Get a <c>SelectResultsIterator</c> with which to iterate
-        /// over the items in the <c>StructSet</c>.
-        /// </summary>
-        /// <returns>
-        /// The <c>SelectResultsIterator</c> with which to iterate.
-        /// </returns>
-        virtual SelectResultsIterator<TResult>^ GetIterator( );
-
-        /// <summary>
         /// Get the index number of the specified field name
         /// in the <c>StructSet</c>.
         /// </summary>
@@ -103,7 +85,7 @@ namespace Apache
         /// <exception cref="IllegalArgumentException">
         /// if the field name is not found.
         /// </exception>
-        size_t GetFieldIndex( String^ fieldName );
+        int32_t GetFieldIndex( String^ fieldName );
 
         /// <summary>
         /// Get the field name of the <c>StructSet</c> from the
@@ -115,7 +97,7 @@ namespace Apache
         /// <returns>
         /// the field name from the specified index number or null if not found.
         /// </returns>
-        String^ GetFieldName( size_t index );
+        String^ GetFieldName( int32_t index );
 
 
         // Region: IEnumerable<IGeodeSerializable^> Members
@@ -127,7 +109,7 @@ namespace Apache
         /// A <c>System.Collections.Generic.IEnumerator</c> that
         /// can be used to iterate through the <c>StructSet</c>.
         /// </returns>
-        virtual System::Collections::Generic::IEnumerator</*Apache::Geode::Client::IGeodeSerializable^*/TResult>^
+        virtual System::Collections::Generic::IEnumerator<TResult>^
           GetEnumerator( );
 
         // End Region: IEnumerable<IGeodeSerializable^> Members
@@ -166,7 +148,8 @@ namespace Apache
 
         native_shared_ptr<native::StructSet>^ m_nativeptr; 
       };
+
     }  // namespace Client
   }  // namespace Geode
 }  // namespace Apache
- //namespace 
+
diff --git a/cppcache/CMakeLists.txt b/cppcache/CMakeLists.txt
index 67e11d3..d814aa3 100644
--- a/cppcache/CMakeLists.txt
+++ b/cppcache/CMakeLists.txt
@@ -115,5 +115,6 @@ install(FILES
 add_subdirectory(shared)
 add_subdirectory(static)
 add_subdirectory(test)
+add_subdirectory(internal)
 add_subdirectory(integration-test)
 add_subdirectory(integration-test-2)
diff --git a/cppcache/include/geode/CacheableString.hpp b/cppcache/include/geode/CacheableString.hpp
index 3e4b508..8caa0be 100644
--- a/cppcache/include/geode/CacheableString.hpp
+++ b/cppcache/include/geode/CacheableString.hpp
@@ -167,6 +167,48 @@ class APACHE_GEODE_EXPORT CacheableString : public CacheableKey {
 };
 
 template <>
+inline std::shared_ptr<CacheableKey> CacheableKey::create(std::string value) {
+  return CacheableString::create(value);
+}
+
+template <>
+inline std::shared_ptr<CacheableKey> CacheableKey::create(
+    std::u16string value) {
+  return CacheableString::create(value);
+}
+
+template <>
+inline std::shared_ptr<CacheableKey> CacheableKey::create(
+    std::u32string value) {
+  return CacheableString::create(value);
+}
+
+template <>
+inline std::shared_ptr<CacheableKey> CacheableKey::create(std::wstring value) {
+  return CacheableString::create(value);
+}
+
+template <>
+inline std::shared_ptr<Cacheable> Serializable::create(std::string value) {
+  return CacheableString::create(value);
+}
+
+template <>
+inline std::shared_ptr<Cacheable> Serializable::create(std::u16string value) {
+  return CacheableString::create(value);
+}
+
+template <>
+inline std::shared_ptr<Cacheable> Serializable::create(std::u32string value) {
+  return CacheableString::create(value);
+}
+
+template <>
+inline std::shared_ptr<Cacheable> Serializable::create(std::wstring value) {
+  return CacheableString::create(value);
+}
+
+template <>
 inline std::shared_ptr<CacheableKey> CacheableKey::create(const char* value) {
   return CacheableString::create(value);
 }
diff --git a/cppcache/include/geode/ResultSet.hpp b/cppcache/include/geode/ResultSet.hpp
index 47f3644..a43661d 100644
--- a/cppcache/include/geode/ResultSet.hpp
+++ b/cppcache/include/geode/ResultSet.hpp
@@ -21,13 +21,7 @@
 #define GEODE_RESULTSET_H_
 
 #include "internal/geode_globals.hpp"
-#include "ExceptionTypes.hpp"
 #include "SelectResults.hpp"
-#include "SelectResultsIterator.hpp"
-
-/**
- * @file
- */
 
 namespace apache {
 namespace geode {
@@ -40,43 +34,9 @@ namespace client {
  */
 class APACHE_GEODE_EXPORT ResultSet : public SelectResults {
  public:
-  /**
-   * Check whether the ResultSet is modifiable.
-   *
-   * @returns false always at this time.
-   */
-  virtual bool isModifiable() const override = 0;
-
-  /**
-   * Get the size of the ResultSet.
-   *
-   * @returns the number of items in the ResultSet.
-   */
-  virtual size_t size() const override = 0;
-
-  /**
-   * Index operator to directly access an item in the ResultSet.
-   *
-   * @param index the index number of the required item.
-   * @throws IllegalArgumentException if the index is out of bounds.
-   * @returns A smart pointer to the item indexed.
-   */
-  virtual const std::shared_ptr<Serializable> operator[](
-      size_t index) const override = 0;
-
-  /**
-   * Get a SelectResultsIterator with which to iterate over the items in the
-   * ResultSet.
-   *
-   * @returns The SelectResultsIterator with which to iterate.
-   */
-  virtual SelectResultsIterator getIterator() override = 0;
-
-  /**
-   * Destructor
-   */
-  ~ResultSet() override = default;
+  ~ResultSet() noexcept override = default;
 };
+
 }  // namespace client
 }  // namespace geode
 }  // namespace apache
diff --git a/cppcache/include/geode/SelectResults.hpp b/cppcache/include/geode/SelectResults.hpp
index 7dbec5b..0d5a540 100644
--- a/cppcache/include/geode/SelectResults.hpp
+++ b/cppcache/include/geode/SelectResults.hpp
@@ -43,14 +43,7 @@ class SelectResultsIterator;
  */
 class APACHE_GEODE_EXPORT SelectResults {
  public:
-  virtual ~SelectResults() = default;
-
-  /**
-   * Check whether the SelectResults is modifiable.
-   *
-   * @returns false always at this time.
-   */
-  virtual bool isModifiable() const = 0;
+  virtual ~SelectResults() noexcept = default;
 
   /**
    * Get the size of the SelectResults.
@@ -70,21 +63,19 @@ class APACHE_GEODE_EXPORT SelectResults {
       size_t index) const = 0;
 
   /**
-   * Get a SelectResultsIterator with which to iterate over the items in the
-   * SelectResults.
-   *
-   * @returns The SelectResultsIterator with which to iterate.
+   * Interface of an iterator for <code>SelectResults</code>.
    */
-  virtual SelectResultsIterator getIterator() = 0;
+  typedef std::vector<std::shared_ptr<Cacheable>>::iterator iterator;
 
-  /** Interface of an iterator for <code>SelectResults</code>.*/
-  typedef CacheableVector::iterator Iterator;
-
-  /** Get an iterator pointing to the start of vector. */
-  virtual Iterator begin() const = 0;
+  /**
+   * Get an iterator pointing to the start of <code>SelectResults</code>.
+   */
+  virtual iterator begin() = 0;
 
-  /** Get an iterator pointing to the end of vector. */
-  virtual Iterator end() const = 0;
+  /**
+   * Get an iterator pointing to the end of <code>SelectResults</code>.
+   */
+  virtual iterator end() = 0;
 };
 }  // namespace client
 }  // namespace geode
diff --git a/cppcache/include/geode/SelectResultsIterator.hpp b/cppcache/include/geode/SelectResultsIterator.hpp
deleted file mode 100644
index df65556..0000000
--- a/cppcache/include/geode/SelectResultsIterator.hpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#ifndef GEODE_SELECTRESULTSITERATOR_H_
-#define GEODE_SELECTRESULTSITERATOR_H_
-
-/**
- * @file
- */
-
-
-#include <memory>
-
-#include "CacheableBuiltins.hpp"
-#include "ExceptionTypes.hpp"
-#include "SelectResults.hpp"
-#include "Serializable.hpp"
-#include "internal/geode_base.hpp"
-#include "internal/geode_globals.hpp"
-
-namespace apache {
-namespace geode {
-namespace client {
-
-class ResultSetImpl;
-class StructSetImpl;
-class CacheableVector;
-class SelectResults;
-class Serializable;
-
-/**
- * @class SelectResultsIterator SelectResultsIterator.hpp
- * A SelectResultsIterator is obtained from a ResultSet or StructSet and
- * is used to iterate over the items available in them.
- */
-class APACHE_GEODE_EXPORT SelectResultsIterator {
- public:
-  /**
-   * Check whether the SelectResultsIterator has another item to get.
-   *
-   * @returns true if another item is available otherwise false.
-   */
-  bool hasNext() const;
-
-  /**
-   * Get the next item from the SelectResultsIterator.
-   *
-   * @returns a smart pointer to the next item from the iterator or nullptr if
-   * no further items are available.
-   */
-  const std::shared_ptr<Serializable> next();
-
-  /**
-   * Move the iterator to point to the next item to get.
-   *
-   * @returns true if another item was available to move to otherwise false.
-   */
-  bool moveNext();
-
-  /**
-   * Get the current item pointed to by the SelectResultsIterator.
-   *
-   * @returns A smart pointer to the current item pointed to by the
-   * SelectResultsIterator.
-   */
-  const std::shared_ptr<Serializable> current() const;
-
-  /**
-   * Reset the SelectResultsIterator to point to the start of the items.
-   */
-  void reset();
-
- private:
-  /**
-   * Constructor - meant only for internal use.
-   */
-  SelectResultsIterator(const std::shared_ptr<CacheableVector>& vectorSR,
-                        std::shared_ptr<SelectResults> srp);
-
-  std::shared_ptr<CacheableVector> m_vectorSR;
-  size_t m_nextIndex;
-  // this is to ensure that a reference of SelectResults is kept alive
-  // if an iterator object is present
-  std::shared_ptr<SelectResults> m_srp;
-
-  friend class ResultSetImpl;
-  friend class StructSetImpl;
-};
-}  // namespace client
-}  // namespace geode
-}  // namespace apache
-
-#endif  // GEODE_SELECTRESULTSITERATOR_H_
diff --git a/cppcache/include/geode/Struct.hpp b/cppcache/include/geode/Struct.hpp
index 30ed55a..8a3c4b3 100644
--- a/cppcache/include/geode/Struct.hpp
+++ b/cppcache/include/geode/Struct.hpp
@@ -47,12 +47,16 @@ class StructSet;
  */
 class APACHE_GEODE_EXPORT Struct : public Serializable {
  public:
+  typedef std::vector<std::shared_ptr<Serializable>>::iterator iterator;
+
   /**
    * Constructor - meant only for internal use.
    */
   Struct(StructSet* ssPtr,
          std::vector<std::shared_ptr<Serializable>>& fieldValues);
 
+  ~Struct() = default;
+
   /**
    * Factory function for registration of <code>Struct</code>.
    */
@@ -84,28 +88,16 @@ class APACHE_GEODE_EXPORT Struct : public Serializable {
    */
   const std::shared_ptr<StructSet> getStructSet() const;
 
-  /**
-   * Check whether another field value is available to iterate over in this
-   * Struct.
-   *
-   * @returns true if available otherwise false.
-   */
-  bool hasNext() const;
+  iterator begin();
+
+  iterator end();
 
   /**
    * Get the number of field values available.
    *
    * @returns the number of field values available.
    */
-  int32_t length() const;
-
-  /**
-   * Get the next field value item available in this Struct.
-   *
-   * @returns A smart pointer to the next item in the Struct or nullptr if no
-   * more available.
-   */
-  const std::shared_ptr<Serializable> next();
+  int32_t size() const;
 
   /**
    * Deserializes the Struct object from the DataInput. @TODO KN: better comment
@@ -148,17 +140,15 @@ class APACHE_GEODE_EXPORT Struct : public Serializable {
   }
 
  private:
+  Struct() = default;
+
   void skipClassName(DataInput& input);
 
-  Struct();
+  typedef std::unordered_map<std::string, int32_t> FieldNameToIndexMap;
 
-  typedef std::unordered_map<std::string, int32_t> FieldNames;
-  FieldNames m_fieldNames;
+  StructSet* m_parent = nullptr;
   std::vector<std::shared_ptr<Serializable>> m_fieldValues;
-
-  StructSet* m_parent;
-
-  size_t m_lastAccessIndex;
+  FieldNameToIndexMap m_fieldNameToIndex;
 
   _GEODE_FRIEND_STD_SHARED_PTR(Struct)
 };
diff --git a/cppcache/include/geode/StructSet.hpp b/cppcache/include/geode/StructSet.hpp
index 5ba8958..300bba1 100644
--- a/cppcache/include/geode/StructSet.hpp
+++ b/cppcache/include/geode/StructSet.hpp
@@ -23,7 +23,6 @@
 #include "internal/geode_globals.hpp"
 #include "CqResults.hpp"
 #include "Struct.hpp"
-#include "SelectResultsIterator.hpp"
 
 /**
  * @file
@@ -42,29 +41,7 @@ namespace client {
  */
 class APACHE_GEODE_EXPORT StructSet : public CqResults {
  public:
-  /**
-   * Check whether the StructSet is modifiable.
-   *
-   * @returns false always at this time.
-   */
-  virtual bool isModifiable() const = 0;
-
-  /**
-   * Get the size of the StructSet.
-   *
-   * @returns the number of items in the StructSet.
-   */
-  virtual size_t size() const = 0;
-
-  /**
-   * Index operator to directly access an item in the StructSet.
-   *
-   * @param index the index number of the item to get.
-   * @throws IllegalArgumentException if the index is out of bounds.
-   * @returns A smart pointer to the item indexed.
-   */
-  virtual const std::shared_ptr<Serializable> operator[](
-      size_t index) const = 0;
+  ~StructSet() noexcept override = default;
 
   /**
    * Get the index number of the specified field name in the StructSet.
@@ -73,7 +50,7 @@ class APACHE_GEODE_EXPORT StructSet : public CqResults {
    * @returns the index number of the specified field name.
    * @throws std::invalid_argument if the field name is not found.
    */
-  virtual size_t getFieldIndex(const std::string& fieldname) = 0;
+  virtual int32_t getFieldIndex(const std::string& fieldname) = 0;
 
   /**
    * Get the field name of the StructSet from the specified index number.
@@ -84,20 +61,8 @@ class APACHE_GEODE_EXPORT StructSet : public CqResults {
    * @throws std::out_of_range if index is not found
    */
   virtual const std::string& getFieldName(int32_t index) = 0;
-
-  /**
-   * Get a SelectResultsIterator with which to iterate over the items in the
-   * StructSet.
-   *
-   * @returns The SelectResultsIterator with which to iterate.
-   */
-  virtual SelectResultsIterator getIterator() = 0;
-
-  /**
-   * Destructor
-   */
-  virtual ~StructSet() = default;
 };
+
 }  // namespace client
 }  // namespace geode
 }  // namespace apache
diff --git a/cppcache/integration-test-2/CMakeLists.txt b/cppcache/integration-test-2/CMakeLists.txt
index 8c5ea16..93cd76e 100644
--- a/cppcache/integration-test-2/CMakeLists.txt
+++ b/cppcache/integration-test-2/CMakeLists.txt
@@ -27,7 +27,7 @@ add_executable(integration-test-2
   framework/GfshExecute.h
   RegionPutGetAllTest.cpp
   PdxInstanceTest.cpp
-  )
+  StructTest.cpp)
 
 target_compile_definitions(integration-test-2
   PUBLIC
@@ -49,8 +49,10 @@ target_link_libraries(integration-test-2
     Boost::boost
     Boost::system
     Boost::log
+    Boost::filesystem
   PRIVATE
     _WarningsAsError
+    internal
 )
 
 if(WIN32)
diff --git a/cppcache/integration-test-2/StructTest.cpp b/cppcache/integration-test-2/StructTest.cpp
new file mode 100644
index 0000000..35a5f64
--- /dev/null
+++ b/cppcache/integration-test-2/StructTest.cpp
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <iostream>
+#include <unordered_map>
+
+#include <gtest/gtest.h>
+
+#include <geode/Cache.hpp>
+#include <geode/PoolManager.hpp>
+#include <geode/RegionFactory.hpp>
+#include <geode/RegionShortcut.hpp>
+#include <geode/Struct.hpp>
+#include <geode/QueryService.hpp>
+
+#include <hacks/range.h>
+
+#include "framework/Framework.h"
+#include "framework/Gfsh.h"
+#include "framework/Cluster.h"
+
+namespace {
+
+using namespace apache::geode::client;
+
+std::shared_ptr<Region> setupRegion(Cache& cache) {
+  auto region = cache.createRegionFactory(RegionShortcut::PROXY)
+                    .setPoolName("default")
+                    .create("region");
+
+  return region;
+}
+
+/**
+ * Example test using 2 servers and waiting for async tasks to synchronize using
+ * furtures.
+ */
+TEST(StructTest, queryResultForRange) {
+  Cluster cluster{LocatorCount{1}, ServerCount{1}};
+  cluster.getGfsh()
+      .create()
+      .region()
+      .withName("region")
+      .withType("REPLICATE")
+      .execute();
+
+  auto cache = cluster.createCache();
+  auto region = setupRegion(cache);
+
+  std::unordered_map<int, std::string> values = {
+      {1, "one"}, {2, "two"}, {3, "three"}};
+
+
+  for (auto&& value : values) {
+    region->put(value.first, value.second);
+  }
+
+  auto&& queryResult =
+      cache.getQueryService()
+          ->newQuery("SELECT e.key, e.value FROM /region.entries e")
+          ->execute();
+  EXPECT_EQ(3, queryResult->size());
+
+  for (auto&& row : hacks::range(*queryResult)) {
+    auto rowStruct = std::dynamic_pointer_cast<Struct>(row);
+    ASSERT_NE(nullptr, rowStruct);
+    EXPECT_EQ(2, rowStruct->size());
+
+    auto key = -1;
+    for (auto&& column : *rowStruct) {
+      // Expect to read: key:int, value:string
+      if (auto columnValue =
+              std::dynamic_pointer_cast<CacheableInt32>(column)) {
+        key = columnValue->value();
+        EXPECT_NE(values.end(), values.find(key));
+      } else if (auto columnValue =
+                     std::dynamic_pointer_cast<CacheableString>(column)) {
+        auto value = columnValue->value();
+        EXPECT_EQ(values.find(key)->second, value);
+      } else {
+        FAIL() << "Column is not int or string.";
+      }
+    }
+  }
+}
+
+}  // namespace
diff --git a/cppcache/integration-test-2/framework/Cluster.cpp b/cppcache/integration-test-2/framework/Cluster.cpp
index 164f38f..d7fbd4c 100644
--- a/cppcache/integration-test-2/framework/Cluster.cpp
+++ b/cppcache/integration-test-2/framework/Cluster.cpp
@@ -19,12 +19,20 @@
 
 #include <future>
 
+#include <signal.h>
+
+#include <boost/filesystem.hpp>
+
 void Locator::start() {
   if (started_) return;
 
   auto safeName = name_;
   std::replace(safeName.begin(), safeName.end(), '/', '_');
 
+  if (boost::filesystem::is_regular_file(name_ + "/vf.gf.locator.pid")) {
+    cluster_.getGfsh().stop().locator().withDir(name_).execute();
+  }
+
   cluster_.getGfsh()
       .start()
       .locator()
diff --git a/cppcache/integration-test/CMakeLists.txt b/cppcache/integration-test/CMakeLists.txt
index e6477fe..91fb905 100644
--- a/cppcache/integration-test/CMakeLists.txt
+++ b/cppcache/integration-test/CMakeLists.txt
@@ -25,7 +25,7 @@ add_library(${TEST_UTILS_LIB} STATIC
 target_link_libraries(${TEST_UTILS_LIB}
   PRIVATE
     ACE
-	_WarningsAsError
+	  _WarningsAsError
   PUBLIC
     apache-geode
     fwk
@@ -43,7 +43,7 @@ add_library(unit_test_callbacks SHARED LibraryCallbacks.cpp)
 target_link_libraries(unit_test_callbacks
   PRIVATE
     ACE
-	_WarningsAsError
+	  _WarningsAsError
   PUBLIC
     apache-geode
 )
@@ -85,7 +85,8 @@ foreach(FILE ${SOURCES})
     PRIVATE
       ACE
       ${TEST_UTILS_LIB}
-	_WarningsAsError
+	    _WarningsAsError
+      internal
     PUBLIC
       apache-geode
       testobject
diff --git a/cppcache/integration-test/CacheHelper.cpp b/cppcache/integration-test/CacheHelper.cpp
index 56895b7..0853fb5 100644
--- a/cppcache/integration-test/CacheHelper.cpp
+++ b/cppcache/integration-test/CacheHelper.cpp
@@ -381,7 +381,7 @@ void CacheHelper::createDistRegion(const char* regionName,
   regionPtr = rootRegionPtr->createSubregion(regionName, regionAttributes);
   ASSERT(regionPtr != nullptr, "failed to create region.");
 }
-std::shared_ptr<Region> CacheHelper::getRegion(const char* name) {
+std::shared_ptr<Region> CacheHelper::getRegion(const std::string& name) {
   return cachePtr->getRegion(name);
 }
 std::shared_ptr<Region> CacheHelper::createRegion(
@@ -425,7 +425,7 @@ std::shared_ptr<Region> CacheHelper::createRegion(
   return regionPtr;
 }
 std::shared_ptr<Pool> CacheHelper::createPool(
-    const char* poolName, const char* locators, const char* serverGroup,
+    const std::string& poolName, const char* locators, const char* serverGroup,
     int redundancy, bool clientNotification,
     std::chrono::milliseconds subscriptionAckInterval, int connections,
     int loadConditioningInterval, bool isMultiuserMode) {
@@ -522,8 +522,8 @@ void CacheHelper::logPoolAttributes(std::shared_ptr<Pool>& pool) {
 }
 
 void CacheHelper::createPoolWithLocators(
-    const char* name, const char* locators, bool clientNotificationEnabled,
-    int subscriptionRedundancy,
+    const std::string& name, const char* locators,
+    bool clientNotificationEnabled, int subscriptionRedundancy,
     std::chrono::milliseconds subscriptionAckInterval, int connections,
     bool isMultiuserMode, const char* serverGroup) {
   LOG("createPool() entered.");
@@ -536,7 +536,7 @@ void CacheHelper::createPoolWithLocators(
   LOG("Pool created.");
 }
 std::shared_ptr<Region> CacheHelper::createRegionAndAttachPool(
-    const char* name, bool, const char* poolName, bool caching,
+    const std::string& name, bool, const std::string& poolName, bool caching,
     const std::chrono::seconds& ettl, const std::chrono::seconds& eit,
     const std::chrono::seconds& rttl, const std::chrono::seconds& rit, int lel,
     ExpirationAction action) {
@@ -553,7 +553,7 @@ std::shared_ptr<Region> CacheHelper::createRegionAndAttachPool(
   regionFactory.setEntryTimeToLive(action, ettl);
   regionFactory.setRegionIdleTimeout(action, rit);
   regionFactory.setRegionTimeToLive(action, rttl);
-  if (poolName != nullptr) {
+  if (!poolName.empty()) {
     regionFactory.setPoolName(poolName);
   }
   return regionFactory.create(name);
diff --git a/cppcache/integration-test/CacheHelper.hpp b/cppcache/integration-test/CacheHelper.hpp
index 08234ab..19cc0a7 100644
--- a/cppcache/integration-test/CacheHelper.hpp
+++ b/cppcache/integration-test/CacheHelper.hpp
@@ -120,7 +120,7 @@ class CacheHelper {
   void createDistRegion(const char* regionName,
                         std::shared_ptr<Region>& regionPtr, uint32_t size);
 
-  std::shared_ptr<Region> getRegion(const char* name);
+  std::shared_ptr<Region> getRegion(const std::string& name);
 
   std::shared_ptr<Region> createRegion(
       const char* name, bool ack, bool caching,
@@ -138,8 +138,9 @@ class CacheHelper {
       const char* endpoints = 0, bool clientNotificationEnabled = false);
 
   std::shared_ptr<Pool> createPool(
-      const char* poolName, const char* locators, const char* serverGroup,
-      int redundancy = 0, bool clientNotification = false,
+      const std::string& poolName, const char* locators,
+      const char* serverGroup, int redundancy = 0,
+      bool clientNotification = false,
       std::chrono::milliseconds subscriptionAckInterval =
           std::chrono::milliseconds::zero(),
       int connections = -1, int loadConditioningInterval = -1,
@@ -157,7 +158,7 @@ class CacheHelper {
   void logPoolAttributes(std::shared_ptr<Pool>& pool);
 
   void createPoolWithLocators(
-      const char* name, const char* locators = nullptr,
+      const std::string& name, const char* locators = nullptr,
       bool clientNotificationEnabled = false, int subscriptionRedundancy = -1,
       std::chrono::milliseconds subscriptionAckInterval =
           std::chrono::milliseconds::zero(),
@@ -165,7 +166,7 @@ class CacheHelper {
       const char* serverGroup = nullptr);
 
   std::shared_ptr<Region> createRegionAndAttachPool(
-      const char* name, bool ack, const char* poolName = nullptr,
+      const std::string& name, bool ack, const std::string& poolName,
       bool caching = true,
       const std::chrono::seconds& ettl = std::chrono::seconds::zero(),
       const std::chrono::seconds& eit = std::chrono::seconds::zero(),
diff --git a/cppcache/integration-test/QueryHelper.hpp b/cppcache/integration-test/QueryHelper.hpp
index ebd969d..2f880e4 100644
--- a/cppcache/integration-test/QueryHelper.hpp
+++ b/cppcache/integration-test/QueryHelper.hpp
@@ -37,6 +37,7 @@
 #include "testobject/PdxType.hpp"
 #include "testobject/PortfolioPdx.hpp"
 #include "testobject/PositionPdx.hpp"
+#include <hacks/range.h>
 
 //#include <geode/Struct.hpp>
 
@@ -315,76 +316,58 @@ void QueryHelper::getPDXObject(std::shared_ptr<Region>& rptr) {
 
 bool QueryHelper::verifyRS(std::shared_ptr<SelectResults>& resultSet,
                            size_t expectedRows) {
-  if (!std::dynamic_pointer_cast<ResultSet>(resultSet)) {
-    return false;
-  }
-
-  auto rsptr = std::static_pointer_cast<ResultSet>(resultSet);
-
-  size_t foundRows = 0;
-
-  SelectResultsIterator iter = rsptr->getIterator();
+  if (auto rsptr = std::static_pointer_cast<ResultSet>(resultSet)) {
+    size_t foundRows = 0;
+    for (auto&& row : hacks::range(*rsptr)) {
+      foundRows++;
+    }
 
-  for (size_t rows = 0; rows < rsptr->size(); rows++) {
-    auto ser = (*rsptr)[rows];
-    foundRows++;
+    printf("found rows %zd, expected %zd \n", foundRows, expectedRows);
+    if (foundRows == expectedRows) return true;
   }
-
-  printf("found rows %zd, expected %zd \n", foundRows, expectedRows);
-  if (foundRows == expectedRows) return true;
-
   return false;
 }
 
 bool QueryHelper::verifySS(std::shared_ptr<SelectResults>& structSet,
                            size_t expectedRows, int32_t expectedFields) {
-  if (!std::dynamic_pointer_cast<StructSet>(structSet)) {
-    if (expectedRows == 0 && expectedFields == 0) {
-      return true;  // quite possible we got a null set back.
-    }
-    printf("we have structSet itself nullptr \n");
-    return false;
-  }
-
-  auto ssptr = std::static_pointer_cast<StructSet>(structSet);
+  if (auto ssptr = std::static_pointer_cast<StructSet>(structSet)) {
+    size_t foundRows = 0;
+    for (auto&& ser : hacks::range(*ssptr)) {
+      foundRows++;
 
-  size_t foundRows = 0;
+      auto siptr = std::dynamic_pointer_cast<Struct>(ser);
 
-  for (SelectResults::Iterator iter = ssptr->begin(); iter != ssptr->end();
-       iter++) {
-    auto ser = (*iter);
-    foundRows++;
+      if (siptr == nullptr) {
+        printf("siptr is nullptr \n\n");
+        return false;
+      }
 
-    Struct* siptr = dynamic_cast<Struct*>(ser.get());
+      int32_t foundFields = 0;
+      for (auto&& field : *siptr) {
+        foundFields++;
+      }
 
-    if (siptr == nullptr) {
-      printf("siptr is nullptr \n\n");
-      return false;
+      if (foundFields != expectedFields) {
+        char buffer[1024] = {'\0'};
+        sprintf(buffer, "found fields %d, expected fields %d \n", foundFields,
+                expectedFields);
+        LOG(buffer);
+        return false;
+      }
     }
 
-    int32_t foundFields = 0;
+    if (foundRows == expectedRows) return true;
 
-    for (int32_t cols = 0; cols < siptr->length(); cols++) {
-      auto field = (*siptr)[cols];
-      foundFields++;
-    }
-
-    if (foundFields != expectedFields) {
-      char buffer[1024] = {'\0'};
-      sprintf(buffer, "found fields %d, expected fields %d \n", foundFields,
-              expectedFields);
-      LOG(buffer);
-      return false;
+    // lets log and return in case of error only situation
+    char buffer[1024] = {'\0'};
+    sprintf(buffer, "found rows %zd, expected rows %zd\n", foundRows,
+            expectedRows);
+    LOG(buffer);
+  } else {
+    if (expectedRows == 0 && expectedFields == 0) {
+      return true;  // quite possible we got a null set back.
     }
   }
-
-  if (foundRows == expectedRows) return true;
-
-  // lets log and return in case of error only situation
-  char buffer[1024] = {'\0'};
-  sprintf(buffer, "found rows %zd, expected rows %zd\n", foundRows,
-          expectedRows);
-  LOG(buffer);
   return false;
 }
 
diff --git a/cppcache/integration-test/ThinClientDistOps2.hpp b/cppcache/integration-test/ThinClientDistOps2.hpp
index 78c5919..e9e55ea 100644
--- a/cppcache/integration-test/ThinClientDistOps2.hpp
+++ b/cppcache/integration-test/ThinClientDistOps2.hpp
@@ -51,7 +51,7 @@ const char* locatorsG =
 
 #define verifyEntry(a, b, c, d) _verifyEntry(a, b, c, d, __LINE__)
 
-void _verifyEntry(const char* name, const char* key, const char* val,
+void _verifyEntry(const std::string& name, const char* key, const char* val,
                   bool checkLocal, int line) {
   char logmsg[1024];
   sprintf(logmsg, "verifyEntry() called from %d.\n", line);
diff --git a/cppcache/integration-test/ThinClientHelper.hpp b/cppcache/integration-test/ThinClientHelper.hpp
index c3ad15f..81dfe68 100644
--- a/cppcache/integration-test/ThinClientHelper.hpp
+++ b/cppcache/integration-test/ThinClientHelper.hpp
@@ -159,7 +159,7 @@ const char* regionNames[] = {"DistRegionAck", "DistRegionNoAck"};
 const bool USE_ACK = true;
 const bool NO_ACK = false;
 
-void _verifyEntry(const char* name, const char* key, const char* val,
+void _verifyEntry(const std::string& name, const char* key, const char* val,
                   bool noKey, bool checkVal = true) {
   // Verify key and value exist in this region, in this process.
   const char* value = (val == 0) ? "" : val;
@@ -167,13 +167,14 @@ void _verifyEntry(const char* name, const char* key, const char* val,
       reinterpret_cast<char*>(malloc(1024 + strlen(key) + strlen(value)));
   ASSERT(buf, "Unable to malloc buffer for logging.");
   if (noKey) {
-    sprintf(buf, "Verify key %s does not exist in region %s", key, name);
+    sprintf(buf, "Verify key %s does not exist in region %s", key,
+            name.c_str());
   } else if (val == 0) {
     sprintf(buf, "Verify value for key %s does not exist in region %s", key,
-            name);
+            name.c_str());
   } else {
     sprintf(buf, "Verify value for key %s is: %s in region %s", key, value,
-            name);
+            name.c_str());
   }
   LOG(buf);
   free(buf);
@@ -255,7 +256,7 @@ void _verifyDestroyed(const char* name, const char* key, int line) {
   LOG("Entry destroyed.");
 }
 
-void verifyEntry(const char* name, const char* key, const char* val,
+void verifyEntry(const std::string& name, const char* key, const char* val,
                  bool checkVal = true) {
   char logmsg[1024];
   sprintf(logmsg, "verifyEntry() called from %d.\n", __LINE__);
@@ -477,7 +478,8 @@ std::shared_ptr<Pool> createPool2(const char* poolName, const char* locators,
   return poolPtr;
 }
 std::shared_ptr<Region> createRegionAndAttachPool(
-    const char* name, bool ack, const char* poolName, bool caching = true,
+    const std::string& name, bool ack, const std::string& poolName = "",
+    bool caching = true,
     const std::chrono::seconds& ettl = std::chrono::seconds::zero(),
     const std::chrono::seconds& eit = std::chrono::seconds::zero(),
     const std::chrono::seconds& rttl = std::chrono::seconds::zero(),
@@ -491,10 +493,10 @@ std::shared_ptr<Region> createRegionAndAttachPool(
   return regPtr;
 }
 
-void createEntry(const char* name, const char* key, const char* value) {
+void createEntry(const std::string& name, const char* key, const char* value) {
   LOG("createEntry() entered.");
   fprintf(stdout, "Creating entry -- key: %s  value: %s in region %s\n", key,
-          value, name);
+          value, name.c_str());
   fflush(stdout);
   // Create entry, verify entry is correct
   auto keyPtr = CacheableKey::create(key);
@@ -652,9 +654,9 @@ void destroyEntry(const char* name, const char* key) {
   LOG("Entry destroyed.");
 }
 
-void destroyRegion(const char* name) {
+void destroyRegion(const std::string& name) {
   LOG("destroyRegion() entered.");
- auto regPtr = getHelper()->getRegion(name);
+  auto regPtr = getHelper()->getRegion(name);
   regPtr->localDestroyRegion();
   LOG("Region destroyed.");
 }
diff --git a/cppcache/integration-test/ThinClientSecurity.hpp b/cppcache/integration-test/ThinClientSecurity.hpp
index a0a5316..ab23c42 100644
--- a/cppcache/integration-test/ThinClientSecurity.hpp
+++ b/cppcache/integration-test/ThinClientSecurity.hpp
@@ -38,7 +38,7 @@ static int numberOfLocators = 1;
 const char* locatorsG =
     CacheHelper::getLocatorHostPort(isLocator, isLocalServer, numberOfLocators);
 
-void setCacheListener(const char* regName,
+void setCacheListener(const std::string& regName,
                       const std::shared_ptr<CacheListener>& listener) {
   if (listener != nullptr) {
     auto reg = getHelper()->getRegion(regName);
@@ -48,7 +48,8 @@ void setCacheListener(const char* regName,
 }
 
 void createRegionForSecurity(
-    const char* name, bool ackMode, bool clientNotificationEnabled = false,
+    const std::string& name, bool ackMode,
+    bool clientNotificationEnabled = false,
     const std::shared_ptr<CacheListener>& listener = nullptr,
     bool caching = true, int connections = -1, bool isMultiuserMode = false,
     int subscriptionRedundancy = -1) {
@@ -56,15 +57,14 @@ void createRegionForSecurity(
   LOG(msg);
   LOG(" pool is creating");
   char buff[128] = {'\0'};
-  const char* poolName = name;
+  auto poolName = name;
 
-  if (getHelper()->getCache()->getPoolManager().find(name) != nullptr) {
+  if (getHelper()->getCache()->getPoolManager().find(name)) {
     static unsigned int index = 0;
-    sprintf(buff, "%s_%d", poolName, index++);
-    poolName = buff;
+    poolName += "_" + std::to_string(index++);
   }
 
-  printf("createRegionForSecurity poolname = %s \n", poolName);
+  printf("createRegionForSecurity poolname = %s \n", poolName.c_str());
 
   getHelper()->createPoolWithLocators(
       poolName, locatorsG, clientNotificationEnabled, subscriptionRedundancy,
@@ -74,7 +74,7 @@ void createRegionForSecurity(
   setCacheListener(name, listener);
 }
 
-std::shared_ptr<Pool> getPool(const char* name) {
+std::shared_ptr<Pool> getPool(const std::string& name) {
   return getHelper()->getCache()->getPoolManager().find(name);
 }
 
diff --git a/cppcache/integration-test/testThinClientCacheableStringArray.cpp b/cppcache/integration-test/testThinClientCacheableStringArray.cpp
index f5ccd7c..58047c2 100644
--- a/cppcache/integration-test/testThinClientCacheableStringArray.cpp
+++ b/cppcache/integration-test/testThinClientCacheableStringArray.cpp
@@ -35,6 +35,7 @@
 #include "SerializationRegistry.hpp"
 #include "CacheRegionHelper.hpp"
 #include "CacheImpl.hpp"
+#include <hacks/range.h>
 
 using namespace apache::geode::client;
 using namespace test;
@@ -93,41 +94,29 @@ END_TASK(StepOne)
 DUNIT_TASK(CLIENT1, StepThree)
   {
     try {
-      auto qs = getHelper()->cachePtr->getQueryService("__TEST_POOL1__");
+      auto&& qs = getHelper()->cachePtr->getQueryService("__TEST_POOL1__");
+      auto qryStr = "select * from /Portfolios p where p.ID < 3";
+      auto&& qry = qs->newQuery(qryStr);
+      auto&& results = qry->execute();
 
-      char* qryStr = (char*)"select * from /Portfolios p where p.ID < 3";
-      auto qry = qs->newQuery(qryStr);
-      std::shared_ptr<SelectResults> results;
-      results = qry->execute();
-
-      SelectResultsIterator iter = results->getIterator();
       char buf[100];
       auto count = results->size();
       sprintf(buf, "results size=%zd", count);
       LOG(buf);
-      while (iter.hasNext()) {
+      for (auto&& ser : hacks::range(*results)) {
         count--;
-        auto ser = iter.next();
-        auto portfolio = std::dynamic_pointer_cast<Portfolio>(ser);
-        auto position = std::dynamic_pointer_cast<Position>(ser);
 
-        if (portfolio != nullptr) {
+        if (auto portfolio = std::dynamic_pointer_cast<Portfolio>(ser)) {
           printf("   query pulled portfolio object ID %d, pkid %s\n",
                  portfolio->getID(), portfolio->getPkid()->value().c_str());
-        }
-
-        else if (position != nullptr) {
+        } else if (auto position = std::dynamic_pointer_cast<Position>(ser)) {
           printf("   query  pulled position object secId %s, shares %d\n",
                  position->getSecId()->value().c_str(),
                  position->getSharesOutstanding());
-        }
-
-        else {
-          if (ser != nullptr) {
+        } else if (ser) {
             printf(" query pulled object %s\n", ser->toString().c_str());
-          } else {
-            printf("   query pulled bad object\n");
-          }
+        } else {
+          printf("   query pulled nullptr object\n");
         }
       }
       sprintf(buf, "results last count=%zd", count);
diff --git a/cppcache/integration-test/testThinClientCqDurable.cpp b/cppcache/integration-test/testThinClientCqDurable.cpp
index ced2e40..e4daaa3 100644
--- a/cppcache/integration-test/testThinClientCqDurable.cpp
+++ b/cppcache/integration-test/testThinClientCqDurable.cpp
@@ -395,19 +395,17 @@ DUNIT_TASK_DEFINITION(CLIENT1, StepThree)
     cqFac.addCqListener(cqLstner);
     auto cqAttr = cqFac.create();
 
-    const char* qryStr = "select * from /Portfolios p where p.ID < 3";
-    auto qry = qs->newCq(cqName, qryStr, cqAttr);
+    auto qryStr = "select * from /Portfolios p where p.ID < 3";
+    auto&& qry = qs->newCq(cqName, qryStr, cqAttr);
 
-    std::shared_ptr<SelectResults> results;
     try {
       LOG("EXECUTE 1 START");
 
-      results = qry->executeWithInitialResults();
+      auto&& results = qry->executeWithInitialResults();
 
       LOG("EXECUTE 1 STOP");
-      SelectResultsIterator iter = results->getIterator();
-      char buf[100];
       auto count = results->size();
+      char buf[100];
       sprintf(buf, "results size=%zd", count);
       LOG(buf);
     } catch (const Exception& excp) {
@@ -422,6 +420,7 @@ DUNIT_TASK_DEFINITION(CLIENT1, StepThree)
     LOG("StepThree complete.");
   }
 END_TASK_DEFINITION
+
 DUNIT_TASK_DEFINITION(CLIENT2, StepTwo2)
   {
     auto regPtr0 = getHelper()->getRegion(regionNamesCq[0]);
diff --git a/cppcache/integration-test/testThinClientCqHAFailover.cpp b/cppcache/integration-test/testThinClientCqHAFailover.cpp
index be57b16..2df17c2 100644
--- a/cppcache/integration-test/testThinClientCqHAFailover.cpp
+++ b/cppcache/integration-test/testThinClientCqHAFailover.cpp
@@ -36,6 +36,7 @@
 #include <geode/QueryService.hpp>
 
 #include "ThinClientCQ.hpp"
+#include <hacks/range.h>
 
 using namespace apache::geode::client;
 using namespace test;
@@ -213,43 +214,30 @@ DUNIT_TASK_DEFINITION(CLIENT1, StepThree)
       cqFac.addCqListener(cqLstner);
       auto cqAttr = cqFac.create();
 
-      char* qryStr = (char*)"select * from /Portfolios p where p.ID != 1";
+      auto qryStr = "select * from /Portfolios p where p.ID != 1";
       // char* qryStr = (char*)"select * from /Portfolios p where p.ID != 2";
       // char* qryStr = (char*)"select * from /Portfolios p where p.ID < 3";
-      auto qry = qs->newCq(cqName, qryStr, cqAttr);
-      std::shared_ptr<SelectResults> results;
-      results = qry->executeWithInitialResults();
+      auto&& qry = qs->newCq(cqName, qryStr, cqAttr);
+      auto&& results = qry->executeWithInitialResults();
 
-      SelectResultsIterator iter = results->getIterator();
       char buf[100];
       auto count = results->size();
       sprintf(buf, "results size=%zd", count);
       LOG(buf);
-      while (iter.hasNext()) {
+      for (auto&& ser: hacks::range(*results)) {
         count--;
-        auto ser = iter.next();
-        std::shared_ptr<Portfolio> portfolio(
-            dynamic_cast<Portfolio*>(ser.get()));
-        std::shared_ptr<Position> position(dynamic_cast<Position*>(ser.get()));
-
-        if (portfolio != nullptr) {
+        if (auto portfolio = std::dynamic_pointer_cast<Portfolio>(ser)) {
           printf("   query pulled portfolio object ID %d, pkid %s\n",
                  portfolio->getID(), portfolio->getPkid()->value().c_str());
-        }
-
-        else if (position != nullptr) {
+        } else if (auto position = std::dynamic_pointer_cast<Position>(ser)) {
           printf("   query  pulled position object secId %s, shares %d\n",
                  position->getSecId()->value().c_str(),
                  position->getSharesOutstanding());
-        }
-
-        else {
-          if (ser != nullptr) {
-            printf(" query pulled object %s\n", ser->toString().c_str());
+        } else if (ser) {
+          printf(" query pulled object %s\n", ser->toString().c_str());
           } else {
-            printf("   query pulled bad object\n");
+            printf("   query pulled nullptr object\n");
           }
-        }
       }
       sprintf(buf, "results last count=%zd", count);
       LOG(buf);
diff --git a/cppcache/integration-test/testThinClientCqIR.cpp b/cppcache/integration-test/testThinClientCqIR.cpp
index 6492125..5a4ddb0 100644
--- a/cppcache/integration-test/testThinClientCqIR.cpp
+++ b/cppcache/integration-test/testThinClientCqIR.cpp
@@ -36,6 +36,7 @@
 #include <geode/QueryService.hpp>
 
 #include "ThinClientCQ.hpp"
+#include <hacks/range.h>
 
 using namespace apache::geode::client;
 using namespace test;
@@ -181,38 +182,34 @@ DUNIT_TASK_DEFINITION(CLIENT1, QueryData)
       auto results = qry->executeWithInitialResults();
       LOG("before executing executeWithInitialResults done.");
 
-      auto iter = results->getIterator();
       char buf[100];
       auto count = results->size();
       sprintf(buf, "results size=%zd", count);
       LOG(buf);
       ASSERT(count > 0, "count should be > 0");
-      while (iter.hasNext()) {
+      for (auto&& ser : hacks::range(*results)) {
         count--;
-        auto ser = iter.next();
 
-        if (ser != nullptr) {
+        if (ser) {
           printf(" query pulled object %s\n", ser->toString().c_str());
 
           auto stPtr = std::dynamic_pointer_cast<Struct>(ser);
           ASSERT(stPtr != nullptr, "Failed to get struct in CQ result.");
 
-          if (stPtr != nullptr) {
-            LOG(" got struct ptr ");
-            auto serKey = (*stPtr)["key"];
-            ASSERT(serKey != nullptr, "Failed to get KEY in CQ result.");
-            if (serKey != nullptr) {
-              LOG("got struct key ");
-              printf("  got struct key %s\n", serKey->toString().c_str());
-            }
-
-            auto serVal = (*stPtr)["value"];
-            ASSERT(serVal != nullptr, "Failed to get VALUE in CQ result.");
-
-            if (serVal != nullptr) {
-              LOG("got struct value ");
-              printf("  got struct value %s\n", serVal->toString().c_str());
-            }
+          LOG(" got struct ptr ");
+          auto serKey = (*stPtr)["key"];
+          ASSERT(serKey != nullptr, "Failed to get KEY in CQ result.");
+          if (serKey != nullptr) {
+            LOG("got struct key ");
+            printf("  got struct key %s\n", serKey->toString().c_str());
+          }
+
+          auto serVal = (*stPtr)["value"];
+          ASSERT(serVal != nullptr, "Failed to get VALUE in CQ result.");
+
+          if (serVal != nullptr) {
+            LOG("got struct value ");
+            printf("  got struct value %s\n", serVal->toString().c_str());
           }
         } else {
           printf("   query pulled bad object\n");
@@ -227,38 +224,33 @@ DUNIT_TASK_DEFINITION(CLIENT1, QueryData)
       results = qry->executeWithInitialResults();
       LOG("before executing executeWithInitialResults2 done.");
 
-      auto iter2 = results->getIterator();
-
       count = results->size();
       sprintf(buf, "results2 size=%zd", count);
       LOG(buf);
       ASSERT(count > 0, "count should be > 0");
-      while (iter2.hasNext()) {
+      for (auto&& ser : hacks::range(*results)) {
         count--;
-        auto ser = iter2.next();
 
-        if (ser != nullptr) {
+        if (ser) {
           printf(" query pulled object %s\n", ser->toString().c_str());
 
           auto stPtr = std::dynamic_pointer_cast<Struct>(ser);
           ASSERT(stPtr != nullptr, "Failed to get struct in CQ result.");
 
-          if (stPtr != nullptr) {
-            LOG(" got struct ptr ");
-            auto serKey = (*stPtr)["key"];
-            ASSERT(serKey != nullptr, "Failed to get KEY in CQ result.");
-            if (serKey != nullptr) {
-              LOG("got struct key ");
-              printf("  got struct key %s\n", serKey->toString().c_str());
-            }
-
-            auto serVal = (*stPtr)["value"];
-            ASSERT(serVal != nullptr, "Failed to get VALUE in CQ result.");
-
-            if (serVal != nullptr) {
-              LOG("got struct value ");
-              printf("  got struct value %s\n", serVal->toString().c_str());
-            }
+          LOG(" got struct ptr ");
+          auto serKey = (*stPtr)["key"];
+          ASSERT(serKey != nullptr, "Failed to get KEY in CQ result.");
+          if (serKey != nullptr) {
+            LOG("got struct key ");
+            printf("  got struct key %s\n", serKey->toString().c_str());
+          }
+
+          auto serVal = (*stPtr)["value"];
+          ASSERT(serVal != nullptr, "Failed to get VALUE in CQ result.");
+
+          if (serVal != nullptr) {
+            LOG("got struct value ");
+            printf("  got struct value %s\n", serVal->toString().c_str());
           }
         } else {
           printf("   query pulled bad object\n");
diff --git a/cppcache/integration-test/testThinClientHAQueryFailover.cpp b/cppcache/integration-test/testThinClientHAQueryFailover.cpp
index dd7e563..bf75bda 100644
--- a/cppcache/integration-test/testThinClientHAQueryFailover.cpp
+++ b/cppcache/integration-test/testThinClientHAQueryFailover.cpp
@@ -33,7 +33,6 @@
 #include <geode/QueryService.hpp>
 #include <geode/ResultSet.hpp>
 #include <geode/StructSet.hpp>
-#include <geode/SelectResultsIterator.hpp>
 
 #include "testobject/Portfolio.hpp"
 
diff --git a/cppcache/integration-test/testThinClientPdxEnum.cpp b/cppcache/integration-test/testThinClientPdxEnum.cpp
index 87e201f..73d5c8f 100644
--- a/cppcache/integration-test/testThinClientPdxEnum.cpp
+++ b/cppcache/integration-test/testThinClientPdxEnum.cpp
@@ -22,6 +22,7 @@
 #include "QueryHelper.hpp"
 #include <geode/Query.hpp>
 #include <geode/QueryService.hpp>
+#include <hacks/range.h>
 
 using namespace apache::geode::client;
 using namespace test;
@@ -113,28 +114,25 @@ DUNIT_TASK_DEFINITION(CLIENT1, pdxEnumQuery)
       LOG("PdxEnumTestClass IllegalStateException");
     }
 
-    auto rptr = getHelper()->getRegion("DistRegionAck");
-    auto results = rptr->query("m_enumid.name = 'id2'");
+    auto&& rptr = getHelper()->getRegion("DistRegionAck");
+    auto&& results = rptr->query("m_enumid.name = 'id2'");
     ASSERT(results->size() == 1, "query result should have one item");
     auto rsptr = std::dynamic_pointer_cast<ResultSet>(results);
-    SelectResultsIterator iter = rsptr->getIterator();
-    while (iter.moveNext()) {
-      auto re = std::dynamic_pointer_cast<PdxEnumTestClass>(iter.current());
+    for (auto&& row : hacks::range(*rsptr)) {
+      auto re = std::dynamic_pointer_cast<PdxEnumTestClass>(row);
       ASSERT(re->getID() == 1, "query should have return id 1");
     }
 
     QueryHelper::getHelper();
-    std::shared_ptr<QueryService> qs = nullptr;
-    auto pool1 = findPool("__TEST_POOL1__");
-    qs = pool1->getQueryService();
-    auto qry = qs->newQuery(
+    auto&& pool1 = findPool("__TEST_POOL1__");
+    auto&& qs = pool1->getQueryService();
+    auto&& qry = qs->newQuery(
         "select distinct * from /DistRegionAck this where m_enumid.name = "
         "'id3'");
     results = qry->execute();
     rsptr = std::dynamic_pointer_cast<ResultSet>(results);
-    SelectResultsIterator iter1 = rsptr->getIterator();
-    while (iter1.moveNext()) {
-      auto re = std::dynamic_pointer_cast<PdxEnumTestClass>(iter1.current());
+    for (auto&& row : hacks::range(*rsptr)) {
+      auto re = std::dynamic_pointer_cast<PdxEnumTestClass>(row);
       ASSERT(re->getID() == 2, "query should have return id 0");
     }
 
diff --git a/cppcache/integration-test/testThinClientPoolExecuteFunctionDisableChunkHandlerThread.cpp b/cppcache/integration-test/testThinClientPoolExecuteFunctionDisableChunkHandlerThread.cpp
index cf5b421..9f5bb05 100644
--- a/cppcache/integration-test/testThinClientPoolExecuteFunctionDisableChunkHandlerThread.cpp
+++ b/cppcache/integration-test/testThinClientPoolExecuteFunctionDisableChunkHandlerThread.cpp
@@ -86,7 +86,7 @@ DUNIT_TASK_DEFINITION(CLIENT1, StartC1)
     // createPool(poolName, locHostPort,serverGroup, nullptr, 0, true );
     // createRegionAndAttachPool(poolRegNames[0],USE_ACK, poolName);
 
-    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK, nullptr);
+    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK);
     ;  // getHelper()->createRegion( poolRegNames[0], USE_ACK);
     regPtr0->registerAllKeys();
 
@@ -144,7 +144,7 @@ DUNIT_TASK_DEFINITION(CLIENT1, StartTestClient)
                        -1, -1, -1, true, false);
     // createPool(poolName, locHostPort,serverGroup, nullptr, 0, true );
 
-    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK, nullptr);
+    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK);
     ;  // getHelper()->createRegion( poolRegNames[0], USE_ACK);
 
     LOG("StartTestClient complete.");
@@ -165,7 +165,7 @@ DUNIT_TASK_DEFINITION(CLIENT2, StartTestClient2)
                        -1, -1, -1, true, false);
     // createPool(poolName, locHostPort,serverGroup, nullptr, 0, true );
 
-    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK, nullptr);
+    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK);
     ;  // getHelper()->createRegion( poolRegNames[0], USE_ACK);
 
     LOG("StartTestClient complete.");
diff --git a/cppcache/integration-test/testThinClientPoolExecuteFunctionThrowsException.cpp b/cppcache/integration-test/testThinClientPoolExecuteFunctionThrowsException.cpp
index a28c1df..0987d73 100644
--- a/cppcache/integration-test/testThinClientPoolExecuteFunctionThrowsException.cpp
+++ b/cppcache/integration-test/testThinClientPoolExecuteFunctionThrowsException.cpp
@@ -132,7 +132,7 @@ DUNIT_TASK_DEFINITION(CLIENT1, StartC1)
     // createPool(poolName, locHostPort,serverGroup, nullptr, 0, true );
     // createRegionAndAttachPool(poolRegNames[0],USE_ACK, poolName);
 
-    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK, nullptr);
+    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK);
     ;  // getHelper()->createRegion( poolRegNames[0], USE_ACK);
     regPtr0->registerAllKeys();
 
diff --git a/cppcache/integration-test/testThinClientPoolExecuteHAFunction.cpp b/cppcache/integration-test/testThinClientPoolExecuteHAFunction.cpp
index 5277c76..2cef9eb 100644
--- a/cppcache/integration-test/testThinClientPoolExecuteHAFunction.cpp
+++ b/cppcache/integration-test/testThinClientPoolExecuteHAFunction.cpp
@@ -143,7 +143,7 @@ DUNIT_TASK_DEFINITION(CLIENT1, StartC1)
     // createPool(poolName, locHostPort,serverGroup, nullptr, 0, true );
     // createRegionAndAttachPool(poolRegNames[0],USE_ACK, poolName);
 
-    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK, nullptr);
+    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK);
     ;  // getHelper()->createRegion( poolRegNames[0], USE_ACK);
     regPtr0->registerAllKeys();
 
diff --git a/cppcache/integration-test/testThinClientPoolExecuteHAFunctionPrSHOP.cpp b/cppcache/integration-test/testThinClientPoolExecuteHAFunctionPrSHOP.cpp
index 11bf428..fa3d881 100644
--- a/cppcache/integration-test/testThinClientPoolExecuteHAFunctionPrSHOP.cpp
+++ b/cppcache/integration-test/testThinClientPoolExecuteHAFunctionPrSHOP.cpp
@@ -141,7 +141,7 @@ DUNIT_TASK_DEFINITION(CLIENT1, StartC1)
     // createPool(poolName, locHostPort,serverGroup, nullptr, 0, true );
     // createRegionAndAttachPool(poolRegNames[0],USE_ACK, poolName);
 
-    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK, nullptr);
+    auto regPtr0 = createRegionAndAttachPool(poolRegNames[0], USE_ACK);
     // getHelper()->createRegion( poolRegNames[0], USE_ACK);
     regPtr0->registerAllKeys();
 
diff --git a/cppcache/integration-test/testThinClientRegionQueryExclusiveness.cpp b/cppcache/integration-test/testThinClientRegionQueryExclusiveness.cpp
index 57908db..333cfd9 100644
--- a/cppcache/integration-test/testThinClientRegionQueryExclusiveness.cpp
+++ b/cppcache/integration-test/testThinClientRegionQueryExclusiveness.cpp
@@ -14,6 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 #include "fw_dunit.hpp"
 #include <ace/OS.h>
 #include <ace/High_Res_Timer.h>
@@ -31,7 +32,6 @@
 #include <geode/QueryService.hpp>
 #include <geode/ResultSet.hpp>
 #include <geode/StructSet.hpp>
-#include <geode/SelectResultsIterator.hpp>
 
 #include "SerializationRegistry.hpp"
 #include "CacheRegionHelper.hpp"
diff --git a/cppcache/integration-test/testThinClientRemoteQueryFailover.cpp b/cppcache/integration-test/testThinClientRemoteQueryFailover.cpp
index e59d876..7b91be9 100644
--- a/cppcache/integration-test/testThinClientRemoteQueryFailover.cpp
+++ b/cppcache/integration-test/testThinClientRemoteQueryFailover.cpp
@@ -29,7 +29,6 @@
 #include <geode/QueryService.hpp>
 #include <geode/ResultSet.hpp>
 #include <geode/StructSet.hpp>
-#include <geode/SelectResultsIterator.hpp>
 
 #include "testobject/Portfolio.hpp"
 #include "testobject/PortfolioPdx.hpp"
diff --git a/cppcache/integration-test/testThinClientRemoteQueryFailoverPdx.cpp b/cppcache/integration-test/testThinClientRemoteQueryFailoverPdx.cpp
index 6045f33..5bf1c84 100644
--- a/cppcache/integration-test/testThinClientRemoteQueryFailoverPdx.cpp
+++ b/cppcache/integration-test/testThinClientRemoteQueryFailoverPdx.cpp
@@ -29,7 +29,6 @@
 #include <geode/QueryService.hpp>
 #include <geode/ResultSet.hpp>
 #include <geode/StructSet.hpp>
-#include <geode/SelectResultsIterator.hpp>
 
 #include "testobject/Portfolio.hpp"
 #include "testobject/PortfolioPdx.hpp"
diff --git a/cppcache/integration-test/testThinClientRemoteQueryRS.cpp b/cppcache/integration-test/testThinClientRemoteQueryRS.cpp
index f19a428..d1b1c07 100644
--- a/cppcache/integration-test/testThinClientRemoteQueryRS.cpp
+++ b/cppcache/integration-test/testThinClientRemoteQueryRS.cpp
@@ -192,7 +192,6 @@ DUNIT_TASK_DEFINITION(CLIENT1, StepFour)
       }
 
       auto rsptr = std::dynamic_pointer_cast<ResultSet>(results);
-      SelectResultsIterator iter = rsptr->getIterator();
       for (size_t rows = 0; rows < rsptr->size(); rows++) {
         if (rows > QueryHelper::getHelper().getPortfolioSetSize()) {
           continue;
@@ -297,7 +296,6 @@ DUNIT_TASK_DEFINITION(CLIENT1, StepFive)
         }
 
         auto rsptr = std::dynamic_pointer_cast<ResultSet>(results);
-        SelectResultsIterator iter = rsptr->getIterator();
         for (size_t rows = 0; rows < rsptr->size(); rows++) {
           if (rows > QueryHelper::getHelper().getPortfolioSetSize()) {
             continue;
@@ -412,7 +410,6 @@ DUNIT_TASK_DEFINITION(CLIENT1, StepSix)
         }
 
         auto rsptr = std::dynamic_pointer_cast<ResultSet>(results);
-        SelectResultsIterator iter = rsptr->getIterator();
         for (size_t rows = 0; rows < rsptr->size(); rows++) {
           if (rows > QueryHelper::getHelper().getPortfolioSetSize()) {
             continue;
diff --git a/cppcache/integration-test/testThinClientRemoteQuerySS.cpp b/cppcache/integration-test/testThinClientRemoteQuerySS.cpp
index f96fd40..00ccaf2 100644
--- a/cppcache/integration-test/testThinClientRemoteQuerySS.cpp
+++ b/cppcache/integration-test/testThinClientRemoteQuerySS.cpp
@@ -121,7 +121,7 @@ void _printFields(std::shared_ptr<Cacheable> field, Struct* ssptr,
           printf("   end of map \n");
         } else if (auto structimpl = std::dynamic_pointer_cast<Struct>(field)) {
           printf("   structImpl %s {\n", ssptr->getFieldName(fields).c_str());
-          for (int32_t inner_fields = 0; inner_fields < structimpl->length();
+          for (int32_t inner_fields = 0; inner_fields < structimpl->size();
                inner_fields++) {
             auto field = (*structimpl)[inner_fields];
             if (field == nullptr) {
@@ -161,7 +161,7 @@ void _verifyStructSet(std::shared_ptr<StructSet>& ssptr, int i) {
     }
 
     printf("   Row : %zd \n", rows);
-    for (int32_t fields = 0; fields < siptr->length(); fields++) {
+    for (int32_t fields = 0; fields < siptr->size(); fields++) {
       auto field = (*siptr)[fields];
       if (field == nullptr) {
         printf("we got null fields here, probably we have nullptr data\n");
diff --git a/cppcache/integration-test/testThinClientSecurityAuthorizationMU.cpp b/cppcache/integration-test/testThinClientSecurityAuthorizationMU.cpp
index b215b62..dba18a4 100644
--- a/cppcache/integration-test/testThinClientSecurityAuthorizationMU.cpp
+++ b/cppcache/integration-test/testThinClientSecurityAuthorizationMU.cpp
@@ -113,7 +113,7 @@ opCodeList::value_type tmpAArr[] = {OP_CREATE,       OP_UPDATE,
 #define WRITER_CLIENT s1p2
 #define READER_CLIENT s2p1
 
-const char* regionNamesAuth[] = {"DistRegionAck"};
+const std::string regionNamesAuth[] = {"DistRegionAck"};
 std::shared_ptr<Properties> userCreds;
 void initClientAuth(char UserType) {
   userCreds = Properties::create();
@@ -288,24 +288,20 @@ DUNIT_TASK_DEFINITION(ADMIN_CLIENT, StepOne)
 
       qs = virtualCache.getQueryService();
 
-      char queryString[100];
-      sprintf(queryString, "select * from /%s", regionNamesAuth[0]);
-      auto qry = qs->newQuery(queryString);
+      auto queryString = "select * from /" + regionNamesAuth[0];
 
-      std::shared_ptr<SelectResults> results;
+      auto&& qry = qs->newQuery(queryString);
       printf(" before query executing\n");
-      results = qry->execute(std::chrono::seconds(850));
+      auto&& results = qry->execute(std::chrono::seconds(850));
       LOG("Query completed successfully");
 
-      sprintf(queryString, "select * from /%s", regionNamesAuth[0]);
-      CqAttributesFactory cqFac;
-      auto cqAttrs = cqFac.create();
-      auto cqQry = qs->newCq("cq_security", queryString, cqAttrs);
+      auto&& cqAttrs = CqAttributesFactory{}.create();
+      auto&& cqQry = qs->newCq("cq_security", queryString, cqAttrs);
       cqQry->execute();
       cqQry->close();
       LOG("CQ completed successfully");
 
-      if (pool != nullptr) {
+      if (pool) {
         FunctionService::onServer(virtualCache)
             .execute("securityTest")
             ->getResult();
@@ -447,7 +443,7 @@ DUNIT_TASK_DEFINITION(ADMIN_CLIENT, StepOne)
                               false, -1, true, 0);
       char buf[100] = {'\0'};
       static int indexForPool = 0;
-      sprintf(buf, "%s_%d", regionNamesAuth[0], indexForPool++);
+      sprintf(buf, "%s_%d", regionNamesAuth[0].c_str(), indexForPool++);
       pool = getPool(buf);
       LOG(" 6");
       if (pool != nullptr) {
@@ -615,10 +611,9 @@ DUNIT_TASK_DEFINITION(WRITER_CLIENT, StepTwo)
       auto virtualCache = getVirtualCache(userCreds, pool);
       auto queryService = virtualCache.getQueryService();
 
-      char queryString[100];
-      sprintf(queryString, "select * from /%s", regionNamesAuth[0]);
-      CqAttributesFactory cqFac;
-      auto cqAttrs = cqFac.create();
+      auto queryString = "select * from /" + regionNamesAuth[0];
+
+      auto cqAttrs = CqAttributesFactory{}.create();
       auto qry = queryService->newCq("cq_security", queryString, cqAttrs);
       queryService->executeCqs();
       FAIL("CQ should not have completed successfully");
diff --git a/cppcache/internal/CMakeLists.txt b/cppcache/internal/CMakeLists.txt
new file mode 100644
index 0000000..07a013c
--- /dev/null
+++ b/cppcache/internal/CMakeLists.txt
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+add_library(internal INTERFACE)
+target_include_directories(internal INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/cppcache/internal/hacks/range.h b/cppcache/internal/hacks/range.h
new file mode 100644
index 0000000..030263f
--- /dev/null
+++ b/cppcache/internal/hacks/range.h
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#ifndef INTERNAL_HACKS_RANGE_H
+#define INTERNAL_HACKS_RANGE_H
+
+namespace hacks {
+
+/**
+ * Fixes for-range loop bug in Solaris Studio 12.6. Does not generate correctly
+ * where begin/end methods are virtual.
+ *
+ * @see https://community.oracle.com/message/14647160#14647160
+ */
+
+#if defined(__SUNPRO_CC) && __SUNPRO_CC <= 0x5150
+
+template <class Range>
+struct range_wrapper {
+  Range&& range_;
+  range_wrapper(Range&& range) : range_(range) {
+  }
+  inline decltype(range_.begin()) begin() {
+    return range_.begin();
+  }
+  inline decltype(range_.end()) end() {
+    return range_.end();
+  }
+};
+
+template <class Range>
+inline range_wrapper<Range> range(Range&& range) {
+  return range_wrapper<Range>(std::forward<Range>(range));
+}
+
+#else
+
+template <class Range>
+inline Range range(Range&& range) {
+  return std::forward<Range>(range);
+}
+
+#endif
+
+}  // namespace hacks
+
+#endif //INTERNAL_HACKS_RANGE_H
diff --git a/cppcache/src/ResultSetImpl.cpp b/cppcache/src/ResultSetImpl.cpp
index 00b74c7..8d7c63b 100644
--- a/cppcache/src/ResultSetImpl.cpp
+++ b/cppcache/src/ResultSetImpl.cpp
@@ -24,11 +24,7 @@
 using namespace apache::geode::client;
 
 ResultSetImpl::ResultSetImpl(const std::shared_ptr<CacheableVector>& response)
-    : m_resultSetVector(response)
-// UNUSED , m_nextIndex(0)
-{}
-
-bool ResultSetImpl::isModifiable() const { return false; }
+    : m_resultSetVector(response) {}
 
 size_t ResultSetImpl::size() const {
   return static_cast<int32_t>(m_resultSetVector->size());
@@ -42,14 +38,10 @@ const std::shared_ptr<Serializable> ResultSetImpl::operator[](
   return m_resultSetVector->operator[](index);
 }
 
-SelectResultsIterator ResultSetImpl::getIterator() {
-  return SelectResultsIterator(m_resultSetVector, shared_from_this());
-}
-
-SelectResults::Iterator ResultSetImpl::begin() const {
+SelectResults::iterator ResultSetImpl::begin() {
   return m_resultSetVector->begin();
 }
 
-SelectResults::Iterator ResultSetImpl::end() const {
+SelectResults::iterator ResultSetImpl::end() {
   return m_resultSetVector->end();
 }
diff --git a/cppcache/src/ResultSetImpl.hpp b/cppcache/src/ResultSetImpl.hpp
index 278b84e..1c103a5 100644
--- a/cppcache/src/ResultSetImpl.hpp
+++ b/cppcache/src/ResultSetImpl.hpp
@@ -1,8 +1,3 @@
-#pragma once
-
-#ifndef GEODE_RESULTSETIMPL_H_
-#define GEODE_RESULTSETIMPL_H_
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -20,47 +15,38 @@
  * limitations under the License.
  */
 
-#include <geode/internal/geode_globals.hpp>
-#include <geode/ExceptionTypes.hpp>
+#pragma once
+
+#ifndef GEODE_RESULTSETIMPL_H_
+#define GEODE_RESULTSETIMPL_H_
+
+#include <memory>
 
+#include <geode/internal/geode_globals.hpp>
 #include <geode/ResultSet.hpp>
 #include <geode/CacheableBuiltins.hpp>
-#include <geode/SelectResultsIterator.hpp>
-
-/**
- * @file
- */
 
 namespace apache {
 namespace geode {
 namespace client {
 
-class APACHE_GEODE_EXPORT ResultSetImpl
-    : public ResultSet,
-      public std::enable_shared_from_this<ResultSetImpl> {
+class APACHE_GEODE_EXPORT ResultSetImpl : public ResultSet {
  public:
   ResultSetImpl(const std::shared_ptr<CacheableVector>& response);
-
-  bool isModifiable() const override;
+  ~ResultSetImpl() noexcept override = default;
 
   size_t size() const override;
 
   const std::shared_ptr<Serializable> operator[](size_t index) const override;
 
-  SelectResultsIterator getIterator() override;
-
-  /** Get an iterator pointing to the start of vector. */
-  virtual SelectResults::Iterator begin() const override;
+  SelectResults::iterator begin() override;
 
-  /** Get an iterator pointing to the end of vector. */
-  virtual SelectResults::Iterator end() const override;
-
-  ~ResultSetImpl() noexcept override {}
+  SelectResults::iterator end() override;
 
  private:
   std::shared_ptr<CacheableVector> m_resultSetVector;
-  // UNUSED int32_t m_nextIndex;
 };
+
 }  // namespace client
 }  // namespace geode
 }  // namespace apache
diff --git a/cppcache/src/SelectResultsIterator.cpp b/cppcache/src/SelectResultsIterator.cpp
deleted file mode 100644
index 841bf79..0000000
--- a/cppcache/src/SelectResultsIterator.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @file
- */
-
-#include <geode/SelectResultsIterator.hpp>
-
-namespace apache {
-namespace geode {
-namespace client {
-
-SelectResultsIterator::SelectResultsIterator(
-    const std::shared_ptr<CacheableVector>& vectorSR,
-    std::shared_ptr<SelectResults> srp)
-    : m_vectorSR(vectorSR), m_nextIndex(0), m_srp(srp) {}
-
-bool SelectResultsIterator::hasNext() const {
-  return m_nextIndex < m_vectorSR->size();
-}
-
-const std::shared_ptr<Serializable> SelectResultsIterator::next() {
-  if (!hasNext()) return nullptr;
-
-  return m_vectorSR->operator[](m_nextIndex++);
-}
-
-bool SelectResultsIterator::moveNext() {
-  if (hasNext()) {
-    m_nextIndex++;
-    return true;
-  } else {
-    return false;
-  }
-}
-
-const std::shared_ptr<Serializable> SelectResultsIterator::current() const {
-  if (m_nextIndex == 0 || m_nextIndex > m_vectorSR->size()) return nullptr;
-
-  return m_vectorSR->operator[](m_nextIndex - 1);
-}
-
-void SelectResultsIterator::reset() { m_nextIndex = 0; }
-}  // namespace client
-}  // namespace geode
-}  // namespace apache
diff --git a/cppcache/src/Struct.cpp b/cppcache/src/Struct.cpp
index 71e078b..39dcd0e 100644
--- a/cppcache/src/Struct.cpp
+++ b/cppcache/src/Struct.cpp
@@ -25,15 +25,9 @@ namespace apache {
 namespace geode {
 namespace client {
 
-Struct::Struct() : m_parent(nullptr), m_lastAccessIndex(0) {}
-
 Struct::Struct(StructSet* ssPtr,
-               std::vector<std::shared_ptr<Serializable>>& fieldValues) {
-  m_parent = ssPtr;
-  m_fieldValues.insert(m_fieldValues.end(), fieldValues.begin(),
-                       fieldValues.end());
-  m_lastAccessIndex = 0;
-}
+               std::vector<std::shared_ptr<Serializable>>& fieldValues)
+    : m_parent(ssPtr), m_fieldValues(fieldValues) {}
 
 void Struct::skipClassName(DataInput& input) {
   if (input.read() == GeodeTypeIdsImpl::Class) {
@@ -57,7 +51,7 @@ void Struct::toData(DataOutput&) const {
   throw UnsupportedOperationException("Struct::toData: should not be called.");
 }
 
-int32_t Struct::length() const {
+int32_t Struct::size() const {
   return static_cast<int32_t>(m_fieldValues.size());
 }
 
@@ -69,7 +63,7 @@ void Struct::fromData(DataInput& input) {
 
   m_parent = nullptr;
   for (int32_t i = 0; i < numOfFields; i++) {
-    m_fieldNames.emplace(input.readString(), i);
+    m_fieldNameToIndex.emplace(input.readString(), i);
   }
   int32_t lengthForTypes = input.readArrayLength();
   skipClassName(input);
@@ -87,10 +81,10 @@ void Struct::fromData(DataInput& input) {
 }
 
 const std::string& Struct::getFieldName(const int32_t index) const {
-  if (m_parent != nullptr) {
+  if (m_parent) {
     return m_parent->getFieldName(index);
   } else {
-    for (const auto& iter : m_fieldNames) {
+    for (const auto& iter : m_fieldNameToIndex) {
       if (iter.second == index) return (iter.first);
     }
   }
@@ -109,14 +103,14 @@ const std::shared_ptr<Serializable> Struct::operator[](int32_t index) const {
 const std::shared_ptr<Serializable> Struct::operator[](
     const std::string& fieldName) const {
   size_t index;
-  if (m_parent == nullptr) {
-    const auto& iter = m_fieldNames.find(fieldName);
-    if (iter == m_fieldNames.end()) {
+  if (m_parent) {
+    index = m_parent->getFieldIndex(fieldName);
+  } else {
+    const auto& iter = m_fieldNameToIndex.find(fieldName);
+    if (iter == m_fieldNameToIndex.end()) {
       throw OutOfRangeException("Struct: fieldName not found.");
     }
     index = iter->second;
-  } else {
-    index = m_parent->getFieldIndex(fieldName);
   }
   return m_fieldValues[index];
 }
@@ -125,17 +119,9 @@ const std::shared_ptr<StructSet> Struct::getStructSet() const {
   return std::shared_ptr<StructSet>(m_parent);
 }
 
-bool Struct::hasNext() const {
-  if (m_lastAccessIndex + 1 <= m_fieldValues.size()) {
-    return true;
-  }
-  return false;
-}
+Struct::iterator Struct::begin() { return m_fieldValues.begin(); }
 
-const std::shared_ptr<Serializable> Struct::next() {
-  m_lastAccessIndex++;
-  return m_fieldValues[m_lastAccessIndex - 1];
-}
+Struct::iterator Struct::end() { return m_fieldValues.end(); }
 
 std::shared_ptr<Serializable> Struct::createDeserializable() {
   return std::make_shared<Struct>();
diff --git a/cppcache/src/StructSetImpl.cpp b/cppcache/src/StructSetImpl.cpp
index 883e80b..3240d01 100644
--- a/cppcache/src/StructSetImpl.cpp
+++ b/cppcache/src/StructSetImpl.cpp
@@ -27,8 +27,6 @@ namespace client {
 
 StructSetImpl::StructSetImpl(const std::shared_ptr<CacheableVector>& response,
                              const std::vector<std::string>& fieldNames) {
-  m_nextIndex = 0;
-
   int32_t i = 0;
   for (auto&& fieldName : fieldNames) {
     LOGDEBUG("StructSetImpl: pushing fieldName = %s with index = %d",
@@ -36,39 +34,32 @@ StructSetImpl::StructSetImpl(const std::shared_ptr<CacheableVector>& response,
     m_fieldNameIndexMap.emplace(fieldName, i++);
   }
 
-  auto numOfValues = response->size();
-  size_t valStoredCnt = 0;
-
+  const auto numOfValues = response->size();
   const auto numOfFields = fieldNames.size();
-  m_structVector = CacheableVector::create();
+  m_structVector.reserve(numOfValues / numOfFields);
+
+  size_t valStoredCnt = 0;
   while (valStoredCnt < numOfValues) {
     std::vector<std::shared_ptr<Serializable>> tmpVec;
     for (size_t i = 0; i < numOfFields; i++) {
       tmpVec.push_back(response->operator[](valStoredCnt++));
     }
-    auto siPtr = std::make_shared<Struct>(this, tmpVec);
-    m_structVector->push_back(siPtr);
+    m_structVector.push_back(std::make_shared<Struct>(this, tmpVec));
   }
 }
 
-bool StructSetImpl::isModifiable() const { return false; }
-
-size_t StructSetImpl::size() const { return m_structVector->size(); }
+size_t StructSetImpl::size() const { return m_structVector.size(); }
 
 const std::shared_ptr<Serializable> StructSetImpl::operator[](
     size_t index) const {
-  if (index >= m_structVector->size()) {
+  if (index >= m_structVector.size()) {
     throw IllegalArgumentException("Index out of bounds");
   }
 
-  return m_structVector->operator[](index);
-}
-
-SelectResultsIterator StructSetImpl::getIterator() {
-  return SelectResultsIterator(m_structVector, shared_from_this());
+  return m_structVector.operator[](index);
 }
 
-size_t StructSetImpl::getFieldIndex(const std::string& fieldname) {
+int32_t StructSetImpl::getFieldIndex(const std::string& fieldname) {
   const auto& iter = m_fieldNameIndexMap.find(fieldname);
   if (iter != m_fieldNameIndexMap.end()) {
     return iter->second;
@@ -85,13 +76,11 @@ const std::string& StructSetImpl::getFieldName(int32_t index) {
   throw std::out_of_range("Struct: fieldName not found.");
 }
 
-SelectResults::Iterator StructSetImpl::begin() const {
-  return m_structVector->begin();
+SelectResults::iterator StructSetImpl::begin() {
+  return m_structVector.begin();
 }
 
-SelectResults::Iterator StructSetImpl::end() const {
-  return m_structVector->end();
-}
+SelectResults::iterator StructSetImpl::end() { return m_structVector.end(); }
 
 }  // namespace client
 }  // namespace geode
diff --git a/cppcache/src/StructSetImpl.hpp b/cppcache/src/StructSetImpl.hpp
index c1e40a0..d5cd09f 100644
--- a/cppcache/src/StructSetImpl.hpp
+++ b/cppcache/src/StructSetImpl.hpp
@@ -1,8 +1,3 @@
-#pragma once
-
-#ifndef GEODE_STRUCTSETIMPL_H_
-#define GEODE_STRUCTSETIMPL_H_
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -20,59 +15,49 @@
  * limitations under the License.
  */
 
-#include <geode/internal/geode_globals.hpp>
-
-#include <geode/StructSet.hpp>
-#include <geode/Struct.hpp>
-#include <geode/CacheableBuiltins.hpp>
+#pragma once
 
-#include <geode/SelectResultsIterator.hpp>
+#ifndef GEODE_STRUCTSETIMPL_H_
+#define GEODE_STRUCTSETIMPL_H_
 
 #include <string>
-#include <map>
+#include <unordered_map>
+#include <memory>
 
-/**
- * @file
- */
+#include <geode/internal/geode_globals.hpp>
+#include <geode/StructSet.hpp>
+#include <geode/Struct.hpp>
+#include <geode/CacheableBuiltins.hpp>
 
 namespace apache {
 namespace geode {
 namespace client {
 
-class APACHE_GEODE_EXPORT StructSetImpl
-    : public StructSet,
-      public std::enable_shared_from_this<StructSetImpl> {
+class APACHE_GEODE_EXPORT StructSetImpl : public StructSet {
  public:
   StructSetImpl(const std::shared_ptr<CacheableVector>& values,
                 const std::vector<std::string>& fieldNames);
 
-  bool isModifiable() const override;
+  ~StructSetImpl() noexcept override = default;
 
   size_t size() const override;
 
   const std::shared_ptr<Serializable> operator[](size_t index) const override;
 
-  size_t getFieldIndex(const std::string& fieldname) override;
+  int32_t getFieldIndex(const std::string& fieldname) override;
 
   const std::string& getFieldName(int32_t index) override;
 
-  SelectResultsIterator getIterator() override;
-
-  /** Get an iterator pointing to the start of vector. */
-  virtual SelectResults::Iterator begin() const override;
-
-  /** Get an iterator pointing to the end of vector. */
-  virtual SelectResults::Iterator end() const override;
+  SelectResults::iterator begin() override;
 
-  ~StructSetImpl() noexcept override {}
+  SelectResults::iterator end() override;
 
  private:
-  std::shared_ptr<CacheableVector> m_structVector;
+  std::vector<std::shared_ptr<Serializable>> m_structVector;
 
-  std::map<std::string, int32_t> m_fieldNameIndexMap;
-
-  size_t m_nextIndex;
+  std::unordered_map<std::string, int32_t> m_fieldNameIndexMap;
 };
+
 }  // namespace client
 }  // namespace geode
 }  // namespace apache
diff --git a/cppcache/src/ThinClientRegion.cpp b/cppcache/src/ThinClientRegion.cpp
index 4bdf4ab..2a0b58e 100644
--- a/cppcache/src/ThinClientRegion.cpp
+++ b/cppcache/src/ThinClientRegion.cpp
@@ -19,7 +19,6 @@
 #include <limits>
 #include <regex>
 
-#include <geode/SelectResultsIterator.hpp>
 #include <geode/SystemProperties.hpp>
 #include <geode/PoolManager.hpp>
 #include <geode/UserFunctionExecutionException.hpp>
diff --git a/cppcache/test/CacheableKeyCreateTests.cpp b/cppcache/test/CacheableKeyCreateTests.cpp
index 5a1aea6..700ab11 100644
--- a/cppcache/test/CacheableKeyCreateTests.cpp
+++ b/cppcache/test/CacheableKeyCreateTests.cpp
@@ -73,6 +73,42 @@ TEST(CacheableKeyCreateTests, forArrayOf_wchar_t) {
   EXPECT_EQ(cacheableString->value(), "test");
 }
 
+TEST(CacheableKeyCreateTests, for_string) {
+  const auto cacheableKey = CacheableKey::create(std::string("test"));
+  ASSERT_TRUE(nullptr != cacheableKey);
+  auto&& cacheableString =
+      std::dynamic_pointer_cast<CacheableString>(cacheableKey);
+  ASSERT_TRUE(nullptr != cacheableString);
+  EXPECT_EQ(cacheableString->value(), "test");
+}
+
+TEST(CacheableKeyCreateTests, for_u16string) {
+  const auto cacheableKey = CacheableKey::create(std::u16string(u"test"));
+  ASSERT_TRUE(nullptr != cacheableKey);
+  auto&& cacheableString =
+      std::dynamic_pointer_cast<CacheableString>(cacheableKey);
+  ASSERT_TRUE(nullptr != cacheableString);
+  EXPECT_EQ(cacheableString->value(), "test");
+}
+
+TEST(CacheableKeyCreateTests, for_u32string) {
+  const auto cacheableKey = CacheableKey::create(std::u32string(U"test"));
+  ASSERT_TRUE(nullptr != cacheableKey);
+  auto&& cacheableString =
+      std::dynamic_pointer_cast<CacheableString>(cacheableKey);
+  ASSERT_TRUE(nullptr != cacheableString);
+  EXPECT_EQ(cacheableString->value(), "test");
+}
+
+TEST(CacheableKeyCreateTests, for_wstring) {
+  const auto cacheableKey = CacheableKey::create(std::wstring(L"test"));
+  ASSERT_TRUE(nullptr != cacheableKey);
+  auto&& cacheableString =
+      std::dynamic_pointer_cast<CacheableString>(cacheableKey);
+  ASSERT_TRUE(nullptr != cacheableString);
+  EXPECT_EQ(cacheableString->value(), "test");
+}
+
 TEST(CacheableKeyCreateTests, for_int8_t) {
   const auto cacheableKey = CacheableKey::create(static_cast<int8_t>(1));
   ASSERT_TRUE(nullptr != cacheableKey);
diff --git a/cppcache/test/StructSetTest.cpp b/cppcache/test/StructSetTest.cpp
index 3d883b2..836441b 100644
--- a/cppcache/test/StructSetTest.cpp
+++ b/cppcache/test/StructSetTest.cpp
@@ -81,3 +81,31 @@ TEST(StructSetTest, MissingFieldName) {
 
   ASSERT_THROW(ss.getFieldName(100), std::out_of_range);
 }
+
+TEST(StructSetTest, ForRange) {
+  auto values = CacheableVector::create();
+  std::vector<std::string> fieldNames;
+
+  size_t numOfFields = 10;
+
+  for (size_t i = 0; i < numOfFields; i++) {
+    std::string value = "value";
+    value += std::to_string(i);
+    std::string field = "field";
+    field += std::to_string(i);
+    values->push_back(CacheableString::create(value.c_str()));
+    fieldNames.push_back(field);
+  }
+
+  auto ss = StructSetImpl(values, fieldNames);
+
+  for(auto&& row : ss) {
+    auto rowStruct = std::dynamic_pointer_cast<Struct>(row);
+    ASSERT_NE(nullptr, rowStruct);
+
+    size_t i = 0;
+    for (auto&& column : *rowStruct) {
+      EXPECT_EQ("value" + std::to_string(i++), column->toString());
+    }
+  }
+}
diff --git a/tests/cli/NewFwkLib/CacheServer.cs b/tests/cli/NewFwkLib/CacheServer.cs
index 7d4565d..b0d61ac 100644
--- a/tests/cli/NewFwkLib/CacheServer.cs
+++ b/tests/cli/NewFwkLib/CacheServer.cs
@@ -3505,7 +3505,7 @@ public void DoVerifyQueryResult()
   FwkInfo("verifyQueryResult() called");
   string query = GetStringValue("query");
   IRegion<TKey, TVal> region = GetRegion();
-  Int32 resultSize = region.Count;
+  var resultSize = region.Count;
   bool isSerial = GetBoolValue("serialExecution");
   Int32 localInvalidate = 0;
   if (isSerial)
@@ -3533,7 +3533,7 @@ public void DoVerifyQueryResult()
       startTime = DateTime.Now;
       results = cq.ExecuteWithInitialResults(QueryResponseTimeout);
       elapsedTime = DateTime.Now - startTime;
-      if ((resultSize - localInvalidate) != results.Size)
+      if ((resultSize - localInvalidate) != (int) results.Size)
       {
         FwkSevere("ReadQueryString: Result size found {0}, expected {1}.",
            results.Size, (resultSize - localInvalidate));
diff --git a/tests/cli/NewFwkLib/QueryTest/QueryTests.cs b/tests/cli/NewFwkLib/QueryTest/QueryTests.cs
index b627995..e7a022a 100644
--- a/tests/cli/NewFwkLib/QueryTest/QueryTests.cs
+++ b/tests/cli/NewFwkLib/QueryTest/QueryTests.cs
@@ -560,7 +560,7 @@ namespace Apache.Geode.Client.FwkLib
       bool isCq = GetBoolValue("cq");
       do
       {
-        int resultSize = GetUIntValue(ResultSize);  // set the query result size in xml
+        var resultSize = (ulong) GetUIntValue(ResultSize);  // set the query result size in xml
         FwkInfo("ReadQueryString: Query String is: {0}, resultSize: {1}",
           query, resultSize);
         if (resultSize < 0)
diff --git a/tests/cli/QueryHelper/QueryHelperN.cs b/tests/cli/QueryHelper/QueryHelperN.cs
index 6b3b331..5eeb59b 100644
--- a/tests/cli/QueryHelper/QueryHelperN.cs
+++ b/tests/cli/QueryHelper/QueryHelperN.cs
@@ -304,11 +304,8 @@ namespace Apache.Geode.Client.Tests
 
       int foundRows = 0;
 
-      SelectResultsIterator<object> sr = resultset.GetIterator();
-      while (sr.HasNext)  
+      foreach (var ser in resultset)  
       {
-       //TVal ser = (TVal)sr.Next();
-        Object ser = sr.Next();
         if (ser == null)
         {
           Util.Log("QueryHelper.VerifyRS: Object is null.");
@@ -344,7 +341,7 @@ namespace Apache.Geode.Client.Tests
         }
 
         int foundFields = 0;
-        for (uint cols = 0; cols < si.Length; cols++)
+        for (int cols = 0; cols < si.Count; cols++)
         {
           //IGeodeSerializable field = si[cols];
           object field = (object)si[cols];
diff --git a/tests/cpp/fwklib/QueryHelper.hpp b/tests/cpp/fwklib/QueryHelper.hpp
index ff27f60..7e490a8 100644
--- a/tests/cpp/fwklib/QueryHelper.hpp
+++ b/tests/cpp/fwklib/QueryHelper.hpp
@@ -1053,8 +1053,7 @@ bool QueryHelper::verifySS(std::shared_ptr<SelectResults>& structSet,
 
     int foundFields = 0;
 
-    for (int32_t cols = 0; cols < siptr->length(); cols++) {
-      auto field = (*siptr)[cols];  // siptr->next();
+    for (auto&& field : *siptr) {
       foundFields++;
     }
 

-- 
To stop receiving notification emails like this one, please contact
jbarrett@apache.org.

Mime
View raw message