Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / Map / ViewGeneration / QueryRewriting / RewritingProcessor.cs / 1 / RewritingProcessor.cs
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Text;
namespace System.Data.Mapping.ViewGeneration.QueryRewriting
{
internal abstract class TileProcessor
{
internal abstract bool IsEmpty(T_Tile tile);
internal abstract T_Tile Union(T_Tile a, T_Tile b);
internal abstract T_Tile Join(T_Tile a, T_Tile b);
internal abstract T_Tile AntiSemiJoin(T_Tile a, T_Tile b);
internal abstract T_Tile GetArg1(T_Tile tile);
internal abstract T_Tile GetArg2(T_Tile tile);
internal abstract TileOpKind GetOpKind(T_Tile tile);
}
internal class RewritingProcessor : TileProcessor where T_Tile : class
{
public double PERMUTE_FRACTION = 0.0;
public int MIN_PERMUTATIONS = 0;
public int MAX_PERMUTATIONS = 0;
public bool REORDER_VIEWS = false;
private int m_numSATChecks;
private int m_numIntersection;
private int m_numDifference;
private int m_numUnion;
private int m_numErrors;
private TileProcessor m_tileProcessor;
public RewritingProcessor(TileProcessor tileProcessor)
{
m_tileProcessor = tileProcessor;
}
internal TileProcessor TileProcessor
{
get { return m_tileProcessor; }
}
public void GetStatistics(out int numSATChecks, out int numIntersection, out int numUnion, out int numDifference, out int numErrors)
{
numSATChecks = m_numSATChecks;
numIntersection = m_numIntersection;
numUnion = m_numUnion;
numDifference = m_numDifference;
numErrors = m_numErrors;
}
public void PrintStatistics()
{
Console.WriteLine("{0} containment checks, {4} set operations ({1} intersections + {2} unions + {3} differences)",
m_numSATChecks, m_numIntersection, m_numUnion, m_numDifference,
m_numIntersection + m_numUnion + m_numDifference);
Console.WriteLine("{0} errors", m_numErrors);
}
internal override T_Tile GetArg1(T_Tile tile)
{
return m_tileProcessor.GetArg1(tile);
}
internal override T_Tile GetArg2(T_Tile tile)
{
return m_tileProcessor.GetArg2(tile);
}
internal override TileOpKind GetOpKind(T_Tile tile)
{
return m_tileProcessor.GetOpKind(tile);
}
internal override bool IsEmpty(T_Tile a)
{
m_numSATChecks++;
return m_tileProcessor.IsEmpty(a);
}
public bool IsDisjointFrom(T_Tile a, T_Tile b)
{
return m_tileProcessor.IsEmpty(Join(a, b));
}
internal bool IsContainedIn(T_Tile a, T_Tile b)
{
T_Tile difference = AntiSemiJoin(a, b);
return IsEmpty(difference);
}
internal bool IsEquivalentTo(T_Tile a, T_Tile b)
{
bool aInB = IsContainedIn(a, b);
bool bInA = IsContainedIn(b, a);
return aInB && bInA;
}
internal override T_Tile Union(T_Tile a, T_Tile b)
{
m_numUnion++;
return m_tileProcessor.Union(a, b);
}
internal override T_Tile Join(T_Tile a, T_Tile b)
{
if (a == null)
{
return b;
}
m_numIntersection++;
return m_tileProcessor.Join(a, b);
}
internal override T_Tile AntiSemiJoin(T_Tile a, T_Tile b)
{
m_numDifference++;
return m_tileProcessor.AntiSemiJoin(a, b);
}
public void AddError()
{
m_numErrors++;
}
public int CountOperators(T_Tile query)
{
int count = 0;
if (query != null)
{
if (GetOpKind(query) != TileOpKind.Named)
{
count++;
count += CountOperators(GetArg1(query));
count += CountOperators(GetArg2(query));
}
}
return count;
}
public int CountViews(T_Tile query)
{
HashSet views = new HashSet();
GatherViews(query, views);
return views.Count;
}
public void GatherViews(T_Tile rewriting, HashSet views)
{
if (rewriting != null)
{
if (GetOpKind(rewriting) == TileOpKind.Named)
{
views.Add(rewriting);
}
else
{
GatherViews(GetArg1(rewriting), views);
GatherViews(GetArg2(rewriting), views);
}
}
}
public static IEnumerable AllButOne(IEnumerable list, int toSkipPosition)
{
int valuePosition = 0;
foreach (T value in list)
{
if (valuePosition++ != toSkipPosition)
{
yield return value;
}
}
}
public static IEnumerable Concat(T value, IEnumerable rest)
{
yield return value;
foreach (T restValue in rest)
{
yield return restValue;
}
}
public static IEnumerable> Permute(IEnumerable list)
{
IEnumerable rest = null;
int valuePosition = 0;
foreach (T value in list)
{
rest = AllButOne(list, valuePosition++);
foreach (IEnumerable restPermutation in Permute(rest))
{
yield return Concat(value, restPermutation);
}
}
if (rest == null)
{
yield return list; // list is empty enumeration
}
}
static Random rnd = new Random(1507);
public static List RandomPermutation(IEnumerable input)
{
List output = new List(input);
for (int i = 0; i < output.Count; i++)
{
int j = rnd.Next(output.Count);
T tmp = output[i];
output[i] = output[j];
output[j] = tmp;
}
return output;
}
public static IEnumerable Reverse(IEnumerable input, HashSet filter)
{
List output = new List(input);
output.Reverse();
foreach (T t in output)
{
if (filter.Contains(t))
{
yield return t;
}
}
}
public bool RewriteQuery(T_Tile toFill, T_Tile toAvoid, IEnumerable views, out T_Tile rewriting)
{
if (RewriteQueryOnce(toFill, toAvoid, views, out rewriting))
{
HashSet usedViews = new HashSet();
GatherViews(rewriting, usedViews);
int opCount = CountOperators(rewriting);
// try several permutations of views, pick one with fewer operators
T_Tile newRewriting;
int permuteTries = 0;
int numPermutations = Math.Min(MAX_PERMUTATIONS, Math.Max(MIN_PERMUTATIONS, (int)(usedViews.Count * PERMUTE_FRACTION)));
while (permuteTries++ < numPermutations)
{
IEnumerable permutedViews;
if (permuteTries == 1)
{
permutedViews = Reverse(views, usedViews);
}
else
{
permutedViews = RandomPermutation(usedViews); // Tradeoff: views vs. usedViews!
}
bool succeeded = RewriteQueryOnce(toFill, toAvoid, permutedViews, out newRewriting);
Debug.Assert(succeeded);
int newOpCount = CountOperators(newRewriting);
if (newOpCount < opCount)
{
opCount = newOpCount;
rewriting = newRewriting;
}
HashSet newUsedViews = new HashSet();
GatherViews(newRewriting, newUsedViews);
usedViews = newUsedViews; // can only be fewer!
}
return true;
}
return false;
}
public bool RewriteQueryOnce(T_Tile toFill, T_Tile toAvoid, IEnumerable views, out T_Tile rewriting)
{
List viewList = new List(views);
return RewritingPass.RewriteQuery(toFill, toAvoid, out rewriting, viewList, this);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Text;
namespace System.Data.Mapping.ViewGeneration.QueryRewriting
{
internal abstract class TileProcessor
{
internal abstract bool IsEmpty(T_Tile tile);
internal abstract T_Tile Union(T_Tile a, T_Tile b);
internal abstract T_Tile Join(T_Tile a, T_Tile b);
internal abstract T_Tile AntiSemiJoin(T_Tile a, T_Tile b);
internal abstract T_Tile GetArg1(T_Tile tile);
internal abstract T_Tile GetArg2(T_Tile tile);
internal abstract TileOpKind GetOpKind(T_Tile tile);
}
internal class RewritingProcessor : TileProcessor where T_Tile : class
{
public double PERMUTE_FRACTION = 0.0;
public int MIN_PERMUTATIONS = 0;
public int MAX_PERMUTATIONS = 0;
public bool REORDER_VIEWS = false;
private int m_numSATChecks;
private int m_numIntersection;
private int m_numDifference;
private int m_numUnion;
private int m_numErrors;
private TileProcessor m_tileProcessor;
public RewritingProcessor(TileProcessor tileProcessor)
{
m_tileProcessor = tileProcessor;
}
internal TileProcessor TileProcessor
{
get { return m_tileProcessor; }
}
public void GetStatistics(out int numSATChecks, out int numIntersection, out int numUnion, out int numDifference, out int numErrors)
{
numSATChecks = m_numSATChecks;
numIntersection = m_numIntersection;
numUnion = m_numUnion;
numDifference = m_numDifference;
numErrors = m_numErrors;
}
public void PrintStatistics()
{
Console.WriteLine("{0} containment checks, {4} set operations ({1} intersections + {2} unions + {3} differences)",
m_numSATChecks, m_numIntersection, m_numUnion, m_numDifference,
m_numIntersection + m_numUnion + m_numDifference);
Console.WriteLine("{0} errors", m_numErrors);
}
internal override T_Tile GetArg1(T_Tile tile)
{
return m_tileProcessor.GetArg1(tile);
}
internal override T_Tile GetArg2(T_Tile tile)
{
return m_tileProcessor.GetArg2(tile);
}
internal override TileOpKind GetOpKind(T_Tile tile)
{
return m_tileProcessor.GetOpKind(tile);
}
internal override bool IsEmpty(T_Tile a)
{
m_numSATChecks++;
return m_tileProcessor.IsEmpty(a);
}
public bool IsDisjointFrom(T_Tile a, T_Tile b)
{
return m_tileProcessor.IsEmpty(Join(a, b));
}
internal bool IsContainedIn(T_Tile a, T_Tile b)
{
T_Tile difference = AntiSemiJoin(a, b);
return IsEmpty(difference);
}
internal bool IsEquivalentTo(T_Tile a, T_Tile b)
{
bool aInB = IsContainedIn(a, b);
bool bInA = IsContainedIn(b, a);
return aInB && bInA;
}
internal override T_Tile Union(T_Tile a, T_Tile b)
{
m_numUnion++;
return m_tileProcessor.Union(a, b);
}
internal override T_Tile Join(T_Tile a, T_Tile b)
{
if (a == null)
{
return b;
}
m_numIntersection++;
return m_tileProcessor.Join(a, b);
}
internal override T_Tile AntiSemiJoin(T_Tile a, T_Tile b)
{
m_numDifference++;
return m_tileProcessor.AntiSemiJoin(a, b);
}
public void AddError()
{
m_numErrors++;
}
public int CountOperators(T_Tile query)
{
int count = 0;
if (query != null)
{
if (GetOpKind(query) != TileOpKind.Named)
{
count++;
count += CountOperators(GetArg1(query));
count += CountOperators(GetArg2(query));
}
}
return count;
}
public int CountViews(T_Tile query)
{
HashSet views = new HashSet();
GatherViews(query, views);
return views.Count;
}
public void GatherViews(T_Tile rewriting, HashSet views)
{
if (rewriting != null)
{
if (GetOpKind(rewriting) == TileOpKind.Named)
{
views.Add(rewriting);
}
else
{
GatherViews(GetArg1(rewriting), views);
GatherViews(GetArg2(rewriting), views);
}
}
}
public static IEnumerable AllButOne(IEnumerable list, int toSkipPosition)
{
int valuePosition = 0;
foreach (T value in list)
{
if (valuePosition++ != toSkipPosition)
{
yield return value;
}
}
}
public static IEnumerable Concat(T value, IEnumerable rest)
{
yield return value;
foreach (T restValue in rest)
{
yield return restValue;
}
}
public static IEnumerable> Permute(IEnumerable list)
{
IEnumerable rest = null;
int valuePosition = 0;
foreach (T value in list)
{
rest = AllButOne(list, valuePosition++);
foreach (IEnumerable restPermutation in Permute(rest))
{
yield return Concat(value, restPermutation);
}
}
if (rest == null)
{
yield return list; // list is empty enumeration
}
}
static Random rnd = new Random(1507);
public static List RandomPermutation(IEnumerable input)
{
List output = new List(input);
for (int i = 0; i < output.Count; i++)
{
int j = rnd.Next(output.Count);
T tmp = output[i];
output[i] = output[j];
output[j] = tmp;
}
return output;
}
public static IEnumerable Reverse(IEnumerable input, HashSet filter)
{
List output = new List(input);
output.Reverse();
foreach (T t in output)
{
if (filter.Contains(t))
{
yield return t;
}
}
}
public bool RewriteQuery(T_Tile toFill, T_Tile toAvoid, IEnumerable views, out T_Tile rewriting)
{
if (RewriteQueryOnce(toFill, toAvoid, views, out rewriting))
{
HashSet usedViews = new HashSet();
GatherViews(rewriting, usedViews);
int opCount = CountOperators(rewriting);
// try several permutations of views, pick one with fewer operators
T_Tile newRewriting;
int permuteTries = 0;
int numPermutations = Math.Min(MAX_PERMUTATIONS, Math.Max(MIN_PERMUTATIONS, (int)(usedViews.Count * PERMUTE_FRACTION)));
while (permuteTries++ < numPermutations)
{
IEnumerable permutedViews;
if (permuteTries == 1)
{
permutedViews = Reverse(views, usedViews);
}
else
{
permutedViews = RandomPermutation(usedViews); // Tradeoff: views vs. usedViews!
}
bool succeeded = RewriteQueryOnce(toFill, toAvoid, permutedViews, out newRewriting);
Debug.Assert(succeeded);
int newOpCount = CountOperators(newRewriting);
if (newOpCount < opCount)
{
opCount = newOpCount;
rewriting = newRewriting;
}
HashSet newUsedViews = new HashSet();
GatherViews(newRewriting, newUsedViews);
usedViews = newUsedViews; // can only be fewer!
}
return true;
}
return false;
}
public bool RewriteQueryOnce(T_Tile toFill, T_Tile toAvoid, IEnumerable views, out T_Tile rewriting)
{
List viewList = new List(views);
return RewritingPass.RewriteQuery(toFill, toAvoid, out rewriting, viewList, this);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SiteMapPath.cs
- DispatcherExceptionFilterEventArgs.cs
- DataGridPageChangedEventArgs.cs
- CompoundFileStreamReference.cs
- SessionState.cs
- SafeFileMapViewHandle.cs
- DictionaryGlobals.cs
- SqlBuilder.cs
- DataControlButton.cs
- TextElement.cs
- InfoCardRSAOAEPKeyExchangeFormatter.cs
- CompilerCollection.cs
- SQLBinary.cs
- Formatter.cs
- ItemList.cs
- Convert.cs
- PropertyItemInternal.cs
- IisTraceWebEventProvider.cs
- ContractReference.cs
- ResourceCategoryAttribute.cs
- LambdaExpression.cs
- ResourceIDHelper.cs
- SortDescription.cs
- Hex.cs
- Line.cs
- UidManager.cs
- Debug.cs
- UserControlBuildProvider.cs
- PathGeometry.cs
- SqlFileStream.cs
- NotCondition.cs
- IconBitmapDecoder.cs
- MaskedTextBoxTextEditorDropDown.cs
- CheckPair.cs
- HttpCapabilitiesEvaluator.cs
- InternalDispatchObject.cs
- DbProviderSpecificTypePropertyAttribute.cs
- XamlInt32CollectionSerializer.cs
- XmlSchemaAny.cs
- Light.cs
- SafeRightsManagementHandle.cs
- WindowsListBox.cs
- HttpProfileBase.cs
- ConnectionPointConverter.cs
- SoapFault.cs
- AppDomainEvidenceFactory.cs
- AspNetHostingPermission.cs
- AbandonedMutexException.cs
- ExpressionValueEditor.cs
- DataServiceContext.cs
- ExpressionCopier.cs
- ToolStripPanelDesigner.cs
- GridProviderWrapper.cs
- TargetControlTypeAttribute.cs
- Wildcard.cs
- FixedSOMPageElement.cs
- NoneExcludedImageIndexConverter.cs
- QilPatternVisitor.cs
- VisualStyleElement.cs
- RecordConverter.cs
- PropertyPushdownHelper.cs
- ThumbButtonInfoCollection.cs
- XamlUtilities.cs
- DataServiceQueryException.cs
- AspProxy.cs
- ObjectNotFoundException.cs
- QueryMath.cs
- RegisteredExpandoAttribute.cs
- StorageAssociationTypeMapping.cs
- DbDataRecord.cs
- LocalizationCodeDomSerializer.cs
- SendActivityDesigner.cs
- SafePointer.cs
- IUnknownConstantAttribute.cs
- FileRecordSequenceHelper.cs
- ListViewItemEventArgs.cs
- TypeToken.cs
- HTTPRemotingHandler.cs
- CollectionChangeEventArgs.cs
- COM2PropertyPageUITypeConverter.cs
- BufferedGraphicsContext.cs
- XmlSchemaParticle.cs
- DataError.cs
- WebExceptionStatus.cs
- ImageFormatConverter.cs
- ErrorTolerantObjectWriter.cs
- DriveNotFoundException.cs
- ZipArchive.cs
- WaveHeader.cs
- AtlasWeb.Designer.cs
- MobileUserControl.cs
- HandleExceptionArgs.cs
- ResourceCategoryAttribute.cs
- WindowProviderWrapper.cs
- SupportingTokenSpecification.cs
- ExpressionBuilder.cs
- KeyConverter.cs
- Translator.cs
- DecimalStorage.cs
- DataGridViewImageCell.cs