diff --git a/AnimalDB.zip b/AnimalDB.zip index ae3d896..ca62a4d 100644 Binary files a/AnimalDB.zip and b/AnimalDB.zip differ diff --git a/client/src/components/examples/AddAnimalModal.tsx b/client/src/components/examples/database/AddAnimalModal.tsx similarity index 98% rename from client/src/components/examples/AddAnimalModal.tsx rename to client/src/components/examples/database/AddAnimalModal.tsx index 2c0085c..8156872 100644 --- a/client/src/components/examples/AddAnimalModal.tsx +++ b/client/src/components/examples/database/AddAnimalModal.tsx @@ -11,7 +11,7 @@ import { Typography, } from '@mui/material'; import { useState } from 'react'; -import { DatePicker } from '../library'; +import { DatePicker } from '@/components'; import { CloseRounded } from '@mui/icons-material'; export interface AddAnimalModalProps { diff --git a/client/src/components/examples/AnimalList.tsx b/client/src/components/examples/database/AnimalList.tsx similarity index 90% rename from client/src/components/examples/AnimalList.tsx rename to client/src/components/examples/database/AnimalList.tsx index be0eb4c..7a3b9f3 100644 --- a/client/src/components/examples/AnimalList.tsx +++ b/client/src/components/examples/database/AnimalList.tsx @@ -1,5 +1,5 @@ import { DataGrid, GridDeleteIcon } from '@mui/x-data-grid'; -import { Animal } from './examples.types'; +import { Animal } from './animal.types'; import { IconButton } from '@mui/material'; export interface AnimalListProps { @@ -18,11 +18,12 @@ export const AnimalList = ({ loading, onDelete, }: AnimalListProps) => { + console.log(animalList); return ( { - runPixel(`DeleteAnimal(${animalToDelete.animal_id})`, () => - onClose(true), + runPixel( + `DeleteAnimal(${JSON.stringify(animalToDelete.animal_id)})`, + () => onClose(true), ); }; diff --git a/client/src/components/examples/examples.types.ts b/client/src/components/examples/database/animal.types.ts similarity index 79% rename from client/src/components/examples/examples.types.ts rename to client/src/components/examples/database/animal.types.ts index 8771658..cd36909 100644 --- a/client/src/components/examples/examples.types.ts +++ b/client/src/components/examples/database/animal.types.ts @@ -1,5 +1,5 @@ export interface Animal { - animal_id: number; + animal_id: string; // UUID animal_name: string; animal_type: string; date_of_birth: string; // YYYY-MM-DD diff --git a/client/src/components/examples/database/index.ts b/client/src/components/examples/database/index.ts new file mode 100644 index 0000000..a81a85e --- /dev/null +++ b/client/src/components/examples/database/index.ts @@ -0,0 +1,4 @@ +export * from './animal.types'; +export * from './AddAnimalModal'; +export * from './DeleteAnimalModal'; +export * from './AnimalList'; diff --git a/client/src/components/examples/index.ts b/client/src/components/examples/index.ts index d2a58ae..9cd8c5a 100644 --- a/client/src/components/examples/index.ts +++ b/client/src/components/examples/index.ts @@ -1,4 +1 @@ -export * from './AnimalList'; -export * from './examples.types'; -export * from './AddAnimalModal'; -export * from './DeleteAnimalModal'; +export * from './database'; diff --git a/java/src/domain/examples/AnimalData.java b/java/src/domain/examples/database/AnimalData.java similarity index 64% rename from java/src/domain/examples/AnimalData.java rename to java/src/domain/examples/database/AnimalData.java index d158c7b..3124927 100644 --- a/java/src/domain/examples/AnimalData.java +++ b/java/src/domain/examples/database/AnimalData.java @@ -1,12 +1,15 @@ -package domain.examples; +package domain.examples.database; + +import java.util.Map; +import prerna.date.SemossDate; public class AnimalData { private String animalId; private String animalType; private String animalName; - private String dateOfBirth; + private SemossDate dateOfBirth; - public AnimalData(String animalId, String animalType, String animalName, String dateOfBirth) { + public AnimalData(String animalId, String animalType, String animalName, SemossDate dateOfBirth) { this.animalId = animalId; this.animalType = animalType; this.animalName = animalName; @@ -29,11 +32,11 @@ public void setAnimalId(String animalId) { this.animalId = animalId; } - public String getDateOfBirth() { + public SemossDate getDateOfBirth() { return dateOfBirth; } - public void setDateOfBirth(String dateOfBirth) { + public void setDateOfBirth(SemossDate dateOfBirth) { this.dateOfBirth = dateOfBirth; } @@ -44,4 +47,12 @@ public String getAnimalType() { public void setAnimalType(String animalType) { this.animalType = animalType; } + + public Map toMap() { + return Map.of( + "animal_id", animalId, + "animal_type", animalType, + "animal_name", animalName, + "date_of_birth", dateOfBirth); + } } diff --git a/java/src/reactors/examples/GetAnimalByIdReactor.java b/java/src/reactors/examples/GetAnimalByIdReactor.java deleted file mode 100644 index f63d578..0000000 --- a/java/src/reactors/examples/GetAnimalByIdReactor.java +++ /dev/null @@ -1,24 +0,0 @@ -package reactors.examples; - -import java.util.Map; -import prerna.sablecc2.om.PixelDataType; -import prerna.sablecc2.om.nounmeta.NounMetadata; -import reactors.AbstractProjectReactor; -import util.Constants; -import util.HelperMethods; - -public class GetAnimalByIdReactor extends AbstractProjectReactor { - - public GetAnimalByIdReactor() { - this.keysToGet = new String[] {Constants.ANIMAL_ID}; - this.keyRequired = new int[] {1}; - } - - @Override - protected NounMetadata doExecute() { - String animalId = this.keyValue.get(Constants.ANIMAL_ID); - Map animalData = HelperMethods.getAnimalById(database, animalId).get(0); - - return new NounMetadata(animalData, PixelDataType.MAP); - } -} diff --git a/java/src/reactors/examples/GetAnimalsReactor.java b/java/src/reactors/examples/GetAnimalsReactor.java deleted file mode 100644 index 7dc7a2c..0000000 --- a/java/src/reactors/examples/GetAnimalsReactor.java +++ /dev/null @@ -1,32 +0,0 @@ -package reactors.examples; - -import domain.examples.AnimalData; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import prerna.sablecc2.om.PixelDataType; -import prerna.sablecc2.om.nounmeta.NounMetadata; -import reactors.AbstractProjectReactor; -import util.HelperMethods; - -public class GetAnimalsReactor extends AbstractProjectReactor { - - @Override - protected NounMetadata doExecute() { - - List> animals = HelperMethods.getAnimals(database); - List output = new ArrayList<>(); - - for (Map animal : animals) { - AnimalData row = - new AnimalData( - (String) animal.get("animalId"), - (String) animal.get("animalName"), - (String) animal.get("animalType"), - (String) animal.get("dateOfBirth")); - output.add(row); - } - - return new NounMetadata(output, PixelDataType.VECTOR); - } -} diff --git a/java/src/reactors/examples/AddAnimalReactor.java b/java/src/reactors/examples/database/AddAnimalReactor.java similarity index 73% rename from java/src/reactors/examples/AddAnimalReactor.java rename to java/src/reactors/examples/database/AddAnimalReactor.java index a320e37..de3ca6f 100644 --- a/java/src/reactors/examples/AddAnimalReactor.java +++ b/java/src/reactors/examples/database/AddAnimalReactor.java @@ -1,14 +1,18 @@ -package reactors.examples; +package reactors.examples.database; import domain.base.ErrorCode; import domain.base.ProjectException; +import domain.examples.database.AnimalData; +import java.util.UUID; import org.apache.commons.lang3.StringUtils; +import prerna.date.SemossDate; import prerna.sablecc2.om.PixelDataType; import prerna.sablecc2.om.nounmeta.NounMetadata; import reactors.AbstractProjectReactor; import util.Constants; import util.HelperMethods; +// Add an animal to the database! public class AddAnimalReactor extends AbstractProjectReactor { public AddAnimalReactor() { @@ -30,7 +34,14 @@ protected NounMetadata doExecute() { ErrorCode.BAD_REQUEST, "Animal name, type, and date of birth cannot be empty"); } - HelperMethods.addAnimal(database, animalName, animalType, dateOfBirth); + AnimalData animalData = + new AnimalData( + UUID.randomUUID().toString(), + animalType, + animalName, + new SemossDate(dateOfBirth, "yyyy-MM-dd")); + + HelperMethods.addAnimal(database, animalData); return new NounMetadata(true, PixelDataType.BOOLEAN); } diff --git a/java/src/reactors/examples/DeleteAnimalReactor.java b/java/src/reactors/examples/database/DeleteAnimalReactor.java similarity index 93% rename from java/src/reactors/examples/DeleteAnimalReactor.java rename to java/src/reactors/examples/database/DeleteAnimalReactor.java index 96c9128..1f8ddfa 100644 --- a/java/src/reactors/examples/DeleteAnimalReactor.java +++ b/java/src/reactors/examples/database/DeleteAnimalReactor.java @@ -1,4 +1,4 @@ -package reactors.examples; +package reactors.examples.database; import domain.base.ErrorCode; import domain.base.ProjectException; @@ -10,6 +10,7 @@ import util.Constants; import util.HelperMethods; +// Remove an animal from the database! public class DeleteAnimalReactor extends AbstractProjectReactor { public DeleteAnimalReactor() { diff --git a/java/src/reactors/examples/database/GetAnimalByIdReactor.java b/java/src/reactors/examples/database/GetAnimalByIdReactor.java new file mode 100644 index 0000000..4b88314 --- /dev/null +++ b/java/src/reactors/examples/database/GetAnimalByIdReactor.java @@ -0,0 +1,38 @@ +package reactors.examples.database; + +import domain.base.ErrorCode; +import domain.base.ProjectException; +import java.util.List; +import java.util.Map; +import prerna.sablecc2.om.PixelDataType; +import prerna.sablecc2.om.nounmeta.NounMetadata; +import reactors.AbstractProjectReactor; +import util.Constants; +import util.HelperMethods; + +// Get an animal by its ID! +public class GetAnimalByIdReactor extends AbstractProjectReactor { + + public GetAnimalByIdReactor() { + this.keysToGet = new String[] {Constants.ANIMAL_ID}; + this.keyRequired = new int[] {1}; + } + + @Override + protected NounMetadata doExecute() { + String animalId = this.keyValue.get(Constants.ANIMAL_ID); + List> animalData = HelperMethods.getAnimalById(database, animalId); + if (animalData.isEmpty()) { + throw new ProjectException(ErrorCode.NOT_FOUND, "Animal not found"); + } + + if (animalData.size() > 1) { + throw new ProjectException( + ErrorCode.INTERNAL_SERVER_ERROR, "Multiple animals found with that id"); + } + + Map animal = animalData.get(0); + + return new NounMetadata(animal, PixelDataType.MAP); + } +} diff --git a/java/src/reactors/examples/database/GetAnimalsReactor.java b/java/src/reactors/examples/database/GetAnimalsReactor.java new file mode 100644 index 0000000..508c506 --- /dev/null +++ b/java/src/reactors/examples/database/GetAnimalsReactor.java @@ -0,0 +1,20 @@ +package reactors.examples.database; + +import java.util.List; +import java.util.Map; +import prerna.sablecc2.om.PixelDataType; +import prerna.sablecc2.om.nounmeta.NounMetadata; +import reactors.AbstractProjectReactor; +import util.HelperMethods; + +// Get all the animals in the database! +public class GetAnimalsReactor extends AbstractProjectReactor { + + @Override + protected NounMetadata doExecute() { + + List> animals = HelperMethods.getAnimals(database); + + return new NounMetadata(animals, PixelDataType.VECTOR); + } +} diff --git a/java/src/util/HelperMethods.java b/java/src/util/HelperMethods.java index cb44a88..cbe1f4c 100644 --- a/java/src/util/HelperMethods.java +++ b/java/src/util/HelperMethods.java @@ -2,6 +2,7 @@ import domain.base.ErrorCode; import domain.base.ProjectException; +import domain.examples.database.AnimalData; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -23,10 +24,10 @@ public static String getUserId(User user) { public static List> getAnimals(RDBMSNativeEngine database) { SelectQueryStruct qs = new SelectQueryStruct(); - qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_ID", "animalId")); - qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_NAME", "animalName")); - qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_TYPE", "animalType")); - qs.addSelector(new QueryColumnSelector("ANIMAL__DATE_OF_BIRTH", "dateOfBirth")); + qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_ID", "animal_id")); + qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_NAME", "animal_name")); + qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_TYPE", "animal_type")); + qs.addSelector(new QueryColumnSelector("ANIMAL__DATE_OF_BIRTH", "date_of_birth")); return QueryExecutionUtility.flushRsToMap(database, qs); } @@ -34,29 +35,29 @@ public static List> getAnimals(RDBMSNativeEngine database) { public static List> getAnimalById( RDBMSNativeEngine database, String animalId) { SelectQueryStruct qs = new SelectQueryStruct(); - qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_ID", "animalId")); - qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_NAME", "animalName")); - qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_TYPE", "animalType")); - qs.addSelector(new QueryColumnSelector("ANIMAL__DATE_OF_BIRTH", "dateOfBirth")); + qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_ID", "animal_id")); + qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_NAME", "animal_name")); + qs.addSelector(new QueryColumnSelector("ANIMAL__ANIMAL_TYPE", "animal_type")); + qs.addSelector(new QueryColumnSelector("ANIMAL__DATE_OF_BIRTH", "date_of_birth")); qs.addExplicitFilter(SimpleQueryFilter.makeColToValFilter("ANIMAL__ANIMAL_ID", "==", animalId)); return QueryExecutionUtility.flushRsToMap(database, qs); } - public static void addAnimal( - RDBMSNativeEngine database, String animalName, String animalType, String dateOfBirth) { + public static void addAnimal(RDBMSNativeEngine database, AnimalData animalData) { Connection con = null; try { con = database.getConnection(); try (PreparedStatement ps = con.prepareStatement( - "INSERT INTO ANIMAL (ANIMAL_NAME, ANIMAL_TYPE, DATE_OF_BIRTH)\n" - + "VALUES (?, ?, ?);")) { + "INSERT INTO ANIMAL (ANIMAL_ID, ANIMAL_NAME, ANIMAL_TYPE, DATE_OF_BIRTH)\n" + + "VALUES (?, ?, ?, ?);")) { int parameterIndex = 1; - ps.setString(parameterIndex++, animalName); - ps.setString(parameterIndex++, animalType); - ps.setString(parameterIndex++, dateOfBirth); + ps.setString(parameterIndex++, animalData.getAnimalId()); + ps.setString(parameterIndex++, animalData.getAnimalName()); + ps.setString(parameterIndex++, animalData.getAnimalType()); + ps.setObject(parameterIndex++, animalData.getDateOfBirth().getFormattedDate()); ps.execute(); } catch (SQLException e) { throw new ProjectException(ErrorCode.INTERNAL_SERVER_ERROR);