diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java
index 232ade6c..45d249ed 100644
--- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java
+++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricher.java
@@ -1030,6 +1030,50 @@ public class QInstanceEnricher
+ /*******************************************************************************
+ ** Do a default mapping from an underscore_style field name to a camelCase name.
+ **
+ ** Examples:
+ **
+ ** - word_another_word_more_words -> wordAnotherWordMoreWords
+ ** - l_ul_ul_ul -> lUlUlUl
+ ** - tla_first -> tlaFirst
+ ** - word_then_tla_in_middle -> wordThenTlaInMiddle
+ ** - end_with_tla -> endWithTla
+ ** - tla_and_another_tla -> tlaAndAnotherTla
+ ** - ALL_CAPS -> allCaps
+ **
+ *******************************************************************************/
+ public static String inferNameFromBackendName(String backendName)
+ {
+ StringBuilder rs = new StringBuilder();
+
+ ////////////////////////////////////////////////////////////////////////////////////////
+ // build a list of words in the name, then join them with _ and lower-case the result //
+ ////////////////////////////////////////////////////////////////////////////////////////
+ String[] words = backendName.toLowerCase(Locale.ROOT).split("_");
+ for(int i = 0; i < words.length; i++)
+ {
+ String word = words[i];
+ if(i == 0)
+ {
+ rs.append(word);
+ }
+ else
+ {
+ rs.append(word.substring(0, 1).toUpperCase());
+ if(word.length() > 1)
+ {
+ rs.append(word.substring(1));
+ }
+ }
+ }
+
+ return (rs.toString());
+ }
+
+
+
/*******************************************************************************
** If a app didn't have any sections, generate "sensible defaults"
*******************************************************************************/
diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricherTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricherTest.java
index 53e9ec96..a4ab55c9 100644
--- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricherTest.java
+++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/instances/QInstanceEnricherTest.java
@@ -232,6 +232,23 @@ class QInstanceEnricherTest extends BaseTest
}
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ @Test
+ void testInferNameFromBackendName()
+ {
+ assertEquals("id", QInstanceEnricher.inferNameFromBackendName("id"));
+ assertEquals("wordAnotherWordMoreWords", QInstanceEnricher.inferNameFromBackendName("word_another_word_more_words"));
+ assertEquals("lUlUlUl", QInstanceEnricher.inferNameFromBackendName("l_ul_ul_ul"));
+ assertEquals("tlaFirst", QInstanceEnricher.inferNameFromBackendName("tla_first"));
+ assertEquals("wordThenTlaInMiddle", QInstanceEnricher.inferNameFromBackendName("word_then_tla_in_middle"));
+ assertEquals("endWithTla", QInstanceEnricher.inferNameFromBackendName("end_with_tla"));
+ assertEquals("tlaAndAnotherTla", QInstanceEnricher.inferNameFromBackendName("tla_and_another_tla"));
+ assertEquals("allCaps", QInstanceEnricher.inferNameFromBackendName("ALL_CAPS"));
+ }
+
+
/*******************************************************************************
**