blob: 0eccf5d9a970ed0fe54248992ee9dc9da25a4b8a [file] [log] [blame]
/*
* 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);
}
}
}