Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.25 KB | None | 0 0
  1. package com.appypie.snappy.appsheet.asformula
  2.  
  3. import android.util.Log
  4. import android.util.SparseArray
  5. import com.appypie.snappy.appsheet.extensions.isDigitsOnly
  6. import com.appypie.snappy.appsheet.pagedata.model.FieldItem
  7. import java.lang.Exception
  8. import java.util.*
  9. import kotlin.collections.ArrayList
  10.  
  11. object FormulaUtil {
  12. var squareBracesRegex = "\\[[^\\[]*\\]"
  13. var stackTokenArr: MutableList<String>? = null
  14. var strTst = "CONCATENATE(UPPER([FName]),[LName],LOWER([FName]))" //"CONCATENATE(UPPER([FName]),[LName],LOWER([FName]),UPPER([FName]))"
  15. var operatorArr = arrayOf("+", "-", "/", "%", "*")
  16. var functionArr = arrayOf(
  17. "UPPER", "LOWER", "CONCATENATE", "SQRT",
  18. "DISTANCE", "POWER", "ABS", "MAX", "MIN", "AVERAGE", "COUNT", "ROUND",
  19. "STDEVP", "FLOOR", "CEILING", "NUMBER", "DECIMAL", "SUM","LIST","LEFT"
  20. )
  21.  
  22.  
  23. fun getStackTokenArr(str: String): ArrayList<String> {
  24. var stackArr: ArrayList<String> = arrayListOf<String>()
  25. var getVal: String = ""
  26. var breakExpressions = "(,)"
  27. str.forEachIndexed { index, charData ->
  28. if (charData != null && breakExpressions.contains(charData)) {
  29. stackArr.add(getVal)
  30. stackArr.add(charData.toString())
  31. getVal = ""
  32. } else {
  33. getVal = "${getVal}${charData}"
  34. }
  35. }
  36. stackArr.add(getVal)
  37. return stackArr
  38. }
  39.  
  40. //Function To Get Type Of Variables in Operator Operand Stack
  41. fun checkVariableType(position: Int, fieldsList: ArrayList<FieldItem>?): VARIABLE_TYPE {
  42. var checkVar = stackTokenArr?.get(position)
  43. if (functionArr.any { it == checkVar }) {
  44. return VARIABLE_TYPE.FUNCTION
  45. } else if (operatorArr.any { it == checkVar }) {
  46. return VARIABLE_TYPE.OPERATOR
  47. } else if ((checkVar ?: "").contains("[") && (checkVar ?: "").contains("]")) {
  48. fieldsList?.forEachIndexed { index, fieldItem ->
  49. var regex = fieldItem.fieldTitle?.toRegex()
  50. if (regex?.containsMatchIn((checkVar ?: "")) ?: false) {
  51. stackTokenArr?.get(position)?.replace(checkVar ?: "", fieldItem.fieldValue ?: "")
  52. }
  53. }
  54. return VARIABLE_TYPE.COLOUM_VALUE
  55. } else if (checkVar.equals("(")) {
  56. return VARIABLE_TYPE.START_BRACKET
  57. } else if (checkVar.equals(")")) {
  58. return VARIABLE_TYPE.POP_TO_EVALUATE
  59. } else if ((checkVar ?: "").isDigitsOnly()) {
  60. return VARIABLE_TYPE.CONSTANT
  61. }
  62. return VARIABLE_TYPE.IGNORE
  63. }
  64.  
  65. fun checkVariableType(position: Int): VARIABLE_TYPE {
  66. var checkVar = stackTokenArr?.get(position)
  67. if (functionArr.any { it == checkVar }) {
  68. return VARIABLE_TYPE.FUNCTION
  69. } else if (operatorArr.any { it == checkVar }) {
  70. return VARIABLE_TYPE.OPERATOR
  71. } else if ((checkVar ?: "").contains("[") && (checkVar ?: "").contains("]")) {
  72. return VARIABLE_TYPE.COLOUM_VALUE
  73. } else if (checkVar.equals("(")) {
  74. return VARIABLE_TYPE.START_BRACKET
  75. } else if (checkVar.equals(")")) {
  76. return VARIABLE_TYPE.POP_TO_EVALUATE
  77. } /*else if ((checkVar?:"").isDigitsOnly()) {
  78. return VARIABLE_TYPE.CONSTANT
  79. }*/
  80. return VARIABLE_TYPE.IGNORE
  81. }
  82.  
  83.  
  84. fun checkReplace(stackToken: String?, fieldsList: ArrayList<FieldItem>?): SparseArray<FieldItem> {
  85. var isColumnContains = SparseArray<FieldItem>()
  86. fieldsList?.forEachIndexed { index, fieldItem ->
  87. var regex = fieldItem.fieldTitle?.toRegex()
  88. if (regex?.containsMatchIn((stackToken ?: "")) ?: false) {
  89. isColumnContains.put(index,fieldItem)
  90. }
  91. }
  92. return isColumnContains
  93. }
  94.  
  95. @JvmStatic
  96. fun manageFormulaStack(formula: String, fieldsList: ArrayList<FieldItem>?):String{
  97. stackTokenArr = getStackTokenArr(formula)
  98. var ops = Stack<String>()
  99. var vals = Stack<String>()
  100. stackTokenArr?.forEachIndexed { index, strData ->
  101. var args = checkVariableType(index)
  102. if (args.equals(VARIABLE_TYPE.COLOUM_VALUE)) {
  103. var data = checkReplace(strData,fieldsList)
  104. if(data.size()>0){
  105. stackTokenArr?.set(index, data.valueAt(0).fieldValue?:"")
  106. println("replacedData:${stackTokenArr?.get(index)}")
  107. }
  108. }
  109.  
  110. if (args.equals(VARIABLE_TYPE.IGNORE))
  111. else if (args.equals(VARIABLE_TYPE.START_BRACKET))
  112. else if (args.equals(VARIABLE_TYPE.FUNCTION)) {
  113. ops.push(strData)
  114. } else if (args.equals(VARIABLE_TYPE.POP_TO_EVALUATE)) {
  115. var op = ops.pop()
  116. if (functionArr.any { it == op }) {
  117. when (op) {
  118. "UPPER" -> {
  119. var value = vals.pop()
  120. value = value.toUpperCase()
  121. vals.push(value)
  122. }
  123. "LOWER" -> {
  124. var value = vals.pop()
  125. value = value.toLowerCase()
  126. vals.push(value)
  127. }
  128. "SQRT" -> {
  129. var value = vals.pop()
  130. value = Math.sqrt(value?.toDouble()?:0.0).toString()
  131. vals.push(value)
  132. }
  133. "POWER" -> {
  134. var valueB = vals.pop()
  135. var valueA = vals.pop()
  136. try {
  137. vals.push(Math.pow(valueA.toDouble(),valueB.toDouble()).toString())
  138. }catch (e:Exception){
  139. Log.e("POWER",e.message)
  140. }
  141. }
  142. "LIST" -> {
  143. for (index in 0 until vals.size) {
  144. var value = vals.pop()
  145. Regex("[,]").replace(value,"")
  146. vals.push(value)
  147. }
  148. }
  149. "CONCATENATE" -> {
  150. var value = vals.pop()
  151. for (index in 0 until vals.size) {
  152. Regex("[,]").replace(value,"")
  153. value = vals.pop() + value
  154. }
  155. vals.push(value)
  156. }
  157. }
  158. }
  159. } else {
  160. vals.push(stackTokenArr?.get(index))
  161. }
  162. }
  163. var resultPoped = vals.pop()
  164. println("Final print values:${resultPoped}")
  165. return "${resultPoped}"
  166. }
  167.  
  168. /*"CONCATENATE([FName],LEFT([LName],2))",
  169. "SUM(LIST(SQRT(45),AVERAGE(LIST(78,4,86))))",
  170. "CONCATENATE(UPPER([FName]),[LName])",*/
  171. fun manageDoubleStack(args: String) {
  172. var ops = Stack<String>()
  173. var vals = Stack<Double>()
  174. if (args.equals(VARIABLE_TYPE.IGNORE))
  175. else if (args.equals(VARIABLE_TYPE.POP_TO_EVALUATE)) {
  176. var op = ops.pop()
  177. var value = vals.pop()
  178. if (operatorArr.any { it == op }) {
  179. when (op) {
  180. "/" -> {
  181. value = vals.pop() / value
  182. }
  183. "*" -> {
  184. value = vals.pop() / value
  185. }
  186. "+" -> {
  187. value = vals.pop() + value
  188. }
  189. "-" -> {
  190. value -= vals.pop()
  191. }
  192. "%" -> {
  193. value = vals.pop() / value
  194. }
  195. }
  196. } else if (functionArr.any { it == op }) {
  197. when (op) {
  198. "SQRT" -> {
  199. value = Math.sqrt(value)
  200. }
  201. "AVERAGE" -> {
  202.  
  203. }
  204. "DISTANCE" -> {
  205.  
  206. }
  207. "POWER" -> {
  208.  
  209. }
  210. "SUM" -> {
  211.  
  212. }
  213. "ABS" -> {
  214.  
  215. }
  216. "MAX" -> {
  217.  
  218. }
  219. "MIN" -> {
  220.  
  221. }
  222. "ABS" -> {
  223.  
  224. }
  225. "COUNT" -> {
  226.  
  227. }
  228. "ROUND" -> {
  229.  
  230. }
  231. "STDEVP" -> {
  232.  
  233. }
  234. "FLOOR" -> {
  235.  
  236. }
  237. "CEILING" -> {
  238.  
  239. }
  240. "NUMBER" -> {
  241.  
  242. }
  243. "DECIMAL" -> {
  244.  
  245. }
  246.  
  247. }
  248. }
  249. vals.push(value)
  250. } else if (args.equals(VARIABLE_TYPE.POP_TO_EVALUATE)) {
  251.  
  252.  
  253. }
  254. }
  255.  
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement