Integrations with Non-Relational Data Sources
Integrations with Non-Relational Data Sources
I’d like to welcome Jared from C-Data. Hi, Jared. Are you there? I’m here. Thanks for having me shown. Thanks for joining me. Jared is from a company called C-Data and we’re going to get into all about what they do and why it works with a Servoy. But before we do that, I want to just kind of talk about what’s on the agenda for today. As you know, if you’ve been in this tech series before, we always start with a few demos and C-Data as a company that’s all about connectivity and was it probably two weeks ago, Jared? We got into contact maybe three weeks ago, into contact with each other and sort of put together a little proof of concept to see how C-Data’s technology and Servoy technology could work together. And yeah, that went pretty well and I got pretty excited and said, well, we have to do this for our next webinar. So that’s what brings us here today. And the demos that I’d like to show are just some example use cases. One is going to be connecting to Salesforce platform. The other one’s just going to be connecting to my Google Drive service. And after a few demos, we’ll get into some more use cases and kind of how it works. So oh, by the way, this webinar is recorded. So you can always access the recordings on our archives. And there is a questions panel in your go to webinar console there. You can just type the questions in and we’ll do a few minutes at the end for Q&A. So please ask questions as they pop in your head. Don’t be shy. All righty. So I’m going to go into my Servoy IDE and I’m going to launch the ng client and bring up an example solution. The first thing I’m going to do. Yeah, real quick, we’ve got somebody saying that they can’t see this screen. Okay, but it looks like they left. But you can see my screen, Jared. I can see your screen. Yes. Okay. So. And we’re getting information. Okay. Yeah. There it is. Compromation. Thanks. Now everyone’s everyone can. Okay. Thanks guys. And thanks, Jared. I’ve done that more than more than once, believe me, where I start talking and seeing my screen. Okay. So first thing I’m going to do is I’m going to click my Salesforce accounts link here in my little demo solution that I prepared over the past couple days. And I’m listing some records that are coming directly from Salesforce. And this is a, for those of you that are familiar with Servoy, this is just a typical kind of table view with some search functionality and I’ll click through it in a minute. What I want to do is show you real quickly how I set up the connection. And then we’ll come back and click through some of the functionality. So I’m going to go into, I just ignore that. I accidentally tried to launch Servoy again. I’m going to go into my database servers set up here. And I wonder if it’s because I accidentally click this. No, that’s not it. It’s I think refreshing the schema. Jared, you may remember that when we were setting this up before the Salesforce schema is quite big. And when when we first make a connection, it refreshes the schema and periodically, I think the IDE can refresh the schema. So I think that’s what’s happening. Well, this is a fine start to the demo. Yeah, but I mean, you’re right there, Sean. So it is point to, so it’s pointing to the Salesforce API and every end point gets exposed like a database. So depending on how large an API you’re working with, it can take some time to refresh everything. Just see if there’s anything in there we go. It was just refreshing. Okay. I was panicking and checking the log. So I expanded the database servers node and and it was Servoy developer as you guys probably know who have experience caches the data model up front so that once you start working with it, then it’s faster. So now I’m going to double click and open up the Salesforce connection. And this is just like any other JDBC connection. And that’s why I got really excited about it first started talking to Jared because Servoy is primarily connecting to relational databases with JDBC. And we have all these nice features that are built into the platform that are very mature with data binding and some productivity for querying and caching and searching and all that stuff, which has been fantastic for many years to work with just relational databases and flat files and things like that. What C-data does is they make drivers and including JDBC drivers that connect to lots of other stuff like web services and other platforms. So what I’ve done is I’ve taken one of their drivers and I’ve dropped it in my drivers folder and when I start the Servoy developer that that shows up in the list of available drop downs. So I select the driver. I got some configuration advice from Jared, including username, password, and a security token from Salesforce. And once I make that connection, it exposes the full schema of the Salesforce backend. Now mind you, that’s a platform with probably a REST API, but I’m seeing it like a database. That means I can search through the entities of my Salesforce without having to write HTTP code and handle authentication and all that stuff. It just works for me. So let’s take a look at some of the features you might expect from a Servoy application. One thing that I wanted to do, one of the first things we did when we did a little proof of concept, is just connect and kind of scroll through and check the performance and then see what I was sort of expecting there to be problems with queries and the kind of queries that Servoy generates because we generate kind of standard SQL. So as I scroll through, you can see that the lazy load kind of thing that Servoy does usually does on a database also applies with these drivers. Now you can imagine if you were writing the code yourself to connect to the Salesforce API, you have to manage like the paging and the caching and that’s done without without writing any code here. If we look at the database performance for that, I should probably clear these and do it again. Well now it’s all cached, so now we’re not going to see any queries if I scroll. Well, let’s just scroll really far. I’m probably getting some reloads. There we go. So now you can see I’m loading in chunks of records and looking at the performance, it was pretty performant. I called that four times with an average of 120, so 100 tries to have a millisecond. So this really feels just like connecting to other data sources in the way that Servoy developers typically do. One other thing that I want to point out is when you connect to a data source and any data source and Servoy and you check the enable procedures option, then it will expose any internal stored procedures that the database might have. Well, low and behold, there are things of course in any sort of platform API that are not necessarily entity based and C-data drivers expose those as procedures. So we have an example of that coming up, but you can just see that there’s quite some procedures that get exposed as well from Salesforce through the driver in a way that I can call directly from Servoy and as you know, Servoy added about a year and a half ago, a nice feature that exposes the procedures and includes data binding and maps the data types and stuff for you. So that works really nicely. We have an example of that coming up. Some other things that you might see in a typical application are, say, searching. So I’m going to search for electronics companies and you can see the search was pretty quick. I’m using one of the, one of the search API’s Servoy extensions that allows you to do text-based searching in it generates SQL for you. That gets sent to the driver and you can see that there is this custom search here and I used the default search all columns. So there’s a lot of columns on that table and it does case insensitive and it’s a lot of oar. So it’s a fairly complex query to find any records matching electronics or a string fragment of that. The other thing that I would point out is that I’m going to go to the data source for accounts. I created this morning I made an aggregate on a account called Record Count, which just accounts by ID and you’ll notice that up here I have 56 matching records. If I clear it and hit Enter I go back to the original 570. So I also wanted to test some other SQL constructs and if I go to the query here you can also see there’s that aggregate. So the where clause with the aggregate with the count ID is generated as well. So I’m really throwing, I was doing a lot of stuff to throw a lot of neat things at this driver. Another thing that I want to point out, all the typical Servoy constructs are available. So there’s an aggregation. I also wanted to check out relations. So I made a few relations. One is contact to account and account to contact. And I made another screen here with contacts and you can see that I’m showing the related account here. So that’s not in the primary table. That’s in the foreign table. But also if I were to search by account, okay now I’ve broken it. Hmm. Let’s see if we’re hitting it. Real quick. Now I’m not hitting it for some reason. Well, so I wanted to show that it generates a join across across the driver. But I think if you’ve seen a lot of the webinars where we talk about searching, the searching can generate some really complex queries. And I really was playing with this and trying to get it to search with joins and everything. And it really just worked just like I was talking to a database. So that covered a lot of the stuff like aggregates and complex queries like joins. The other thing that I wanted to do, I was able to make a value list as well and do things like look up. So let me show you editing because that’s another unique feature. So I’m going to come into one of these records by double clicking. And so now you can see the detail record here. This is edge communications company that I have in the Salesforce backend. What I’d like to do is bring up that same company here. So this is now looking at the Salesforce console. And there’s edge communications there. So back in the Servoy application, I’m going to just rename this edge communications ink and click out. And so what that actually did is it submitted it to the driver as an update statement and the driver went and sent the appropriate commands to the Salesforce API. And if I probably go into the detail here, maybe I have to refresh it. There it is. Edge communications ink. So now it’s been updated from the driver. And if I look at the queries here, you can see that I have the update account down here. So it changed the account name for me. So you can update through the driver insert, etc. And it exposes all of that to you. So really it’s just like building other Servoy applications. One thing, one other thing you might notice here is there’s a map. And I wanted to show the idea of a calculation, which is another concept in Servoy. So the map is on the contact detail screen. And if we look at, take some minute to load. It’s always a bit slower when the meeting is presenting. Not the contact detail, not go ahead account detail. I wanted to feed the map coordinates to, um, here’s the map. That’s on the shipping tab. It’s in a separate form. I did a tap and I wanted to show related records, which I’ll show in a second as well. So here’s the shipping form. And you can see that the data provider for the marker is coming from map address which was a calculation that I made on, on the table. So another way to look at this would be to go back to that account table and look at calculations. And there you can see the map address. So that’s just concatenating a few of the properties. But you know that the data binding for the map works so that, you know, if I were to change this from Austin to Houston, the map moves, you know, so if I’m getting different data back from, from the website, from the Salesforce service through the driver, then, you know, the calculation is going to run. And so everything that you normally do in Servoy with all the data binding features, it really just kind of works. Another one is the relation that I made with the accounts of the contact. So this is now showing that I have two related contacts on this account. And if I go to, you know, some other, some other accounts, you can see I have other related contacts. So pretty much the, if you have experienced building applications in Servoy, it really feels like you’re talking to a database. It’s, it’s wonderful. Okay, I think that’s all I wanted to show with connecting to Salesforce, except for that the little search here didn’t work, but it was just to show that I could search a contact based on their account, which generates a join. But it’s just not calling. I don’t have the method hooked up, I think, but rather than debug that in front of you, I’ll just keep moving. The other example that I really wanted to show you was a different service, Google Drive. And the reason I want to show this is to explore the procedures type things. So I’m going to go back into the IDE here. And I’m going to bring up first of all my Google Drive configuration. And you can see here all I did was give it a server name and give it the URL and a bit about how it authenticates. And I’m going to talk about that in a minute, but just that it was this easy to set up the connection after I had taken the driver from CData and put it in my drivers folder. It exposes a few of the entities here as tables, but what I was interested in is looking at some of the procedures and I’d like to upload a file. So I can see that there’s upload file there. And so I tried it out. And what I did is in my form called files, I think, I’ll just open that and show you the upload target. So I handled the method or the event for the on file uploaded. And what I want you to pay attention to is this line here, line 27, because that’s where I’m sending stuff to the driver. So in this case, I got the bytes from the file and I call this this procedure, but keep in mind, and this is a this is not an often used feature of servois. So maybe I’ll actually type through this for you, but data sources dot and then the data source type is sp stored procedure. And it’ll go and find any data sources that have enabled procedures. And those are the two that I’ve enabled. And after Google Drive, it lists the procedures. And if I’m looking at upload file, you can see it gives me the parameter and the data types that it expects. So that’s it was that easy to try it out. Also, there’s some really nice documentation on all of the procedures of all of the drivers on the C data documentation website, Jared prepares a lot of really nice knowledge based articles and documentation. So let’s try it out. I’m going to go here. I’m going to click. I’m going to just grab this log file. And it uploaded it to Google Drive. And so you can see that I did hard code a folder ID here. And there it is right there. You can see that it was just uploaded one minute ago. And this is the folder ID. So I kind of just hard go to that in because I knew, but there’s a whole API and entity way to work with Google Drive that the point here is not really the Google Drive stuff. It’s just that it was that easy to run a store procedure. So I hope that makes sense about the store procedures. But I was I was really pleased to see that because it just makes, I mean, I don’t have to deal with any rest, any HTTP code, even even the authentication was handled. And that brings me to the next topic. You may have wondered how did I how did I connect to my Google Drive and not someone else’s because if you look at the Google Drive connection profile here, it doesn’t specify any token or anything like it did. But the Salesforce one I had username password and token and here it just says initiate OAuth is the get and refresh. So what happened is the first time I initialized the connection pool, I went through the OAuth step and I authorized that account. And now it’s it’s stored the credential automatically refreshes the credential and the driver manages all of that. It’s really really nice. So what I’m going to do is kind of clear the authentication and I think there is it stashes the credential somewhere on my server machine. So I’m going to go ahead and delete that and I’m going to try to re-initialize the connection pool here and it should kick off the authentication. So now it’s it’s you’ve probably seen this using any other applications that that rely on OAuth for another service. What it’s saying is do you want to allow in this case c-data Google Drive connectors the registered app. And that’s the one that’s sort of sample one that’s that’s hardcoded or messages they built in by as a default to the driver and Jared you can find mistake mistake that. That’s right. Yeah. So most people wouldn’t wouldn’t do that. They would they would they would probably register their own application with Google or with whomever you’re connecting to and and have the authentication be light labeled for their own use. And then I picked the account that I wanted and then it talks about the scope the OAuth scope which is what are the permissions that you want to enable and and I click allow and then and then I’m done and now those connections are preauthorized and and this will work. Now that happened when I initialized the connection pool. So that that would be kind of strange because in a production environment that happens when the application server starts. Fortunately you’ll notice on the procedures that there’s always these OAuth for the ones that require OAuth there’s always these OAuth you know I can I can get the authorization URL I can through Servoythere’s a simple API to show another URL and I can do that and get the token back in the callback and all of that. So that’s sort of the custom way that most people would do it but for the sake of the demo I just left it at the simple OAuth the one that’s built in. Okay so that kind of concludes the demo part what I’d like to do is talk a bit more about who CData is and how they can bring value to business applications so I’m going to turn it over to Jared and Jared if you could just kind of give us a quick you know hello world statement for CData and we’ll get into some use cases and kind of underpinnings of what we saw technically. Yeah no absolutely and I really feel like I don’t really have to say a lot I think you you covered kind of how CData works and what we offer really well so thanks for that Sean. So CData software we’re leading provider of data access and connectivity solutions and our motto is really we want to let customers see the world as a database and the way that we do that is by providing SQL access through standard drivers like JDC to data sources that are not databases so you’re online applications your web services no SQL data stores big data stores even like directories full of flat files regardless of what the data source is as far as a developer is concerned as far as a user is concerned it’s going to look like a database so if you want to jump to the next slide we can kind of see what that looks like as a picture so this is just kind of how this works so your applications that’s going to be either what you’re building in Servoy or if you are doing some analytics or ETL or anything like that they can often already connect to relational databases they already speak SQL so our drivers plug in we’ll translate the SQL query into the API requests or the wire level protocol depending on kind of what data sources going on in the background and get the data from the backend data source so from the web service like Salesforce from a directory of flat files whatever the case is and then by the time it makes it back to your application it looks like database data so you’re able to process it and do all of the database functionality that Sean talked about so joins aggregates you know defining relationships filtering you know selecting specific fields and things like that so we jump to the next slide and we’ll take a look at some of the data sources that we support so this is not an exhaustive list I think we’re pushing 150 now but you can see some some of the popular ones there’s a lot of data in the Microsoft ecosystem whether you’re looking at the dynamic 365 world or there’s a the Google ecosystem we have a lot of access to so Gmail your AdWords your Google Analytics data SAS applications like Salesforce HubSpot you’re even looking at you know point of sales software like Square or accounting software like QuickBooks the list goes on and I could take another 20 minutes to try to write all off the rest but instead why don’t we talk about some use cases so typical use cases for CDN of customers so kind of the I don’t want to call it the primary but this is the one I think that gets the most visibility is it provides BI enablement on your software as a service data so Salesforce QuickBooks online other accounting software like zero instead of having to replicate that data into a database you’re getting direct access to it from your BI tools so you’re able to do data and analytics without having to replicate your data so which means it like if I if I wanted to mash up data from my QuickBooks with all the custom data in my in my application and see it as in kind of like a unified analytics I can just do that as an as another database table right yeah absolutely yeah and so the next one and this is you know basically what we’re looking at here is ease of integration for developers so you know instead of having to write the integration instead of having to implement some kind of you know rest client that’s able to consume a rest API you simply talk to a data source like it’s a database so instead of learning the API you simply need to know SQL or be working in a tool or platform that speaks SQL like Servoy and you get basically instant drag and drop access to your data so the another use case and this kind of encompasses the first two is embedded connectivity so if you’re like an enterprise tool developer instead of having to outsource that connectivity or having to require your customers to replicate their data you can just provide live connectivity to all of their data from within your tool and so this would you know putting the JDBC drivers inside of a tool that you build and then kind of the last use cases is broader ad-data access for specific tooling so there’s a company called bouquet.ai and they have a tool that’s called auras which is short for Aristotle and it’s a tool that allows you to transform natural language into SQL queries and so then they can do some AI and analytics based on that but they could only talk to databases so they’re translating you know like a question like what was the highest-rated customer for Q1 in 2019 and they’ll translate that into a SQL query I mean you can imagine that that SQL query is very complex which is fine if you’re talking to a database but they didn’t have a way to do that and talk to something like Salesforce or QuickBooks or HubSpot but with the CData drivers now that SQL query gets translated by the driver into the API request and then they can be processed and dealt with just like database data. Yeah I think that that’s the most compelling thing that I saw too is that I mean in Servoy developers all the time are making a quick I mean we have the grid that that I was showing can turn into a pivot grid and just with a few clicks can can start to do some analytics and aggregations and some really powerful stuff and that could be that could be on any data source and I think that was that I mean obviously the example I showed kind of looked like the same screen that you get in Salesforce and that the point is not to rebuild Salesforce but you know to access these data sources like their database and I think that that’s just intuitive for Servoy developers and it takes some of the features in Servoy like the data binding and the SQL generation and it just empowers that capability to new levels and so I think it’s it’s pretty compelling. Let’s get into the bits and bots of it can you talk about how it works and yes absolutely so you I mean you covered a lot of this which was great but you know we’ll put it all together so the CData drivers work by modeling data access through SQL so typically we’re talking to a REST API that’s going to have endpoints and those endpoints typically correspond with some sort of resource or entity so you know Salesforce account Salesforce contact Salesforce opportunities and the list goes on anything that can be read from and written to is going to be exposes the database table anything that is read only and these tend to be like reports or you know like modified times or different entities like that those are going to be surfaces views the individual objects within a table or you are or individual object within the platform so the Salesforce account a single account will correspond to a row as you demonstrated a single contact will correspond to a row and then you also demonstrated that those sub collection relationships are maintained so each contact is associated with the specific account each opportunity is associated with a specific account if you’re talking about invoices and invoice line items those relationships are maintained so the concept of foreign keys exist even though you’re talking to an API and then the way this all really works itself out which again you demonstrated is that your CRUD operations so get post merge delete those are all going to be translated to a corresponding SQL state so get becomes select you know delete becomes delete yeah I had to read some I had to read some of your documentation on Salesforce and then and more more so on the Google Drive stuff and as I was poking around I was I was really impressed with how consistent the sort of the semantics are that from from driver to driver it really is it’s not like there were odd quirks or exceptions I imagine that you guys are probably encountering odd things in API you know not every rest API is really well designed and even some big platforms have some oddities in their APIs but you guys kind of handle that internally do you ever get some situations where I don’t know a an entity has a you know some data in it when you read it but if you try to update that data you can only update certain columns how do you guys handle that and what is the developer experience like yeah so you know we we will try to read kind of whatever metadata is available from the API so a lot of these APIs will have some sort of metadata query that you can get information about the API and it will give us information about which columns or read only and which ones are right only and then we can kind of surface that in the database metadata as well so in a database you know certain columns might be read only we surface that just like a database would so it it does exactly what you said it kind of gives that uniform experience across the data sources so as far as your tool is concerned as far as your concerned you’re just talking to a database that has the same kinds of structures and limitations that a database has but on the back end it’s just translating that API and then so the quirks and the kind of weird things that show up these are these operations and functions that you demonstrated as well so the idea of uploading a document well that doesn’t really make sense in the context of a database like you’re not going to say like insert my file into my Google Drive folder because a Google Drive folder may not necessarily be a table in the concept of pushing bytes of data trial data into a database doesn’t always make sense right and so that happens we’ll surface those operations and functions as those store procedures and that’s more or less the way that we get around anything that doesn’t really translate into a table or a view. Nice. I encourage let me see do we have questions here I’m going to leave up this we’re getting a number of questions I’m going to leave that slide up which has some some information here for useful links first of all what I want to do as we start to get some questions in here for Jared is to sort of announce that that c-data and Servoy are going to continue this partnership because it feels really natural and I think it’s a win-win for both companies and for you guys what that means is getting getting more connectivity in and Servoy applications in a way that you’re used to working so I’m pretty excited about this partnership and if you’re already interested right away you can contact me directly or right there sdevilanceervoy.com or sales at Servoy.com if you want to check out what’s available they have this nice website with their list of drivers and they do this nice categorization too so I know that a lot of our customers are interested in for example accounting or e-commerce like they have FedEx, UPS and USPS and Shopify and Stripe and Square and all that stuff whereas some of our other customers they do need to talk to big ERP and CRM backends so go ahead and check in there to look for if certain connectivity is you want or supported and the next time you think about connecting to one of these and reading their service documentation and all that just remember that you don’t have to that that is possible to do it in the same way that you used to programming in Servoy so I’m going to leave this slide up and let’s get to the questions Jared sure well all right so there’s a lot of them that’s good yeah so I’ve seen in the website that c-data has a zero driver can I use that driver to post get invoices like I would do with a rest request yeah absolutely and I mean that’s exactly what it does so all of the functionality that you show John for Salesforce you’re going to get the exact same kind of functionality with zero okay and what if you wanted to use a Google Drive account per tenant in your solution so that’s going to mean you’ll need multiple connections so you can kind of set up the authentication to to authenticate with different Google accounts based on each database connection that you set up so you might have multiple connections that are using the Google Drive JDBC driver but each of them can point to in the end a different Google account yeah and I should I should say that that’s a good question to segue on c-data and Servoy can work together to ensure that that you’re getting the experience that that you should out of other drivers and in the Servoy platform and the way that it’s used so part of this partnership is technical partnership as well I think just in the little POC that we did we found out some little oddities about the way Servoy was using the driver and the way the driver responded just little things that both our R&D teams were able to work out pretty quickly for this demo but of course any sort of technology integration is not without little little gotchas but c-data is you know vendor supported technology just like Servoy and you get that assurance when you select vendor supported technology and so that’s another aspect of this partnership and I can see I can see working with multi-tenant applications and having different you know service accounts for different tenants and best practices and all of that you know it’ll just be like the other the other integrations that you do in Servoy that that we support another question what does this cost again you can contact me directly to talk about that um sdevlinitservoy.com somebody asked if it connects to box I guess that’s a yes yes yes and the the experience there is very similar to the google drive experience so you’ll get kind of operational data about box so list of folders list of files and then the the ability to upload documents or files download documents and files okay now that another question about about multi-tenant so Jared you get a picture of the landscape of customers we have a lot of them do have multi-tenant applications they have hybrid SaaS and on-premise stuff um yeah I think there are some some technical you know implementation challenges there I don’t think it really relates necessarily to the driver itself more about how Servoy uses it but I think that we can come up with a model that works for for multi-tenancy um the in the same way that we have we have multi-tenant applications that need to use different database connections for a tenant for things like multi-tenant oracle so I think that’s that should be doable another question another one about box does it connect to office 365 I think you said there’s a lot of Microsoft stuff in there yes so office 365 is supported okay and another one about postgres what different differentiates your paid driver with the the official you know free postgres go driver and I guess I guess the same question could apply to any of the the relational database drivers so our community uses a lot of JWC drivers for regular databases maybe you want to talk real quickly about why C-data’s drivers might be used instead of the typically the vendor-based drivers are free yeah sure I mean that’s a great question and typically what you’re going to see is performance improvements um a lot of the kind of vendor-supplied drivers are often open source which means that they’re being developed by the community which is great but and when you’re talking about C-data we’re a company specializes in connectivity and essentially this means we also specialize in data processing so the ability to um to you know process data as quickly as it comes across the wire and we often find that we will be faster than you know kind of the free drivers that exist so if if performance is is a concern then you may want to check our ZAL if it’s not then I mean by all means you know use the vendor-supplied driver that that brings up another question um can you talk a bit about about performance the the performance of the Salesforce connections were pretty good I was going through and looking at all the queries it was making and and you know they weren’t as fast as connecting directly to a database but understanding that it’s translating everything um that Servoy sends just how I was scrolling through that grid Servoy is sending um here there’s there’s one thing that I didn’t show um in the in the editing a contact I made um there’s a little construct called a lookup in Servoy and and even this stuff where I can just change it um it was really fast I mean I just I’m doing keystrokes uh here and the way this normally works is it sends a query and I don’t know why there’s all this weird auto-complete stuff there um but it sends a query per every keystroke and if I type real quickly it just was coming along and finding finding the one I want and and and then I wanted looked at the queries can you talk about um how the paging and caching works because Servoy does sort of the same thing once it’s in memory and then it’s also sending queries with like limits and offsets and I was expecting when we first got together I was expecting kind of you know maybe there will be some issues there or whatever but everything everything just worked um what do you guys do when these services don’t really natively support a great way to do that or does that always work? Yeah so it will always work um and then the kind of the performance that you’re going to see is going to be dependent on what the API supports so there are actually a lot of APIs that you know like a like Salesforce or uh QuickBooks or Zero where you know you may have hundreds or even thousands of accounts or contacts or opportunities and the API itself is going to support paging in one faster or another our engineers are going to map kind of the paging that you with the with the offsets um in SQL to the paging that supported by the API and that let’s me talk about another thing in that wherever we can we’re going to push processing down to the service so instead of having to try to turn data in memory we’re going to ask Salesforce to do the data turning and so that could be filtering um for Salesforce that also means joining so there’s functionality in the API that that means that Salesforce can support a join and so we’re going to ask Salesforce to do all that data processing so we’re not taxing your resources and that’s especially relevant as we you know are as an industry are moving towards cloud computing so you’re not taxing right not only machine resources but you’re not also you’re not tapping into those financial resources by you know spinning at more processes to process more data holding more data in memory right and things like that yeah so it’s I mean it sounds like you guys really understand the backend that you’re connecting to and that the driver’s not just uh like a rest to SQL converter but it it understands a lot about the inner workings of the the platform or the data source that you connect to to optimize it it’s not a you know not just a translator kind of thing right another question and maybe this could be our last one because um well I think we answered all the other ones this one is about QuickBooks desktop what has to be running on the QuickBooks machine what has to be installed how it maintain is is the QuickBooks connector that for the desktop version or the cloud version so we have both so we have a quick books online connector and then a QuickBooks desktop connector and as far as I know I think there’s one other piece that has to sit like there’s a free tool that has to sit on the QuickBooks desktop to machine to it’s a kind of acts like a gateway between the driver and the QuickBooks company file the QuickBooks desktop company file in order to allow you to grant SQL access to it but that connector is free um as far as I know so um and I’m happy to provide more information on that offline yeah so that’s probably what would need to be a little bit of an exploration because that’s also you know if you’re running in a browser and you want to talk to your local QuickBooks right also so maybe that’s for server-wise desktop client I’m not sure right okay um well I think we got through all the questions and that there was a lot of questions Jared that’s a good thing yeah so again this is recorded you can email me directly with any questions that you have anything that I can’t answer all forward to Jared Jared I want to thank you so much you did a great job explaining all of this I can tell that it’s resonating with our community already so I’m looking forward to working with you probably pretty soon and thanks again and thank you all and we’ll be posting the recording shortly yeah thanks Shawn it was a real pleasure to be here okay bye everyone