<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Blue Collar Software Architect</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/joseph_fultz/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/feed.xml</link>
    <description />
    <lastBuildDate>Wed, 17 Apr 2019 03:23:19 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Automating Process Dump for Azure Functions using Kudu and Alerts</title>
      <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/automating-process-dump-for-azure-functions-using-kudu-and-alerts</link>
      <pubDate>Mon, 07 May 2018 16:29:58 GMT</pubDate>
      <dc:creator><![CDATA[Joseph Fultz]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/joseph_fultz/?p=365</guid>
      <description><![CDATA[Recently I was asked how I might programmatically dump the w3wp process for a Function App.  Jeremy...]]></description>
      <content:encoded><![CDATA[Recently I was asked how I might programmatically dump the w3wp process for a Function App.  Jeremy Brooks (fellow Microsoftie) pointed out that I could issue the same GET requests used in Kudu to show process information in the dashboard.  So, before I get to the automation, I'll review fetching information using Postman.
<h2>Setup Deployment Credentials</h2>
If you are currently using Kudu for deployment, you've already done this.  If not, take a look <a href="https://docs.microsoft.com/en-us/azure/app-service/app-service-deployment-credentials">here</a>  (<a href="https://docs.microsoft.com/en-us/azure/app-service/app-service-deployment-credentials">https://docs.microsoft.com/en-us/azure/app-service/app-service-deployment-credentials</a>) and follow the guidance to get a username and password setup.
<h2>Requests in Postman</h2>
In Postman, use the Authorization tab to set the type to Basic and enter the username and password that I created as a Deployment Credential.

[caption id="attachment_375" align="alignnone" width="300"]<a href="https://msdnshared.blob.core.windows.net/media/2018/05/postmankudu.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/05/postmankudu-300x212.png" alt="" width="300" height="212" class="size-medium wp-image-375" /></a> Kudu API Calls in Postman[/caption]

Postman takes care of Base64 encoding and adding the header.  It'll be a little more work when I get to the code :)

The next thing to know is that I will issue 3 different GET requests, but all are located at the Kudu endpoint.  Thus, base URI and pattern will be: <a href="https://[yourAppName].scm.azurewebsites.net/api/%5bcommand">https://[yourAppName].scm.azurewebsites.net/api/[command</a>].  The three commands I wish to execute are:
<ol>
 	<li>/processes - retrieves a list of all running processes</li>
 	<li>/processes/[processId] - properties of a specific process</li>
 	<li>/processes/[processId]/dump?dumpType=[1||2] - dumps the process with 1 for mini-dump and 2 for a full dump</li>
</ol>
&nbsp;

Before I move on to the code, I want to review the sample return from the first two requests that need to be issued.  The first request is simply going to give us the list of the processes that are presently servicing the Function App.  It will look something like:

[
{
"id": 4292,
"name": "w3wp",
"href": "<a href="https://[appname].scm.azurewebsites.net/api/processes/4292">https://[appname].scm.azurewebsites.net/api/processes/4292</a>",
"user_name": "IIS APPPOOL\\[appname]"
},
{
"id": 6948,
"name": "w3wp",
"href": "<a href="https://[appname].scm.azurewebsites.net/api/processes/6948">https://[appname].scm.azurewebsites.net/api/processes/6948</a>"
}
]

I clearly don't have much going on here and if you have something of any amount of significance running you'll have a lot more line items.  The key thing to note is "name" key.  I am going to want all items in the array where the "name" key has a value of "w3wp".  However, I don't want to dump the w3wp process that is serving Kudu.  Which brings me to the second set of requests.  For every item I use the "href" value to retrieve the individual properties of the process.  The result for each of those will look something like:

{
"id": 4292,
"name": "w3wp",
"href": "<a href="https://[appname].scm.azurewebsites.net/api/processes/4292">https://[appname].scm.azurewebsites.net/api/processes/4292</a>",
"minidump": "<a href="https://[appname].scm.azurewebsites.net/api/processes/4292/dump">https://[appname].scm.azurewebsites.net/api/processes/4292/dump</a>",
"iis_profile_timeout_in_seconds": 180,
"parent": "<a href="https://[appname].scm.azurewebsites.net/api/processes/-1">https://[appname].scm.azurewebsites.net/api/processes/-1</a>",
"children": [],
.
.
.
<strong>"is_scm_site": true</strong>
}

I've cut a lot of the properties out to keep it manageable in this post, but I kept in the key that we are searching to compare "is_scm_site".  Thus, as we loop through the process list that we got from the first and check for this property for false before dumping the process.  Thanks to David Ebbo for pointing me to the "is_scm_site" key.
<h2>Implementation</h2>
I've created a blob storage container named "dumpfiles" to receive the process dumps and I'm organizing them into folders for date.

[caption id="attachment_385" align="alignnone" width="497"]<a href="https://msdnshared.blob.core.windows.net/media/2018/05/storagestructurefordumpfiles.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/05/storagestructurefordumpfiles-300x131.png" alt="" width="497" height="217" class=" wp-image-385" /></a> Storage Structure for Dump Files[/caption]
<h2>Function Code</h2>
The next bit was a small bit of code that I throw into a <b>separate</b> Function App to retrieve the information from Kudu.  To get things setup, I need to grab the list of running processes issuing the same GET request that I issued in Postman.  To that, I've got a little code to setup the HttpClient.

<code>HttpClient client = new HttpClient();
client.BaseAddress = new Uri(baseAddress);
// the creds from my .publishsettings file
var byteArrayCredential = Encoding.ASCII.GetBytes(usr + ":" + pwd);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArrayCredential));
// GET to the run action for my job
var response = await client.GetAsync(apiProcessPath);
responseString = await response.Content.ReadAsStringAsync();</code>

In this first call, the baseAddress  is "<a href="https://[Fn%20App%20Name].scm.azurewebsites.net/">https://[Fn App Name].scm.azurewebsites.net/</a>" with the apiProcessPath is assigned the value "api/processes/".  This gets me a JSON Array which I'll loop through and grab process details.  To that end, I've setup a loop to iterate the Jarray.
<code>JArray jsonProcessList = JArray.Parse(responseString);
//setup loop to check each process and dump if is w3wp and is not is_scm_site
foreach (var processItem in jsonProcessList)
{
if (processItem["name"].Value&lt;string&gt;() == "w3wp")
{
log.Info("checking " + processItem["name"] + ":" + processItem["id"] + " for scm site");
string apiProcessDetailUri = processItem["href"].Value&lt;string&gt;();
response = await client.GetAsync(apiProcessDetailUri);
responseString = await response.Content.ReadAsStringAsync();
</code>
So, here I just check to make sure it is the process in which I'm interested (processItem["name"] == "w3wp") and if it is I'll use the "href" key that is returned with the previous call that gives me the URI to retch the process details.

<code>JObject processDetail = JObject.Parse(responseString);
if (processDetail["is_scm_site"]?.Value&lt;bool&gt;() == true)
{
log.Info("process " + processItem["name"] + ":" + processItem["id"] + " is the scm site");
}
else
{
log.Info("fetching process dump for " + processItem["name"] + ":" + processItem["id"]);
//TODO: Need a means to handle a larger return than can be handled by string
string processDumpContent = default(string);
//construct the query string based on the process URI; using type 1, minidump
response = await client.GetAsync(apiProcessDetailUri + "/dump?dumpType=1");
processDumpContent = await response.Content.ReadAsStringAsync();
</code>
In this section of code, I'm simply ensuring that I only dump for the non-SCM site (serving Kudu).  To do that, I construct the URI and query string to request a minidump (apiProcessDetailUri + "/dump?dumpType=1") for the process.  The last bit of code is just to name the file and persist it to BLOB storage.
<code>string path = "dumpfiles/" + DateTime.Now.ToShortDateString().Replace(@"/", "-") + "/" +
DateTime.Now.ToShortTimeString() + " - " +
processItem["name"] + ":" + processItem["id"];
var attributes = new Attribute[]
{
new BlobAttribute(path),
new StorageAccountAttribute("processdumpstorage_STORAGE")
};
using (var writer = await binder.BindAsync&lt;TextWriter&gt;(attributes))
{
writer.Write(processDumpContent);
}
}
</code>
Once I've set the name as desired to get the desired organization, I set Attributes to connect to my BLOB storage target and use the binder with those attributes to create a TextWriter that then use to persist the dump.
<h2>Alert + WebMethod</h2>
The last bit to tie it all together is to create an alert on errors that calls a webhook (the Function App endpoint that I created) if there is an error.

[caption id="attachment_395" align="alignnone" width="300"]<a href="https://msdnshared.blob.core.windows.net/media/2018/05/alertwebmethod.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/05/alertwebmethod-300x176.png" alt="" width="300" height="176" class="size-medium wp-image-395" /></a> Set Webhook in Alert[/caption]

I've done it here in the Alerts (Classic) UI.  I've grabbed the Function's URL from the portal which has the code in the querystring and provided as the Webhook in the configuration UI.
<h2>Housekeeping</h2>
With everything configured and code in place, I should start to see w3wp dumps when my app has exceptions.  However, this sample has a number things that need to be considered if doing this in a more production fashion.
<ol>
 	<li>Credentials and paths
<ol>
 	<li>I've simply assigned variables directly in the code. You would want to store and retrieve the values separately.</li>
 	<li>KeyVault is ideally the place for the credentials</li>
 	<li>Root path for the Kudu API is a little of something to explore.  For example, could we pass it in via the new Alerts mechanism?  So, there is some research to be done there.  The same sort of thinking applies to the dump type.</li>
</ol>
</li>
 	<li>Scale issue - if the Function App has a large number of hosts we need to parallelize the dump collection and look into ways to target better.
<ol>
 	<li>My for loop to iterate the JArray and check the process for is_scm_site is sequential.  It would be worth looking at using parallel for and running a few checks at a time.  The exact amount of concurrent fetches would probably be a bit of a science project to get right.</li>
 	<li>Need to research errors reported to see if there is information available that could be passed to the webhook to specifically target the process.</li>
</ol>
</li>
 	<li>Data Size - I used a string to retrieve the process dump which limits me to a theoretical 2GB.
<ol>
 	<li>Look at a more efficient type for receiving and holding data (maybe local filestream as temporary holder spot?).</li>
 	<li>If local filestream works then maybe there is more efficient copy mechanism too.</li>
</ol>
</li>
</ol>
I'm sure I missed out on a few things, but these are my thoughts at the moment.  If you have any thoughts or feedback, post it up and I'll try to incorporate where it makes sense.]]></content:encoded>
    </item>
    <item>
      <title>Creating Service Principal and New Roles Using AzureRM Powershell</title>
      <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/creating-service-principal-and-new-roles-using-azurerm-powershell</link>
      <pubDate>Wed, 10 Aug 2016 21:08:03 GMT</pubDate>
      <dc:creator><![CDATA[Joseph Fultz]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/joseph_fultz/?p=345</guid>
      <description><![CDATA[I started working on a few scripts to provision new roles using Azure Resource Manager (ARM). While...]]></description>
      <content:encoded><![CDATA[I started working on a few scripts to provision new roles using Azure Resource Manager (ARM). While the documentation online is pretty complete for the <span class="SpellE">Powershell</span> I had a couple of points of consideration: running as a part of an automated action and code versus config.
<div class="WordSection1">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span>When I first developed the couple scripts to create the new roles I was just running them from my own command line and logging in myself when prompted.<span>  </span>Once I decided that they functionally worked well enough I started looking at how to automate the execution.<span>  </span>What I came to discover is the flow is actually in two parts.<span>  </span>One part to establish the security artifacts needed to execute and the second part to actually do the role creation. </span></p>
&nbsp;
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><b><u><span>Security</span></u></b><span></span></p>
&nbsp;
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span>To get things read in order to run the scripts via some automation, I had to setup all of the artifacts needed for security.<span> </span>That flow looks like:</span></p>
&nbsp;
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span> </span></p>
<p class="MsoNormal" style="text-indent: -.25in;line-height: normal;vertical-align: middle;margin: 0in 0in .0001pt 27.0pt"><span><span>1. </span></span><span>Create an Azure Application</span></p>
<p class="MsoNormal" style="text-indent: -.25in;line-height: normal;vertical-align: middle;margin: 0in 0in .0001pt 27.0pt"><span><span>2. </span></span><span>Associate a cert with Application</span></p>
<p class="MsoNormal" style="text-indent: -.25in;line-height: normal;vertical-align: middle;margin: 0in 0in .0001pt 27.0pt"><span><span>3. </span></span><span>Create Service Principal for the Application</span></p>
<p class="MsoNormal" style="text-indent: -.25in;line-height: normal;vertical-align: middle;margin: 0in 0in .0001pt 27.0pt"><span><span>4. </span></span><span>Assign Owner, or privileged, role to the Service Principal</span></p>
&nbsp;
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span>The </span><a href="https://azure.microsoft.com/en-us/documentation/articles/resource-group-authenticate-service-principal/"><span>documentation</span></a><span> was a big help to this end, the documentation<span> </span>for creating a Service Principal presents one with two options: using a password or using a certificate.<span>  </span>While the documentation for the ARM <span class="SpellE">Powershell</span> is good, knowing which one to use is another matter.<span>
</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span>If you're planning on a temporary <span class="GramE">solution</span> then the password mechanism might be fine.<span> </span>However, keep in mind that it means you will need to use a bit of <span class="SpellE">Powershell</span> to login (that's hands on keys) and save the token that is returned for future use; that token has an expiry.</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span>Since I wanted something that could theoretically work in perpetuity, or at least until the certificate expires, I went with creating a Service Principal with a certificate.<span>  </span>My example isn't exactly ready for the enterprise as I'm still creating it and storing it locally in the My store.<span>  </span>However, I've at least parameterized the inputs for cert location.<span> </span>I put the following <span class="SpellE">Powershell</span> into a file and run it myself from the <span class="SpellE">Powershell</span> Console:</span><span> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span> </span></p>

<table title="" class="MsoNormalTable" style="border-collapse: collapse;border: none" border="1" cellspacing="0" cellpadding="0" summary="">
<tbody>
<tr>
<td width="1477" valign="top" style="width: 443.0pt;border: solid #A3A3A3 1.0pt;background: black;padding: 2.0pt 3.0pt 2.0pt 3.0pt">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135"># parse <span class="SpellE">params</span> [app name], [<span class="SpellE">uri</span>], [cert store location], [<span class="SpellE">assignedScope</span>]</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span class="SpellE"><span style="color: #b2a1c7">param(</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span><span>  </span><span style="color: #9cc3e5"><span>  </span>[string]$<span class="SpellE">appName</span></span>
=<span style="color: #f4b183"> "[<span class="SpellE">yourAppName</span>]"</span>,
<span style="color: #538135">#$(throw "Please specify -<span class="SpellE">appName</span>")</span>,</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span><span>   </span><span style="color: #9cc3e5"><span> </span>[string]$<span class="SpellE">uri</span></span>
=<span style="color: #f4b183"> "[</span></span><a href="https://www.you.org"><span style="color: #f4b183">https://www.you.org</span></a><span style="color: #f4b183">]"</span><span>,<span style="color: #538135">
#$(throw "Please specify -<span class="SpellE">uri</span>")</span>,</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span><span>   </span><span style="color: #9cc3e5"><span> </span>[string] $<span class="SpellE">certStore</span></span>
= <span style="color: #f4b183">"cert:\<span class="SpellE">CurrentUser</span>\My<span class="GramE">"<span style="color: windowtext">,<span>  </span></span><span style="color: #538135">#</span></span></span><span style="color: #538135">defaulting to <span class="SpellE">CurrentUser</span>,
but will not want it in this location for service execution</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span><span>  </span><span style="color: #9cc3e5"><span>  </span>[string] $<span class="SpellE">assignedScope</span></span>
=<span style="color: #f4b183"> "[subscription ID]"</span><span style="color: #538135"> #defaulting to my own to ease debug</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span>) </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#to use the same principal on another machine, the cert will
have to exported from the</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#machine on which it was created and imported on the target
machine </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#must login manually to perform the rest of the script</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: white">Login-<span class="SpellE">AzureRmAccount</span> -<span class="SpellE">SubscriptionId</span> </span><span style="color: #9cc3e5">$<span class="SpellE">assignedScope</span></span><span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #9cc3e5">$<span class="SpellE">appName</span></span><span> = <span style="color: #f4b183">"CN="</span><span style="color: white"> +</span><span style="color: #9cc3e5"> $<span class="SpellE">appName</span></span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#create self-signed certificate</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#for a real-world scenario, this will require an authority
issued cert installed in the preferred</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135"># location (e.g., root)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #9cc3e5">$cert</span><span> = <span style="color: white">New-<span class="SpellE">SelfSignedCertificate</span> -<span class="SpellE">CertStoreLocation</span>
</span><span style="color: #9cc3e5">$<span class="SpellE">certStore</span></span><span style="color: white"> -Subject </span><span style="color: #9cc3e5">$<span class="SpellE">appName</span> </span><span style="color: white">-<span class="SpellE">KeySpec</span> <span class="SpellE">KeyExchange</span></span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#fetch just the <span class="SpellE">keyvalue</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #9cc3e5">$<span class="SpellE">keyValue</span></span><span> = <span style="color: #9cc3e5">[<span class="SpellE">System.Convert</span><span class="GramE">]<span style="color: white">::</span></span></span><span style="color: white">ToBase64String(</span><span style="color: #9cc3e5">$<span class="SpellE">cert<span style="color: windowtext">.</span><span style="color: white">GetRawCertData</span></span></span><span style="color: white">())</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#create AD App with key value</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #9cc3e5">$<span class="SpellE">azureAdApplication</span></span><span> =<span style="color: white"> New-<span class="SpellE">AzureRmADApplication</span> -<span class="SpellE">DisplayName</span></span><span style="color: #9cc3e5"> $<span class="SpellE">appName</span></span><span style="color: white"> -<span class="SpellE">HomePage</span> </span><span style="color: #9cc3e5">$<span class="SpellE">uri</span></span><span style="color: white"> -<span class="SpellE">IdentifierUris</span></span><span style="color: #9cc3e5"> $<span class="SpellE">uri</span></span><span style="color: white"> -<span class="SpellE">KeyValue</span> </span><span style="color: #9cc3e5">$<span class="SpellE">keyValue</span></span><span style="color: white"> -<span class="SpellE">KeyType</span> AsymmetricX509Cert -<span class="SpellE">EndDate</span> </span><span style="color: #9cc3e5">$<span class="SpellE"><span class="GramE">cert<span style="color: #fff2cc">.NotAfter</span></span></span></span><span style="color: #fff2cc"> </span><span style="color: white">-<span class="SpellE">StartDate</span>
</span><span style="color: #9cc3e5">$<span class="SpellE">cert<span style="color: #fff2cc">.NotBefore</span></span></span><span>      </span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#compensating transaction for my testing</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#Remove-<span class="SpellE">AzureRmADApplication</span> -<span class="SpellE">ApplicationObjectId</span> "[id]"</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#Dump application info to screen</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #9cc3e5">$<span class="SpellE">azureAdApplication</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#create service principal for application</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: white">New-<span class="SpellE">AzureRmADServicePrincipal</span> -<span class="SpellE">ApplicationId</span></span><span style="color: #9cc3e5"> $<span class="SpellE">azureAdApplication<span style="color: #fff2cc">.ApplicationId</span></span></span><span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#the principal is created asynchronously, just going to wait</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: white">Start-Sleep -s 10</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#add Owner role to service principal so it can be used going
forward for provisioning</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #538135">#the -Scope argument for New-<span class="SpellE">AzureRmRoleAssignment</span>
expects the format "/subscriptions/&lt;id&gt;"</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: #9cc3e5">$<span class="SpellE">subscriptionString</span></span><span> <span class="GramE">= <span style="color: #fbe5d5"><span> </span>"</span></span><span style="color: #fbe5d5">/subscriptions/"
</span><span style="color: white">+ </span><span style="color: #9cc3e5">$<span class="SpellE">assignedScope</span> </span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: white">New-<span class="SpellE">AzureRmRoleAssignment</span> -<span class="SpellE">RoleDefinitionName</span> Owner -<span class="SpellE">ServicePrincipalName</span>
</span><span class="GramE"><span style="color: #9cc3e5">$<span class="SpellE">azureAdApplication<span style="color: #fff2cc">.ApplicationId.Guid</span></span></span></span><span style="color: #fff2cc"> </span><span style="color: white">-Scope</span><span style="color: #9cc3e5"> $<span class="SpellE">subscriptionString</span></span><span></span></p>
</td>
</tr>
</tbody>
</table>
&nbsp;
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span>One thing to note is that the Subscription ID that I've assigned to $assignedScope works as is in the Login call, but for the New-AzureRMRoleAssignment call it must be prefixed with "/subscriptions/".  This caused me a bit of trouble as I got errors telling me that I had no subscription.  It didn't inform me that my -Scope argument format was not good.</span></p>
&nbsp;
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span>At the end of it, I have my Service Principal and cert installed and I’m ready to the run scripts using that Principal as my identity.</span></p>

</div>]]></content:encoded>
    </item>
    <item>
      <title>Recursive Upload from Disk to Azure Storage</title>
      <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/recursive-upload-from-disk-to-azure-storage</link>
      <pubDate>Mon, 20 Oct 2014 07:42:00 GMT</pubDate>
      <dc:creator><![CDATA[Joseph Fultz]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/joseph_fultz/2014/10/20/recursive-upload-from-disk-to-azure-storage/</guid>
      <description><![CDATA[2016 Aug 15 - Updated to work with latest C# libs





using System;
using...]]></description>
      <content:encoded><![CDATA[<div class="WordSection1">
<ul>
 	<li>2016 Aug 15 - Updated to work with latest C# libs</li>
</ul>
<table class="MsoTableGrid" border="1" cellspacing="0" cellpadding="0" style="border-collapse: collapse;border: none">
<tbody>
<tr>
<td width="1558" valign="top" style="width: 467.5pt;border: solid windowtext 1.0pt;background: #A6A6A6;padding: 0in 5.4pt 0in 5.4pt">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">using</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> System;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">using</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> System.IO;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">using</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE"><span class="GramE">System.Threading.Tasks</span></span>;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">using</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE"><span class="GramE">Microsoft.WindowsAzure.Storage</span></span>;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">using</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE"><span class="GramE">Microsoft.WindowsAzure.Storage.Blob</span></span>;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">namespace</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">UploadToStorage</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>    </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">class</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Program</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>    </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">const</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">string</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">StorageAccountConnectionString</span>
= </span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"<span class="SpellE">DefaultEndpointsProtocol</span>=<span class="SpellE"><span class="GramE">https;AccountName</span></span>=[your account];<span class="SpellE">AccountKey</span>=[your key]"</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">const</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">string</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">RootContainerName</span>
=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"<span class="SpellE">servetest</span>"</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">const</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">string</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">startingFolder</span>
= </span><span style="font-size: 9.5pt;font-family: Consolas;color: maroon">@"C:\[your path]"</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">static</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE"><span class="GramE">System.Collections.Specialized.<span style="color: #2b91af">StringCollection</span></span></span>
log = </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">new</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">System.Collections.Specialized.<span style="color: #2b91af">StringCollection</span></span>();</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">static</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Int64</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">folderCount</span> = 0;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">static</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Int64</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">fileCount</span> = 0;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">static</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">CloudStorageAccount</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">storageAccount</span>;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">static</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">CloudBlobClient</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">blobClient</span>;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">static</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">CloudBlobContainer</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">rootContainer</span>;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">static</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">void</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> Main(</span><span class="GramE"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">string</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">[</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">] <span class="SpellE">args</span>)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//open the storage account</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span><span class="SpellE">storageAccount</span> = </span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">CloudStorageAccount</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.Parse</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(<span class="SpellE">StorageAccountConnectionString</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//create a blob client</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span><span class="SpellE">blobClient</span> = <span class="SpellE">storageAccount.CreateCloudBlobClient</span>();</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//get a reference to the container which we’ll use <span class="GramE">to<span>  </span>create</span> the blob</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span><span class="SpellE">rootContainer</span> = <span class="SpellE">blobClient.GetContainerReference</span>(<span class="SpellE">RootContainerName</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//get the <span class="SpellE">DirectoryInfo</span> for the
starting local folder that will be <span class="SpellE">recursed</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">DirectoryInfo</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">rootDir</span> = </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">new</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">DirectoryInfo</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(<span class="SpellE">startingFolder</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//get started</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span><span class="SpellE"><span class="GramE">WalkDirectoryTree</span></span><span class="GramE">(</span><span class="SpellE">rootDir</span>, <span class="SpellE">rootContainer</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">// Write out all the files that could not be processed.</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Console</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.WriteLine</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"Files with restricted
access:"</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">foreach</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> (</span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">string</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> s </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">in</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> log)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Console</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.WriteLine</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(s);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">// Keep the console window open in debug mode.</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Console</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.WriteLine</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"Press any key"</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Console</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.ReadKey</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">();</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//Co-opted initially from
https://msdn.microsoft.com/en-us/library/bb513869.aspx</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//modified for azure upload and parallel processing</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">private</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">static</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">void</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">WalkDirectoryTree</span>(<span class="SpellE">System.IO.<span style="color: #2b91af">DirectoryInfo</span></span> <span class="SpellE">currentPath</span>,
</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">CloudBlobContainer</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">cloudContainer</span>)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span><span class="SpellE">System.IO.<span style="color: #2b91af">FileInfo</span></span>[]
files = </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span><span class="SpellE">System.IO.<span style="color: #2b91af">DirectoryInfo</span></span>[]
<span class="SpellE">subDirs</span> = </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">string</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">pathFromRoot</span>
= <span class="SpellE"><span class="GramE">currentPath.FullName.Substring</span></span>(<span class="SpellE">startingFolder.Length</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//replace the slashes in order to transition from local filename
path to Azure Storage Blob name </span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">string</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">cloudFileNamePathPrefix</span>
= <span class="SpellE">pathFromRoot.Replace</span>(</span><span style="font-size: 9.5pt;font-family: Consolas;color: maroon">@"\"</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">, </span><span style="font-size: 9.5pt;font-family: Consolas;color: maroon">@"/"</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//fixup terminal character if there is a non-empty path</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//If we’re at the root then we don’t need an end delimiter, but
if we are we do</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>           </span><span class="SpellE">cloudFileNamePathPrefix</span> = <span class="SpellE">cloudFileNamePathPrefix.Length</span>
== <span class="GramE">0 ?</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"<span class="GramE">"<span style="color: black"> :</span></span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">cloudFileNamePathPrefix</span> + </span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"/"</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> (<span class="SpellE">cloudFileNamePathPrefix.Length</span>
&gt; 0)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> (<span class="SpellE">cloudFileNamePathPrefix.Substring</span>(0,
1<span class="GramE">).Equals</span>(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"/"</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">)) { <span class="SpellE">cloudFileNamePathPrefix</span> = <span class="SpellE">cloudFileNamePathPrefix.Substring</span>(1); }</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span><span class="SpellE">folderCount</span>++;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Console</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.WriteLine</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"Processing folder "</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> + <span class="SpellE">currentPath.FullName</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">// First, process all the files directly under this folder </span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">try</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span>files = <span class="SpellE">currentPath.GetFiles</span>(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"<span class="GramE">*.*</span>"</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">// This is thrown if even one of the files requires permissions
greater </span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">// than the application provides. </span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">catch</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> (</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">UnauthorizedAccessException</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> e)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">// This code just writes out the message and continues to <span class="SpellE">recurse</span>. </span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span><span class="SpellE"><span class="GramE">log.Add</span></span>(<span class="SpellE">e.Message</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">catch</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> (<span class="SpellE">System.IO.<span style="color: #2b91af">DirectoryNotFoundException</span></span> e)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Console</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.WriteLine</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(<span class="SpellE"><span class="GramE">e.Message</span></span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//setting up to as <span class="SpellE">manys</span> as 5 folders
and 10 files per folder working in upload at a time</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//adjust according to bandwidth</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">fileParallelOptions</span> = </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">new</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span class="SpellE"><span class="GramE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">ParallelOptions</span></span></span><span class="GramE"><span style="font-size: 9.5pt;font-family: Consolas;color: black">(</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">) { <span class="SpellE">MaxDegreeOfParallelism</span>
= 10 };</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">folderParallelOptions</span> = </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">new</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span><span class="SpellE"><span class="GramE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">ParallelOptions</span></span></span><span class="GramE"><span style="font-size: 9.5pt;font-family: Consolas;color: black">(</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">) { <span class="SpellE">MaxDegreeOfParallelism</span>
= 5 };</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> (<span class="GramE">files !</span>=
</span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//build blob name prefix based on delta of root folder path to
current path</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Parallel</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.ForEach</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(files, <span class="SpellE">fileParallelOptions</span>, <span class="SpellE">currentFileInfo</span> =&gt;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//just keeping a count of files</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span><span class="SpellE">fileCount</span>++;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//construct new filename for cloud</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//<span class="SpellE">inlcudes</span> path information from the
root</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">string</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">cloudFilename</span>
= <span class="SpellE">cloudFileNamePathPrefix</span> + <span class="SpellE">currentFileInfo.Name</span>;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//string <span class="SpellE">cloudFilename</span> = <span class="SpellE">currentFileInfo.Name</span>;</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">try</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                        </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="SpellE">blobRef</span> = <span class="SpellE">rootContainer.GetBlockBlobReference</span>(<span class="SpellE">cloudFilename</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//if exists, don’t upload</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//if uploading to an empty location, this could be refactored
and skip the check</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> <span class="GramE">(!<span class="SpellE">blobRef.Exists</span></span>())</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span><span>        </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>
</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//upload blob</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>
</span><span class="SpellE">blobRef.OpenWrite</span>(</span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">, </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">, </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>
</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">// <span class="SpellE">Console.WriteLine</span>(<span class="SpellE"><span class="GramE">string.Format</span></span>("Uploading {
0} as { 1} ", <span class="SpellE">currentFileInfo.Name</span>, <span class="SpellE">cloudFilename</span>));</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>          </span><span>                  </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//<span class="SpellE">FileMode</span> refers to access on local
file not azure blob</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>
</span><span class="SpellE">blobRef.UploadFromFile</span>(<span class="SpellE">currentFileInfo.FullName</span>,
</span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">, </span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">, </span><span class="GramE"><span style="font-size: 9.5pt;font-family: Consolas;color: blue">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">);</span><span style="font-size: 9.5pt;font-family: Consolas;color: green">/</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">/, null);</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>
</span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Console</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.WriteLine</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"Upload Complete for "</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> + <span class="SpellE">cloudFilename</span><span class="GramE">) ;</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                        </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: blue">catch</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> (</span><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Exception</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> ex)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                        </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//TODO:<span>  </span>Log error</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                 </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>               </span><span class="GramE">);<span>  </span><span style="color: green">/</span></span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">/end <span class="SpellE">Parallel.ForEach</span>
(Files...</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">// Now find all the subdirectories under this directory.</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span><span class="SpellE">subDirs</span> = <span class="SpellE">currentPath.GetDirectories</span>();</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Parallel</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.ForEach</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(<span class="SpellE">subDirs</span>, <span class="SpellE">folderParallelOptions</span>,
<span class="SpellE">currentDirInfo</span> =&gt;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//check for matching folder in container, create if not present</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: green">// <span class="SpellE">Resursive</span> call for each
subdirectory.</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                    </span><span class="SpellE"><span class="GramE">WalkDirectoryTree</span></span><span class="GramE">(</span><span class="SpellE">currentDirInfo</span>, <span class="SpellE">cloudContainer</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>                </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>  </span><span>              </span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span>} </span><span style="font-size: 9.5pt;font-family: Consolas;color: green">//end if (<span class="GramE">files !</span>= null)</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Console</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.WriteLine</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"Processing complete for
folder "</span><span style="font-size: 9.5pt;font-family: Consolas;color: black"> + <span class="SpellE">currentPath.FullName</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>            </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #2b91af">Console</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">.WriteLine</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #a31515">"Processed {0} folders and
{1} files "</span><span style="font-size: 9.5pt;font-family: Consolas;color: black">, <span class="SpellE">folderCount</span>,
<span class="SpellE">fileCount</span>);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>        </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"><span>  </span><span>  </span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black"> </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: black">}</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"> </p>

</div>]]></content:encoded>
    </item>
    <item>
      <title>BreezeJS - One query to rule them all and with the data bind them</title>
      <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/breezejs-one-query-to-rule-them-all-and-with-the-data-bind-them</link>
      <pubDate>Thu, 24 Apr 2014 06:28:00 GMT</pubDate>
      <dc:creator><![CDATA[Joseph Fultz]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/joseph_fultz/2014/04/24/breezejs-one-query-to-rule-them-all-and-with-the-data-bind-them/</guid>
      <description><![CDATA[Recently we've started working with BreezeJS in a SPA that will essentially serve as a kiosk...]]></description>
      <content:encoded><![CDATA[<div class="WordSection1">
<p class="MsoNormal" style="line-height: normal"><span style="color: black">Recently we've started working with <span class="SpellE">BreezeJS</span> in a SPA that will essentially serve as a kiosk application.&nbsp; As a discrete part of getting everything to run as smoothly as possible we need to cache data fetched via our Breeze controllers.&nbsp; We've taken the necessary steps to build in the cache-warming <span class="SpellE">prefetch</span> mechanism, but we're left with a rather clunky way of either executing a remote query in <span class="SpellE">BreezeJS</span> or executing a local query.&nbsp; This is due to a couple of things:</span></p>
<ol>
<li>
<div class="MsoNormal" style="margin-left: 42.0pt;text-indent: -.25in;line-height: normal"><span style="color: black">Local queries are synchronous whereas remote queries use a promise pattern</span></div>
</li>
<li>
<div class="MsoNormal" style="margin-left: 42.0pt;text-indent: -.25in;line-height: normal"><span style="color: black">There is no intelligence to know whether the local data one is querying is complete enough to trust</span></div>
</li>
</ol>
<p class="MsoNormal" style="line-height: normal"><span style="color: black">Given those complications I wanted to drive consistency by providing a mechanism by which a developer could make a single call that followed a single pattern and at the same time have that call be intelligent enough to make a decision on whether to execute that query locally or remotely.&nbsp; Most of the calls back to the server in this case are rather simple and straight forward have at most a couple of where predicates and some expanded collections within the domain model.&nbsp; Thus, it wasn't too hard to build in that single call to rule them all and add some tracking and conditional query logic.</span></p>
<h1><span style="font-size: 11.0pt;line-height: 107%;font-family: 'Calibri','sans-serif'">&nbsp;</span><span>Converging on a Single Method Call</span></h1>
<p class="MsoNormal" style="line-height: normal"><span style="color: black">First, let's take a look at the problem presented by wanting to query both locally and remotely using <span class="SpellE">BreezeJS</span>.&nbsp; A query in <span class="SpellE">BreezeJS</span> with a predicate looks something like this:</span></p>
<table class="MsoTableGrid" style="border: currentColor;border-collapse: collapse" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 467.5pt;border: solid windowtext 1.0pt;background: black;padding: 0in 5.4pt 0in 5.4pt" valign="top" width="623">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: black">&nbsp;</span><span style="color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="color: #569cd6;background: black">var</span></span><span style="color: gainsboro;background: black"> query </span><span style="color: #b4b4b4;background: black">=</span><span style="color: gainsboro;background: black"> <span class="SpellE">EntityQuery<span style="color: #b4b4b4">.</span>from</span></span><span style="color: #b4b4b4;background: black">(</span><span style="color: #d69d85;background: black">'<span class="SpellE">bodyStyle</span>'</span><span style="color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: #b4b4b4;background: black">.</span><span style="color: gainsboro;background: black">where</span><span style="color: #b4b4b4;background: black">(</span><span style="color: #d69d85;background: black">"<span class="SpellE">model.modelYear</span>"</span><span style="color: #b4b4b4;background: black">,</span><span style="color: #d69d85;background: black">"equals"</span><span style="color: #b4b4b4;background: black">,</span><span style="color: gainsboro;background: black"> Number</span><span style="color: #b4b4b4;background: black">(</span><span style="color: gainsboro;background: black">year</span><span style="color: #b4b4b4;background: black">))</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: #b4b4b4;background: black">.</span><span style="color: gainsboro;background: black">where</span><span style="color: #b4b4b4;background: black">(</span><span style="color: #d69d85;background: black">"<span class="SpellE">model.modelId</span>"</span><span style="color: #b4b4b4;background: black">,</span><span style="color: #d69d85;background: black">"equals"</span><span style="color: #b4b4b4;background: black">,</span><span style="color: gainsboro;background: black"> Number</span><span style="color: #b4b4b4;background: black">(</span><span style="color: gainsboro;background: black">model</span><span style="color: #b4b4b4;background: black">))</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: #b4b4b4;background: black">.</span><span style="color: gainsboro;background: black">expand</span><span style="color: #b4b4b4;background: black">(</span><span style="color: #d69d85;background: black">"model"</span><span style="color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: #569cd6;background: black">return</span><span style="color: gainsboro;background: black"> <span class="SpellE">manager<span style="color: #b4b4b4">.</span>executeQuery</span></span><span style="color: #b4b4b4;background: black">(</span><span style="color: gainsboro;background: black">query</span><span style="color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: #b4b4b4;background: black">.</span><span style="color: gainsboro;background: black">then</span><span style="color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="color: gainsboro;background: black">querySucceeded</span></span><span style="color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: #b4b4b4;background: black">.</span><span style="color: gainsboro;background: black">fail</span><span style="color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="color: gainsboro;background: black">queryFailed</span></span><span style="color: #b4b4b4;background: black">);</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">This in itself presents no issues.<span>&nbsp; </span>The <span class="SpellE"><span class="GramE">EntityManager.executeQuery</span></span><span class="GramE">(</span>) function returns a promise and we provide the callback handlers for the promise resolution.<span>&nbsp; </span>Where we start to get into trouble is when we want to query the local cache first.<span>&nbsp; </span>In that case, we have to make a synchronous call that then looks more like this:</p>
<table class="MsoTableGrid" style="border: currentColor;border-collapse: collapse" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 467.5pt;border: solid windowtext 1.0pt;background: black;padding: 0in 5.4pt 0in 5.4pt" valign="top" width="623">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.0pt;font-family: 'Arial','sans-serif';color: black">&nbsp;</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> query </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">EntityQuery<span style="color: #b4b4b4">.</span>from</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #d69d85;background: black">'<span class="SpellE">bodyStyle</span>'</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">where</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #d69d85;background: black">"<span class="SpellE">model.modelYear</span>"</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span><span style="font-size: 9.5pt;font-family: Consolas;color: #d69d85;background: black">"equals"</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> Number</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">year</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">))</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">where</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #d69d85;background: black">"<span class="SpellE">model.modelId</span>"</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span><span style="font-size: 9.5pt;font-family: Consolas;color: #d69d85;background: black">"equals"</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> Number</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">model</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">))</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">expand</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: #d69d85;background: black">"model"</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-top: 0in;margin-right: 0in;margin-bottom: .0001pt;margin-left: .5in;line-height: normal"><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">localQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">query<span style="color: #b4b4b4">.</span>toType</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">targetTypeName</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">// local query</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">return</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">this</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">executeQueryLocally</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">localQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
</td>
</tr>
<tr>
<td style="width: 467.5pt;border: solid windowtext 1.0pt;border-top: none;background: black;padding: 0in 5.4pt 0in 5.4pt" valign="top" width="623">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
</td>
</tr>
<tr style="height: 3.5pt">
<td style="width: 467.5pt;border: solid windowtext 1.0pt;border-top: none;background: black;padding: 0in 5.4pt 0in 5.4pt;height: 3.5pt" valign="top" width="623">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">So, if I want to check the local cache first and then follow up with a remote query in the case that I don&rsquo;t have results I have to build logic around every call to make a synchronous cache query, check it, make remote query, and handle the&nbsp;promise.<span>&nbsp; </span>In order to provide a consistent developer interface I want to converge on one style of call; either synchronous or asynchronous (promise pattern).<span>&nbsp; </span>Additionally, I don&rsquo;t want to put the single method into the <span class="SpellE">dataContext</span> object itself, because what I really want is that any developer working on a <span class="SpellE">dataContext</span> using <span class="SpellE">BreezeJS</span> will have the method available.<span>&nbsp; </span>To accomplish this, I added a method to the breeze prototype that I named <span class="SpellE">combinedQuery</span>.<span>&nbsp; </span>This method would always return a promise making the <span class="SpellE">dataContext</span> developer interaction with server and local data consistent which in turn flowed through to the <span class="SpellE">viewModel</span> developer as he works with a given <span class="SpellE">dataContext</span>.</p>
<p class="MsoNormal">Skipping over the parts on which I&rsquo;m not focused, I want to point out the first part of providing the promise pattern style is that I I&rsquo;m using a deferred object to provide a promise to the caller in any case.<span>&nbsp; </span>This is done simply enough by instantiating a deferred object at the top of the function and then returning the promise of the deferred object at the bottom of the function.</p>
<table class="MsoTableGrid" style="border: currentColor;border-collapse: collapse" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 467.5pt;border: solid windowtext 1.0pt;background: black;padding: 0in 5.4pt 0in 5.4pt" valign="top" width="623">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">breeze</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">EntityManager</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">prototype</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">combinedQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">remoteOnly</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> deferred </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">Q<span style="color: #b4b4b4">.</span>defer</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">();</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">localQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//default value for parameters</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">remoteOnly</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">===</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">||</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">remoteOnly</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">===</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> undefined</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">remoteOnly</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">false</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">try</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(!</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">remoteOnly</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">queryTracker</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">exists</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">))</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">localQuery</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">query<span style="color: #b4b4b4">.</span>toType</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query.resultEntityType</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//try local query</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">this</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">executeQueryLocally</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">localQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//if it isn't in cache, results should be null</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">!=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&amp;&amp;</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">!=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> undefined </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&amp;&amp;</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">results<span style="color: #b4b4b4">.</span>length</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&gt;</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b5cea8;background: black">0</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">deferredSuccess</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">results</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">else</span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//execute remote</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">queryTracker<span style="color: #b4b4b4">.</span>add</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">this</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">executeQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">then</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">deferredSuccess</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">fail</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">deferredFailure</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">catch</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">e</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">deferredFailure</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">e</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">deferredSuccess</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">data</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&hellip;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">deferredFailure</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">data</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&hellip;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">return</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">deferred<span style="color: #b4b4b4">.</span>promise</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">};</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoSubtitle" style="margin-left: .5in;text-indent: -.25in"><span><span>1.<span style="font: 7.0pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span><span class="SpellE"><span class="GramE">combinedQuery</span></span><span class="GramE">(</span>) complete</p>
<p class="MsoNormal">I first try the local query and check the results to see if I received any.<span>&nbsp; </span>If I do, I assume that they are the desired results and return then as part of the deferred object&rsquo;s success handler for the promise:</p>
<table class="MsoTableGrid" style="border: currentColor;border-collapse: collapse" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 467.5pt;border: solid windowtext 1.0pt;background: black;padding: 0in 5.4pt 0in 5.4pt" valign="top" width="623">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">!=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&amp;&amp;</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">!=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> undefined </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&amp;&amp;</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">results<span style="color: #b4b4b4">.</span>length</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&gt;</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b5cea8;background: black">0</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">deferredSuccess</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">results</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoSubtitle" style="margin-left: .5in;text-indent: -.25in"><span><span>2.<span style="font: 7.0pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span>Check results for local query</p>
<p class="MsoNormal">If I didn&rsquo;t get any results then I try the remote query and pass the deferred object&rsquo;s success handler.<span>&nbsp; </span>Since I&rsquo;m returning the promise of the deferred object, the promise is resolved by either the local or remote query in the <span class="SpellE"><span class="GramE">deferredSuccess</span></span><span class="GramE">(</span>) function:</p>
<table class="MsoTableGrid" style="border: currentColor;border-collapse: collapse" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 467.5pt;border: solid windowtext 1.0pt;background: black;padding: 0in 5.4pt 0in 5.4pt" valign="top" width="623">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">deferredSuccess</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">data</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">returnData</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">data</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">results</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">===</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> undefined</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">returnData</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> data</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">else</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">returnData</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">data<span style="color: #b4b4b4">.</span>results</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">deferred<span style="color: #b4b4b4">.</span>resolve</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">returnData</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoSubtitle" style="margin-left: .5in;text-indent: -.25in"><span><span>3.<span style="font: 7.0pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span>Returning only data to the promise resolve</p>
<p class="MsoNormal">One last adjustment that must be made in order to return a consistent result to the caller is to return the data.<span>&nbsp; </span>Using a remote query, the result contains information about the query and other things including a property named &lsquo;results&rsquo;.<span>&nbsp; </span>In order for me to get at the data from the remote query I have to access that property.<span>&nbsp; </span>However, for a local query, the data passed to the success handler is only the resulting data.<span>&nbsp; </span>Thus, in order to just have my caller get the results each time I&rsquo;m handling that in the success handler by resolving the promise with only the data results.</p>
<h1>Matched Query Caching</h1>
<p class="MsoNormal">With the <span class="SpellE"><span class="GramE">combinedQuery</span></span><span class="GramE">(</span>) method in place, the developers have a consistent means to query data with worrying about its location.<span>&nbsp; </span>However, I&rsquo;m left with a problem.<span>&nbsp; </span>The check I&rsquo;m doing against the local query simply looks for any results.<span>&nbsp; </span>The problem with that is if I query <span class="SpellE">EntityA</span> and get 1 result, but in a subsequent query against <span class="SpellE">EntityA</span> we expect 3 the <span class="SpellE">combinedQuery</span> would see the 1 result from the cache, declare success, and return the result.<span>&nbsp; </span>Usually, the developer making the call would make a decision to make a remote call knowing that data in the cache was insufficient to address the second query.<span>&nbsp; </span>Thus, I needed to bake in some minimal intelligence to match the query such that any query will be routed to the remote endpoint the first time it is requested, but will hit <span class="SpellE">localcache</span> the second time.</p>
<p class="MsoNormal">To do this, I created a <span class="SpellE">queryTracker</span> that does <span class="GramE">an exists</span> check.<span>&nbsp; </span>If the query has not been made before the <span class="SpellE"><span class="GramE">combinedQuery</span></span><span class="GramE">(</span>) will make a remote call and add the query to the list of queries that have been called.<span>&nbsp; </span>If it does exists, I check the local cache first.</p>
<table class="MsoTableGrid" style="border: currentColor;border-collapse: collapse" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 467.5pt;border: solid windowtext 1.0pt;background: black;padding: 0in 5.4pt 0in 5.4pt" valign="top" width="623">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">queryTracker</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">exists</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">))</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">localQuery</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">query<span style="color: #b4b4b4">.</span>toType</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query.resultEntityType</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//try local query</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">this</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">executeQueryLocally</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">localQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoSubtitle" style="margin-left: .5in;text-indent: -.25in"><span><span>4.<span style="font: 7.0pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span>Check for previous query execution then query locally</p>
<p class="MsoNormal">Within the <span class="SpellE">queryTracker</span> I need to do some sort of deep compare.<span>&nbsp; </span>However, knowing how we&rsquo;re querying, I don&rsquo;t go for a full deep compare, but instead simply filter to match the <span class="SpellE">resultEntityType</span> and then compare the predicates of each one of those to the predicates on the new query.</p>
<table class="MsoTableGrid" style="border: currentColor;border-collapse: collapse" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 467.5pt;border: solid windowtext 1.0pt;background: black;padding: 0in 5.4pt 0in 5.4pt" valign="top" width="623">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">queryExists</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//check for existing query based on target entity and predicate</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">matchedQueries</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">new</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> Array</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">();</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">matchedQueries</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> _</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">filter</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">queries</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">savedQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">){</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">return</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">savedQuery<span style="color: #b4b4b4">.</span>resultEntityType</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">==</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">query<span style="color: #b4b4b4">.</span>resultEntityType</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&amp;&amp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">savedQuery<span style="color: #b4b4b4">.</span>wherePredicate<span style="color: #b4b4b4">.</span>toString</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">()</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">==</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">query<span style="color: #b4b4b4">.</span>wherePredicate<span style="color: #b4b4b4">.</span>toString</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">();});</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">return</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">matchedQueries<span style="color: #b4b4b4">.</span>length</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&gt;</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b5cea8;background: black">0</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoSubtitle" style="margin-left: .5in;text-indent: -.25in"><span><span>5.<span style="font: 7.0pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></span><span class="SpellE"><span class="GramE">queryExists</span></span> function</p>
<p class="MsoNormal">The simplest way I found to do this was to make use of a <span class="SpellE"><span class="GramE">toString</span></span><span class="GramE">(</span>) function that is available on the <span class="SpellE">wherePredicate</span> object of the query.<span>&nbsp; </span>Fortunately, it serializes the complete list of predicates and seems to do it in the same order each time.<span>&nbsp; </span>This has obvious limitations in that I don&rsquo;t account for query differences like what is expanded or navigation property queries.<span>&nbsp; </span>However, for our use it is sufficient; for yours you may need a deeper/more complex comparison between query objects.</p>
<h2>Summary</h2>
<p class="MsoNormal">With that, we have created a single promise based query mechanism that shows up as part of the <span class="SpellE">EntityManager</span> object and makes decisions about local and remote querying based on a query match for entity type and predicates.<span>&nbsp; </span>Hopefully, you&rsquo;ll find some part of this useful in the code you&rsquo;re writing using Breeze.<span>&nbsp; </span>I&rsquo;ve included the full examples below for reference.</p>
<table class="MsoTableGrid" style="border: currentColor;border-collapse: collapse" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 467.5pt;border: solid windowtext 1.0pt;background: black;padding: 0in 5.4pt 0in 5.4pt" valign="top" width="623">
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">breezeQueryTracker</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">()</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> queries </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">[];</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;</span><span>&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">addQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">queryToAdd</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">queries<span style="color: #b4b4b4">.</span>push</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">queryToAdd</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">removeQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">queryToRemove</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//TODO: Implementation</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">return</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">false</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">queryExists</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//check for existing query based on target entity and predicate</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">matchedQueries</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">new</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> Array</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">();</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">matchedQueries</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> _</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">filter</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">queries</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">savedQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">){</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">return</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">savedQuery<span style="color: #b4b4b4">.</span>resultEntityType</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">==</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">query<span style="color: #b4b4b4">.</span>resultEntityType</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&amp;&amp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="SpellE">savedQuery<span style="color: #b4b4b4">.</span>wherePredicate<span style="color: #b4b4b4">.</span>toString</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">()</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">==</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">query<span style="color: #b4b4b4">.</span>wherePredicate<span style="color: #b4b4b4">.</span>toString</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">();});</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">return</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">matchedQueries<span style="color: #b4b4b4">.</span>length</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&gt;</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b5cea8;background: black">0</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">return</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>queries</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">:</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> queries</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>add</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">:</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">addQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//remove: <span class="SpellE">removeQuery</span>,</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>exists</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">:</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">queryExists</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">};</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">queryTracker</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">new</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">breezeQueryTracker</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">();</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//add query command to breeze</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">breeze</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">EntityManager</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">prototype</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">combinedQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">targetTypeName</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">,</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">remoteOnly</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> deferred </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">Q<span style="color: #b4b4b4">.</span>defer</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">();</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">localQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//default value for parameters</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">remoteOnly</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">===</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">||</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">remoteOnly</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">===</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> undefined</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">remoteOnly</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">false</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">try</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(!</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">remoteOnly</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">queryTracker</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">exists</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">))</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">localQuery</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">query<span style="color: #b4b4b4">.</span>toType</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">targetTypeName</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//try local query</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">this</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">executeQueryLocally</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">localQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//if it isn't in cache, results should be null</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">!=</span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">null</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&amp;&amp;</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> results </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">!=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> undefined </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&amp;&amp;</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">results<span style="color: #b4b4b4">.</span>length</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">&gt;</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b5cea8;background: black">0</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">deferredSuccess</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">results</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">else</span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//execute remote</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">queryTracker<span style="color: #b4b4b4">.</span>add</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">this</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">executeQuery</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">query</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">then</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">deferredSuccess</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">fail</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">deferredFailure</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">catch</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">e</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">deferredFailure</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">e</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">deferredSuccess</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">data</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">var</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">returnData</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//if the data we went after was in a remote store, the return value has the associated query, <span class="SpellE">entitymanager</span>, and other objects.</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//however, we only want the <span class="SpellE">data.results</span>.<span>&nbsp; </span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #57a64a;background: black">//if it was a local query then the incoming data will be all that we need.</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">if</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">data</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">.</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">results</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">===</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> undefined</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">returnData</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> data</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">else</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">returnData</span> </span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">=</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">data<span style="color: #b4b4b4">.</span>results</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">deferred<span style="color: #b4b4b4">.</span>resolve</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span class="SpellE"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">returnData</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">function</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">deferredFailure</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">data</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">)</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="SpellE">deferred<span style="color: #b4b4b4">.</span>reject</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">(</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">data</span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">);</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black">&nbsp;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #569cd6;background: black">return</span><span style="font-size: 9.5pt;font-family: Consolas;color: gainsboro;background: black"> <span class="SpellE">deferred<span style="color: #b4b4b4">.</span>promise</span></span><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">;</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal"><span style="font-size: 9.5pt;font-family: Consolas;color: #b4b4b4;background: black">};</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
</div>]]></content:encoded>
    </item>
    <item>
      <title>Research Topics</title>
      <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/research-topics</link>
      <pubDate>Mon, 06 Feb 2012 08:57:41 GMT</pubDate>
      <dc:creator><![CDATA[Joseph Fultz]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/joseph_fultz/2012/02/06/research-topics/</guid>
      <description><![CDATA[There are a couple of things that have been on my mind for over a year now.&nbsp; If I were working...]]></description>
      <content:encoded><![CDATA[<p>There are a couple of things that have been on my mind for over a year now.&nbsp; If I were working in an educational institution I think I'd pick one of them for a thesis.&nbsp;</p>
<p>The first item is flow equations as it relates to data.&nbsp; Think about it, electrical, gas, and fluid, for that matter probably traffic flow, all have equations and models for calculating flow.&nbsp; Take a look at what is in Wikipedia as an example: <a href="https://en.wikipedia.org/wiki/Groundwater_flow_equation">https://en.wikipedia.org/wiki/Groundwater_flow_equation.</a>&nbsp; The need and even mechanism for calculating the flow is common.&nbsp; As I think about this in respect to data, it also has similar characteristics.&nbsp; It has to flow through different size channels and mechanisms that act as different size conduits and even different type mediums, it gets consolitdated, it gets dispersed, and even the data itself could be attributed as being of different viscosity.&nbsp; So, my thought is that there are ways to create models with which we could represent data flow much like fluid.&nbsp; I think this has similar, but somewhat different models microscopically (within a single application) or macroscopically (across systems, organizations, etc.).</p>
<p>My second thing, which is probably harder to nail down with facts, figures, and models is the concept of software genetics and evolution.&nbsp; Specifically, I think that software and systems have a genotype and a phenotype.&nbsp; Let's face it who imagines their solution imperfectly.&nbsp; When one starts with an idea, with a design, it is envisioned perfectly.&nbsp; At the point after it is imagined and starts to factor in reality is when the maturity and experience of the architect/developer comes into play.&nbsp; The alterations made to a design or implementation based on fitting it into its target environment represent its phenotype.&nbsp; In fact, the changes made under maintenance is its evolution which inevitably will get reflected back into new designs thus changing their initial genotype and then the cycle of life and evolution continues.</p>
<p>If anyone reads my blog and knows someone doing research in this area, post up, because I'd like to get involved.</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>March MSDN: Cloud Services Mashup</title>
      <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/march-msdn-cloud-services-mashup</link>
      <pubDate>Sun, 06 Mar 2011 19:14:16 GMT</pubDate>
      <dc:creator><![CDATA[Joseph Fultz]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/joseph_fultz/2011/03/06/march-msdn-cloud-services-mashup/</guid>
      <description><![CDATA[In my March column entry I go through combining several cloud services using ACS to authenticate via...]]></description>
      <content:encoded><![CDATA[<p>In my March column entry I go through combining several cloud services using ACS to authenticate via Facebook and build a demo application.</p>
<p><a href="https://msdn.microsoft.com/en-us/magazine/gg650655.aspx">https://msdn.microsoft.com/en-us/magazine/gg650655.aspx</a></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Branch-Node Sync Part 2: Service Based Sync</title>
      <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/branch-node-sync-part-2-service-based-sync</link>
      <pubDate>Sun, 13 Feb 2011 22:52:55 GMT</pubDate>
      <dc:creator><![CDATA[Joseph Fultz]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/joseph_fultz/2011/02/13/branch-node-sync-part-2-service-based-sync/</guid>
      <description><![CDATA[In February's issue I take a further look at the Sync Framework using Services in&nbsp;Windows Azure...]]></description>
      <content:encoded><![CDATA[<p>In February's issue I take a further look at the <a href="https://msdn.microsoft.com/en-us/magazine/gg598920.aspx">Sync Framework using Services in&nbsp;Windows Azure</a> to sync corporate databases lets you scale to many more end nodes than are possible with direct-to-database synchronization. </p>
<p><img height="195" width="493" src="https://i.msdn.microsoft.com/gg598920.Fultz_Figure1_hires(en-us,MSDN.10).jpg" border="0" style="max-width: 550px;" /></p>
<p><a href="https://msdn.microsoft.com/en-us/magazine/gg598920.aspx">https://msdn.microsoft.com/en-us/magazine/gg598920.aspx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Branch-Node Synchronization with SQL Azure</title>
      <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/branch-node-synchronization-with-sql-azure</link>
      <pubDate>Wed, 05 Jan 2011 05:47:54 GMT</pubDate>
      <dc:creator><![CDATA[Joseph Fultz]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/joseph_fultz/2011/01/05/branch-node-synchronization-with-sql-azure/</guid>
      <description><![CDATA[The latest installment to my column is available at...]]></description>
      <content:encoded><![CDATA[<p>The latest installment to my column is available at <a href="https://msdn.microsoft.com/en-us/magazine/gg535668.aspx">https://msdn.microsoft.com/en-us/magazine/gg535668.aspx</a>.&nbsp; It is a primer on architecture and code using Sync Framework and SQL Azure.&nbsp; Look for February's installment to delve into data synchronization using web services in Windows Azure.</p>]]></content:encoded>
    </item>
    <item>
      <title>Integrating SharePoint and Windows Azure Storage</title>
      <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/integrating-sharepoint-and-windows-azure-storage</link>
      <pubDate>Sun, 05 Dec 2010 18:53:54 GMT</pubDate>
      <dc:creator><![CDATA[Joseph Fultz]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/joseph_fultz/2010/12/05/integrating-sharepoint-and-windows-azure-storage/</guid>
      <description><![CDATA[Check out my latest column about pushing content from SharePoint up to Azure Storage and providing a...]]></description>
      <content:encoded><![CDATA[<p>Check out my latest column about pushing content from SharePoint up to Azure Storage and providing a working link still in SharePoint:&nbsp;https://msdn.microsoft.com/en-us/magazine/gg490343.aspx.</p>]]></content:encoded>
    </item>
    <item>
      <title>Choosing Azure Data Storage</title>
      <link>https://docs.microsoft.com/archive/blogs/joseph_fultz/choosing-azure-data-storage</link>
      <pubDate>Mon, 08 Nov 2010 20:33:20 GMT</pubDate>
      <dc:creator><![CDATA[Joseph Fultz]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/joseph_fultz/2010/11/08/choosing-azure-data-storage/</guid>
      <description><![CDATA[Check out my latest column regarding SQL Azure and Windows Azure...]]></description>
      <content:encoded><![CDATA[<p>Check out my latest column regarding SQL Azure and Windows Azure Storage:</p>
<p><a href="https://msdn.microsoft.com/en-us/magazine/gg309178.aspx">https://msdn.microsoft.com/en-us/magazine/gg309178.aspx</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
  </channel>
</rss>