/*! For license information please see 9caa1f24.4b26a325.js.LICENSE.txt */
(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[1400],{4137:function(e,n,t){"use strict";t.d(n,{Zo:function(){return c},kt:function(){return g}});var r=t(7294);function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function l(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?a(Object(t),!0).forEach((function(n){o(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):a(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function i(e,n){if(null==e)return{};var t,r,o=function(e,n){if(null==e)return{};var t,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t=a[r],n.indexOf(t)>=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)t=a[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=r.createContext({}),u=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},c=function(e){var n=u(e.components);return r.createElement(s.Provider,{value:n},e.children)},p={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),m=u(t),g=o,d=m["".concat(s,".").concat(g)]||m[g]||p[g]||a;return t?r.createElement(d,l(l({ref:n},c),{},{components:t})):r.createElement(d,l({ref:n},c))}));function g(e,n){var t=arguments,o=n&&n.mdxType;if("string"==typeof e||o){var a=t.length,l=new Array(a);l[0]=m;var i={};for(var s in n)hasOwnProperty.call(n,s)&&(i[s]=n[s]);i.originalType=e,i.mdxType="string"==typeof e?e:o,l[1]=i;for(var u=2;u<a;u++)l[u]=t[u];return r.createElement.apply(null,l)}return r.createElement.apply(null,t)}m.displayName="MDXCreateElement"},6261:function(e,n,t){"use strict";var r=t(7294),o=t(4184),a=t.n(o);n.Z=function(e){var n=e.children,t=e.classNames,o=e.fill,l=e.icon,i=e.type,s=null;switch(i){case"danger":s="alert-triangle";break;case"success":s="check-circle";break;case"warning":s="alert-triangle";break;default:s="info"}return r.createElement("div",{className:a()(t,"alert","alert--"+i,{"alert--fill":o,"alert--icon":!1!==l}),role:"alert"},!1!==l&&r.createElement("i",{className:a()("feather","icon-"+(l||s))}),n)}},8757:function(e,n,t){"use strict";t.r(n),t.d(n,{frontMatter:function(){return i},contentTitle:function(){return s},metadata:function(){return u},toc:function(){return c},default:function(){return m}});var r=t(7462),o=t(3366),a=(t(7294),t(4137)),l=(t(6261),["components"]),i={title:"GoLang",sidebar_label:"golang",description:"Pinot Client for Golang",draft:!0},s=void 0,u={unversionedId:"user-guide/clients/golang",id:"user-guide/clients/golang",isDocsHomePage:!1,title:"GoLang",description:"Pinot Client for Golang",source:"@site/docs/user-guide/clients/golang.md",sourceDirName:"user-guide/clients",slug:"/user-guide/clients/golang",permalink:"/docs/user-guide/clients/golang",editUrl:"https://github.com/apache/pinot/edit/master/website/docs/user-guide/clients/golang.md",tags:[],version:"current",frontMatter:{title:"GoLang",sidebar_label:"golang",description:"Pinot Client for Golang",draft:!0}},c=[{value:"Examples",id:"examples",children:[]},{value:"Usage",id:"usage",children:[{value:"Create a Pinot Connection",id:"create-a-pinot-connection",children:[]}]},{value:"Query Pinot",id:"query-pinot",children:[]}],p={toc:c};function m(e){var n=e.components,t=(0,o.Z)(e,l);return(0,a.kt)("wrapper",(0,r.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Applications can use this golang client library to query Apache Pinot."),(0,a.kt)("p",null,"Source Code Repo: ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fx19880617/pinot-client-go"},"https://github.com/fx19880617/pinot-client-go")),(0,a.kt)("h2",{id:"examples"},"Examples"),(0,a.kt)("p",null,"Please follow this Pinot Quickstart link to install and start Pinot batch QuickStart locally."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"bin/quick-start-batch.sh\n")),(0,a.kt)("p",null,"Check out Client library Github Repo"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"git clone git@github.com:fx19880617/pinot-client-go.git\ncd pinot-client-go\n")),(0,a.kt)("p",null,"Build and run the example application to query from Pinot Batch Quickstart"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-bash"},"go build ./examples/batch-quickstart\n./batch-quickstart\n")),(0,a.kt)("h2",{id:"usage"},"Usage"),(0,a.kt)("h3",{id:"create-a-pinot-connection"},"Create a Pinot Connection"),(0,a.kt)("p",null,"Pinot client could be initialized through:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Zookeeper Path")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-go"},'pinotClient := pinot.NewFromZookeeper([]string{"localhost:2123"}, "", "QuickStartCluster")\n')),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"A list of broker addresses.")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-go"},'pinotClient := pinot.NewFromBrokerList([]string{"localhost:8000"})\n')),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"ClientConfig")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-go"},'pinotClient := pinot.NewWithConfig(&pinot.ClientConfig{\n    ZkConfig: &pinot.ZookeeperConfig{\n        ZookeeperPath:     zkPath,\n        PathPrefix:        strings.Join([]string{zkPathPrefix, pinotCluster}, "/"),\n        SessionTimeoutSec: defaultZkSessionTimeoutSec,\n    },\n    ExtraHTTPHeader: map[string]string{\n        "extra-header":"value",\n    },\n})\n')),(0,a.kt)("h2",{id:"query-pinot"},"Query Pinot"),(0,a.kt)("p",null,"Please see this ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fx19880617/pinot-client-go/blob/master/examples/batch-quickstart/main.go"},"example")," for your reference."),(0,a.kt)("p",null,"Code snippet:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-go"},'pinotClient, err := pinot.NewFromZookeeper([]string{"localhost:2123"}, "", "QuickStartCluster")\nif err != nil {\n    log.Error(err)\n}\nbrokerResp, err := pinotClient.ExecuteSQL("baseballStats", "select count(*) as cnt, sum(homeRuns) as sum_homeRuns from baseballStats group by teamID limit 10")\nif err != nil {\n    log.Error(err)\n}\nlog.Infof("Query Stats: response time - %d ms, scanned docs - %d, total docs - %d", brokerResp.TimeUsedMs, brokerResp.NumDocsScanned, brokerResp.TotalDocs)\n')),(0,a.kt)("p",null,"Response Format"),(0,a.kt)("p",null,"Query Response is defined as the struct of following:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-go"},'type BrokerResponse struct {\n    AggregationResults          []*AggregationResult `json:"aggregationResults,omitempty"`\n    SelectionResults            *SelectionResults    `json:"SelectionResults,omitempty"`\n    ResultTable                 *ResultTable         `json:"resultTable,omitempty"`\n    Exceptions                  []Exception          `json:"exceptions"`\n    TraceInfo                   map[string]string    `json:"traceInfo,omitempty"`\n    NumServersQueried           int                  `json:"numServersQueried"`\n    NumServersResponded         int                  `json:"numServersResponded"`\n    NumSegmentsQueried          int                  `json:"numSegmentsQueried"`\n    NumSegmentsProcessed        int                  `json:"numSegmentsProcessed"`\n    NumSegmentsMatched          int                  `json:"numSegmentsMatched"`\n    NumConsumingSegmentsQueried int                  `json:"numConsumingSegmentsQueried"`\n    NumDocsScanned              int64                `json:"numDocsScanned"`\n    NumEntriesScannedInFilter   int64                `json:"numEntriesScannedInFilter"`\n    NumEntriesScannedPostFilter int64                `json:"numEntriesScannedPostFilter"`\n    NumGroupsLimitReached       bool                 `json:"numGroupsLimitReached"`\n    TotalDocs                   int64                `json:"totalDocs"`\n    TimeUsedMs                  int                  `json:"timeUsedMs"`\n    MinConsumingFreshnessTimeMs int64                `json:"minConsumingFreshnessTimeMs"`\n}\n')),(0,a.kt)("p",null,"Note that ",(0,a.kt)("inlineCode",{parentName:"p"},"AggregationResults")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"SelectionResults")," are holders for PQL queries."),(0,a.kt)("p",null,"Meanwhile ",(0,a.kt)("inlineCode",{parentName:"p"},"ResultTable")," is the holder for SQL queries. ",(0,a.kt)("inlineCode",{parentName:"p"},"ResultTable")," is defined as:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-go"},'// ResultTable is a ResultTable\ntype ResultTable struct {\n    DataSchema RespSchema      `json:"dataSchema"`\n    Rows       [][]interface{} `json:"rows"`\n}\n')),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"RespSchema")," is defined as:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-go"},'// RespSchema is response schema\ntype RespSchema struct {\n    ColumnDataTypes []string `json:"columnDataTypes"`\n    ColumnNames     []string `json:"columnNames"`\n}\n')),(0,a.kt)("p",null,"There are multiple functions defined for ",(0,a.kt)("inlineCode",{parentName:"p"},"ResultTable"),", like:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-go"},"func (r ResultTable) GetRowCount() int\nfunc (r ResultTable) GetColumnCount() int\nfunc (r ResultTable) GetColumnName(columnIndex int) string\nfunc (r ResultTable) GetColumnDataType(columnIndex int) string\nfunc (r ResultTable) Get(rowIndex int, columnIndex int) interface{}\nfunc (r ResultTable) GetString(rowIndex int, columnIndex int) string\nfunc (r ResultTable) GetInt(rowIndex int, columnIndex int) int\nfunc (r ResultTable) GetLong(rowIndex int, columnIndex int) int64\nfunc (r ResultTable) GetFloat(rowIndex int, columnIndex int) float32\nfunc (r ResultTable) GetDouble(rowIndex int, columnIndex int) float64\n")),(0,a.kt)("p",null,"Sample Usage is ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/fx19880617/pinot-client-go/blob/master/examples/batch-quickstart/main.go#L58"},"here")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-go"},'// Print Response Schema\nfor c := 0; c < brokerResp.ResultTable.GetColumnCount(); c++ {\n  fmt.Printf("%s(%s)\\t", brokerResp.ResultTable.GetColumnName(c), brokerResp.ResultTable.GetColumnDataType(c))\n}\nfmt.Println()\n\n// Print Row Table\nfor r := 0; r < brokerResp.ResultTable.GetRowCount(); r++ {\n  for c := 0; c < brokerResp.ResultTable.GetColumnCount(); c++ {\n    fmt.Printf("%v\\t", brokerResp.ResultTable.Get(r, c))\n  }\n  fmt.Println()\n}\n')))}m.isMDXComponent=!0},4184:function(e,n){var t;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e=[],n=0;n<arguments.length;n++){var t=arguments[n];if(t){var a=typeof t;if("string"===a||"number"===a)e.push(t);else if(Array.isArray(t)){if(t.length){var l=o.apply(null,t);l&&e.push(l)}}else if("object"===a)if(t.toString===Object.prototype.toString)for(var i in t)r.call(t,i)&&t[i]&&e.push(i);else e.push(t.toString())}}return e.join(" ")}e.exports?(o.default=o,e.exports=o):void 0===(t=function(){return o}.apply(n,[]))||(e.exports=t)}()}}]);