"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8501],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function i(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)r=o[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=n.createContext({}),c=function(e){var t=n.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},s=function(e){var t=c(e.components);return n.createElement(p.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,p=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=c(r),f=a,d=u["".concat(p,".").concat(f)]||u[f]||m[f]||o;return r?n.createElement(d,l(l({ref:t},s),{},{components:r})):n.createElement(d,l({ref:t},s))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=f;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i[u]="string"==typeof e?e:a,l[1]=i;for(var c=2;c<o;c++)l[c]=r[c];return n.createElement.apply(null,l)}return n.createElement.apply(null,r)}f.displayName="MDXCreateElement"},83585:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>p,default:()=>d,frontMatter:()=>i,metadata:()=>c,toc:()=>u});var n=r(87462),a=r(63366),o=(r(67294),r(3905)),l=["components"],i={id:"experimental",title:"Experimental features"},p=void 0,c={unversionedId:"development/experimental",id:"development/experimental",title:"Experimental features",description:"\x3c!--",source:"@site/docs/28.0.1/development/experimental.md",sourceDirName:"development",slug:"/development/experimental",permalink:"/docs/28.0.1/development/experimental",draft:!1,tags:[],version:"current",frontMatter:{id:"experimental",title:"Experimental features"},sidebar:"docs",previous:{title:"Contribute to Druid docs",permalink:"/docs/28.0.1/development/contribute-to-docs"},next:{title:"Papers",permalink:"/docs/28.0.1/misc/papers-and-talks"}},s={},u=[],m={toc:u},f="wrapper";function d(e){var t=e.components,r=(0,a.Z)(e,l);return(0,o.kt)(f,(0,n.Z)({},m,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,'Features often start out in "experimental" status that indicates they are still evolving.\nThis can mean any of the following things:'),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"The feature's API may change even in minor releases or patch releases."),(0,o.kt)("li",{parentName:"ol"},'The feature may have known "missing" pieces that will be added later.'),(0,o.kt)("li",{parentName:"ol"},"The feature may or may not have received full battle-testing in production environments.")),(0,o.kt)("p",null,"All experimental features are optional."),(0,o.kt)("p",null,"Note that not all of these points apply to every experimental feature. Some have been battle-tested in terms of\nimplementation, but are still marked experimental due to an evolving API. Please check the documentation for each\nfeature for full details."))}d.isMDXComponent=!0}}]);