/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 . ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġjet brains . datal ore . plot . builder . data Ċ Ċ import Ġjet brains . datal ore . plot . base . DataFrame Ċ import Ġjet brains . datal ore . plot . base . DataFrame . Variable Ċ import Ġjet brains . datal ore . plot . base . stat . Stats Ċ import Ġjet brains . datal ore . plot . builder . Var Binding Ċ import Ġjet brains . datal ore . plot . builder . data . Data Processing . find Optional Variable Ċ Ċ class ĠGroup ing Context ( ĊĠĠĠ Ġprivate Ġval Ġmy Data : ĠDataFrame , ĊĠĠĠ Ġbindings : ĠList < Var Binding >, ĊĠĠĠ Ġgrouping Var Name : ĠString ?, ĊĠĠĠ Ġpath Id Var Name : ĠString ?, ĊĠĠĠ Ġprivate Ġval Ġmy Expect Multiple : ĠBoolean Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmy Bindings : ĠList < Var Binding > Ġ= ĠArrayList ( bindings ) ĊĠĠĠ Ġinternal Ġval Ġoptional Grouping Var : ĠVariable ? Ġ= Ġfind Optional Variable ( my Data , Ġgrouping Var Name ) ĊĠĠĠ Ġprivate Ġval Ġpath Id Var : ĠVariable ? Ġ= Ġfind Optional Variable ( my Data , Ġpath Id Var Name ) ĊĊĠĠĠ Ġprivate Ġvar Ġmy Group Size List : ĠList < Int >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmy Group Mapper : Ġ(( Int ) Ġ-> ĠInt )? Ġ= Ġnull ĊĊĠĠĠ Ġ// my Group Mapper Ġ= ĠData Processing . compute Groups ( my Data , Ġmy Bindings , Ġmy Optional Grouping Var , Ġmy Expect Multiple ); ĊĠĠĠ Ġval Ġgroup Mapper : Ġ( Int ) Ġ-> ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Group Mapper Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Group Mapper Ġ= Ġcompute Groups () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Group Mapper !! ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Groups (): Ġ( Int ) Ġ-> ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( my Data . has ( Stats . GROUP )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmy Data . get Numeric ( Stats . GROUP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGroup Util . wrap ( list ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( my Group Size List Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Group Size List !!. size Ġ== Ġmy Data . rowCount ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGroup Util . SINGLE _ GROUP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgroup By Point Index Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Index Map ( my Group Size List !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGroup Util . wrap ( groupBy Point Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( my Expect Multiple ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠData Processing . compute Groups ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Bindings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptional Grouping Var , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Id Var ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠGroup Util . SINGLE _ GROUP ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġwith Ordered Groups ( data : ĠDataFrame , Ġgroup Size List : ĠList < Int >): ĠGroup ing Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrouping Context Ġ= ĠGroup ing Context ( data , Ġempty List (), Ġnull , Ġnull , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrouping Context . my Group Size List Ġ= ĠArrayList ( group Size List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgrouping Context ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Index Map ( group Size List : ĠList < Int >): ĠMap < Int , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠHashMap < Int , ĠInt >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Group Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Group Index Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( group Size Ġin Ġgroup Size List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġgroup Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ current Group Index Offset Ġ+ Ġi ] Ġ= Ġcurrent Group ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Group ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Group Index Offset Ġ+= Ġgroup Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ