| /* |
| * 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. |
| */ |
| |
| using System; |
| |
| namespace Apache.Geode.Client.Tests |
| { |
| using Apache.Geode.DUnitFramework; |
| using Apache.Geode.Client; |
| //using Region = Apache.Geode.Client.IRegion<TKey, TVal>; |
| |
| /// <summary> |
| /// Helper class to populate regions and verify query results. |
| /// This class is intentionally not thread-safe. |
| /// </summary> |
| public class QueryHelper<TKey,TVal> |
| { |
| |
| #region Private members |
| |
| private int m_portfolioSetSize; |
| private int m_portfolioNumSets; |
| private int m_positionSetSize; |
| private int m_positionNumSets; |
| private Cache m_cache; |
| private static QueryHelper<TKey, TVal> m_instance = null; |
| |
| #endregion |
| |
| #region Public accessors |
| |
| public virtual int PortfolioSetSize |
| { |
| get |
| { |
| return m_portfolioSetSize; |
| } |
| } |
| |
| public virtual int PortfolioNumSets |
| { |
| get |
| { |
| return m_portfolioNumSets; |
| } |
| } |
| |
| public virtual int PositionSetSize |
| { |
| get |
| { |
| return m_positionSetSize; |
| } |
| } |
| |
| public virtual int PositionNumSets |
| { |
| get |
| { |
| return m_positionNumSets; |
| } |
| } |
| |
| #endregion |
| |
| private QueryHelper(Cache cache) |
| { |
| m_portfolioSetSize = 20; |
| m_portfolioNumSets = 1; |
| m_positionSetSize = 20; |
| m_positionNumSets = 1; |
| m_cache = cache; |
| } |
| |
| public static QueryHelper<TKey, TVal> GetHelper(Cache cache) |
| { |
| if (m_instance == null) |
| { |
| m_instance = new QueryHelper<TKey,TVal>(cache); |
| } |
| return m_instance; |
| } |
| |
| public virtual void PopulatePortfolioData(IRegion<TKey, TVal> region, int setSize, |
| int numSets) |
| { |
| PopulatePortfolioData(region, setSize, numSets, 1); |
| } |
| |
| public virtual void PopulatePortfolioData(IRegion<TKey, TVal> region, int setSize, |
| int numSets, int objSize) |
| { |
| PopulatePortfolioData(region, setSize, numSets, objSize, null); |
| } |
| public virtual void PopulatePortfolioPdxData(IRegion<TKey, TVal> region, int setSize, |
| int numSets) |
| { |
| PopulatePortfolioPdxData(region, setSize, numSets, 1); |
| } |
| |
| public virtual void PopulatePortfolioPdxData(IRegion<TKey, TVal> region, int setSize, |
| int numSets, int objSize) |
| { |
| PopulatePortfolioPdxData(region, setSize, numSets, objSize, null); |
| } |
| public virtual void PopulatePortfolioData(IRegion<TKey, TVal> region, int setSize, |
| int numSets, int objSize, string[] names) |
| { |
| Util.Log("QueryHelper.PopulatePortfolioData: putting for setSize={0}, numSets={1}, objSize={2}",setSize, numSets, objSize); |
| if(names == null) |
| { |
| Util.Log("QueryHelper.PopulatePortfolioData: names is null"); |
| } else |
| { |
| for(int i =0 ; i < names.Length; i++) |
| { |
| Util.Log("QueryHelper.PopulatePortfolioData: names[{0}]={1}", i, names[i]); |
| } |
| } |
| |
| Position.Count = 0; |
| |
| for (int set = 1; set <= numSets; set++) |
| { |
| for (int current = 1; current <= setSize; current++) |
| { |
| Portfolio portfolio = new Portfolio(current, objSize, names); |
| |
| TKey portfolioName = (TKey)(object)string.Format("port{0}-{1}", set, current); |
| //Util.Log("QueryHelper.PopulatePortfolioData: creating key = {0} and" |
| //+ " puting data.", portfolioName); |
| //Put operation |
| region[portfolioName] = (TVal)(object)portfolio; |
| } |
| } |
| |
| //m_portfolioSetSize = setSize; |
| //m_portfolioNumSets = numSets; |
| //m_objectSize = objSize; |
| |
| Util.Log("QueryHelper.PopulatePortfolioData: all puts done."); |
| } |
| public virtual void PopulatePortfolioPdxData(IRegion<TKey, TVal> region, int setSize, |
| int numSets, int objSize, string[] names) |
| { |
| Util.Log("QueryHelper.PopulatePortfolioPdxData: putting for setSize={0}, numSets={1}, objSize={2}", setSize, numSets, objSize); |
| if (names == null) |
| { |
| Util.Log("QueryHelper.PopulatePortfolioPdxData: names is null"); |
| } |
| else |
| { |
| for (int i = 0; i < names.Length; i++) |
| { |
| Util.Log("QueryHelper.PopulatePortfolioPdxData: names[{0}]={1}", i, names[i]); |
| } |
| } |
| |
| PositionPdx.Count = 0; |
| |
| for (int set = 1; set <= numSets; set++) |
| { |
| for (int current = 1; current <= setSize; current++) |
| { |
| PortfolioPdx portfolio = new PortfolioPdx(current, objSize, names); |
| |
| TKey portfolioName = (TKey)(object)string.Format("port{0}-{1}", set, current); |
| //Util.Log("QueryHelper.PopulatePortfolioData: creating key = {0} and" |
| //+ " puting data.", portfolioName); |
| //Put operation |
| region[portfolioName] = (TVal)(object)portfolio; |
| } |
| } |
| |
| //m_portfolioSetSize = setSize; |
| //m_portfolioNumSets = numSets; |
| //m_objectSize = objSize; |
| |
| Util.Log("QueryHelper.PopulatePortfolioPdxData: all puts done."); |
| } |
| public virtual void PopulatePositionData(IRegion<TKey, TVal> region, int setSize, |
| int numSets) |
| { |
| Util.Log("QueryHelper.PopulatePositionData: putting for setSize={0}, numSets={1}", |
| setSize, numSets); |
| |
| string[] secIds = Portfolio.SecIds; |
| int numSecIds = secIds.Length; |
| |
| for (int set = 1; set <= numSets; set++) |
| { |
| for (int current = 1; current <= setSize; current++) |
| { |
| Position pos = new Position(secIds[current % numSecIds], |
| current * 100); |
| |
| TKey posName = (TKey)(object)string.Format("pos{0}-{1}", set, current); |
| //Put Operation |
| region[posName] = (TVal)(object)pos; |
| } |
| } |
| //m_positionSetSize = setSize; |
| //m_positionNumSets = numSets; |
| |
| Util.Log("QueryHelper.PopulatePositionData: all puts done."); |
| } |
| public virtual void PopulatePositionPdxData(IRegion<TKey, TVal> region, int setSize, |
| int numSets) |
| { |
| Util.Log("QueryHelper.PopulatePositionPdxData: putting for setSize={0}, numSets={1}", |
| setSize, numSets); |
| |
| string[] secIds = PortfolioPdx.SecIds; |
| int numSecIds = secIds.Length; |
| |
| for (int set = 1; set <= numSets; set++) |
| { |
| for (int current = 1; current <= setSize; current++) |
| { |
| PositionPdx pos = new PositionPdx(secIds[current % numSecIds], |
| current * 100); |
| |
| TKey posName = (TKey)(object)string.Format("pos{0}-{1}", set, current); |
| //Util.Log("QueryHelper.PopulatePositionPdxData: creating key = {0} and" |
| //+ " puting data.", posName); |
| //Put Operation |
| region[posName] = (TVal)(object)pos; |
| } |
| } |
| //m_positionSetSize = setSize; |
| //m_positionNumSets = numSets; |
| |
| Util.Log("QueryHelper.PopulatePositionPdxData: all puts done."); |
| } |
| public virtual void DestroyPortfolioOrPositionData(IRegion<TKey, TVal> region, |
| int setSize, int numSets, string objectType) |
| { |
| string prefix = string.Empty; |
| |
| if (objectType.Equals("Portfolio") || objectType.Equals("PortfolioPdx")) |
| { |
| prefix = "port"; |
| } |
| else // if (objectType.Equals("Position")) |
| { |
| prefix = "pos"; |
| } |
| |
| for (int set = 1; set <= numSets; set++) |
| { |
| for (int current = 1; current <= setSize; current++) |
| { |
| string keyname = string.Empty; |
| keyname = prefix + set + "-" + current; // "port1-1" or "pos1-1" for example |
| TKey key = (TKey)(object)keyname; |
| region.Remove(key); |
| } |
| } |
| } |
| |
| public virtual void InvalidatePortfolioOrPositionData(IRegion<TKey, TVal> region, |
| int setSize, int numSets, string objectType) |
| { |
| string prefix = string.Empty; |
| |
| if (objectType.Equals("Portfolio") || objectType.Equals("PortfolioPdx")) |
| { |
| prefix = "port"; |
| } |
| else // if (objectType.Equals("Position")) |
| { |
| prefix = "pos"; |
| } |
| |
| for (int set = 1; set <= numSets; set++) |
| { |
| for (int current = 1; current <= setSize; current++) |
| { |
| string keyname = string.Empty; |
| keyname = prefix + set + "-" + current; // "port1-1" or "pos1-1" for example |
| TKey key = (TKey)(object)keyname; |
| region.Invalidate(key); |
| } |
| } |
| } |
| |
| public virtual bool VerifyRS(ISelectResults<object> resultset, int expectedRows) |
| { |
| if (resultset == null) return false; |
| |
| int foundRows = 0; |
| |
| foreach (var ser in resultset) |
| { |
| if (ser == null) |
| { |
| Util.Log("QueryHelper.VerifyRS: Object is null."); |
| return false; |
| } |
| |
| foundRows++; |
| } |
| Util.Log("QueryHelper.VerifyRS: found rows {0}, expected {1}", |
| foundRows, expectedRows); |
| return (foundRows == expectedRows); |
| } |
| |
| public virtual bool VerifySS(ISelectResults<object> structset, int expectedRows, |
| int expectedFields) |
| { |
| if (structset == null) |
| { |
| if (expectedRows == 0 && expectedFields == 0) |
| return true; //quite possible we got a null set back. |
| return false; |
| } |
| |
| int foundRows = 0; |
| foreach (Struct si in structset) |
| { |
| foundRows++; |
| |
| if (si == null) |
| { |
| Util.Log("QueryHelper.VerifySS: Struct is null."); |
| return false; |
| } |
| |
| int foundFields = 0; |
| for (int cols = 0; cols < si.Count; cols++) |
| { |
| //ISerializable field = si[cols]; |
| object field = si[cols]; |
| foundFields++; |
| } |
| |
| if (foundFields != expectedFields) |
| { |
| Util.Log("QueryHelper.VerifySS: found fields {0}, expected" |
| + " fields {1}.", foundFields, expectedFields); |
| return false; |
| } |
| } |
| if (foundRows != expectedRows) |
| { |
| Util.Log("QueryHelper.VerifySS: rows fields {0}, expected rows {1}.", |
| foundRows, expectedRows); |
| return false; |
| } |
| return true; |
| } |
| |
| public bool IsExpectedRowsConstantRS(int queryindex) |
| { |
| foreach (int constantIndex in QueryStatics.ConstantExpectedRowsRS) |
| { |
| if (queryindex == constantIndex) |
| { |
| Util.Log("Index {0} is having constant rows.", constantIndex); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public bool IsExpectedRowsConstantPQRS(int queryindex) |
| { |
| foreach (int constantIndex in QueryStatics.ConstantExpectedRowsPQRS) |
| { |
| if (queryindex == constantIndex) |
| { |
| Util.Log("Index {0} is having constant rows.", constantIndex); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public bool IsExpectedRowsConstantSS(int queryindex) |
| { |
| foreach (int constantIndex in QueryStatics.ConstantExpectedRowsSS) |
| { |
| if (queryindex == constantIndex) |
| { |
| Util.Log("Index {0} is having constant rows.", constantIndex); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public bool IsExpectedRowsConstantPQSS(int queryindex) |
| { |
| foreach (int constantIndex in QueryStatics.ConstantExpectedRowsPQSS) |
| { |
| if (queryindex == constantIndex) |
| { |
| Util.Log("Index {0} is having constant rows.", constantIndex); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public bool IsExpectedRowsConstantCQRS(int queryindex) |
| { |
| foreach (int constantIndex in QueryStatics.ConstantExpectedRowsCQRS) |
| if (queryindex == constantIndex) |
| { |
| Util.Log("Index {0} is having constant rows.", constantIndex); |
| return true; |
| } |
| |
| return false; |
| } |
| |
| public void PopulateRangePositionData(IRegion<TKey, TVal> region, int start, int end) |
| { |
| for (int i = start; i <= end; i++) |
| { |
| TVal pos = (TVal)(object)new Position(i); |
| TKey key = (TKey)(object)string.Format("pos{0}", i); |
| region[key] = pos; |
| } |
| } |
| public void PopulateRangePositionPdxData(IRegion<TKey, TVal> region, int start, int end) |
| { |
| for (int i = start; i <= end; i++) |
| { |
| TVal pos = (TVal)(object)new PositionPdx(i); |
| TKey key = (TKey)(object)string.Format("pos{0}", i); |
| region[key] = pos; |
| } |
| } |
| public bool CompareTwoPositionObjects(TVal pos1, TVal pos2) |
| { |
| Position p1 = pos1 as Position; |
| Position p2 = pos2 as Position; |
| |
| if (p1 == null || p2 == null) |
| { |
| Util.Log("The object(s) passed are not of Position type"); |
| return false; |
| } |
| |
| DataOutput o1 = m_cache.CreateDataOutput(); |
| DataOutput o2 = m_cache.CreateDataOutput(); |
| |
| p1.ToData(o1); |
| p2.ToData(o2); |
| |
| var len1 = o1.BufferLength; |
| var len2 = o2.BufferLength; |
| |
| if (len1 != len2) |
| { |
| return false; |
| } |
| |
| byte[] ptr1 = o1.GetBuffer(); |
| byte[] ptr2 = o2.GetBuffer(); |
| |
| if (ptr1.Length != ptr2.Length) |
| { |
| return false; |
| } |
| |
| for (int i = ptr1.Length; i < ptr1.Length; i++) |
| { |
| if (ptr1[i] != ptr2[i]) |
| { |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| |
| public TVal GetExactPositionObject(int iForExactPosObject) |
| { |
| return (TVal)(object)new Position(iForExactPosObject); |
| } |
| public TVal GetExactPositionPdxObject(int iForExactPosObject) |
| { |
| return (TVal)(object)new PositionPdx(iForExactPosObject); |
| } |
| public TVal GetCachedPositionObject(IRegion<TKey, TVal> region, int iForExactPosObject) |
| { |
| TKey key = (TKey)(object)string.Format("pos{0}", iForExactPosObject); |
| return region[key]; |
| } |
| |
| public void PutExactPositionObject(IRegion<TKey, TVal> region, int iForExactPosObject) |
| { |
| TKey key = (TKey)(object)string.Format("pos{0}", iForExactPosObject); |
| region[key] = (TVal)(object)new Position(iForExactPosObject); |
| } |
| public void PutExactPositionPdxObject(IRegion<TKey, TVal> region, int iForExactPosObject) |
| { |
| TKey key = (TKey)(object)string.Format("pos{0}", iForExactPosObject); |
| region[key] = (TVal)(object)new PositionPdx(iForExactPosObject); |
| } |
| } |
| } |