Browse Source

started refactoring

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
module/stock.v2
Stephan Richter 3 weeks ago
parent
commit
c6823b116c
  1. 1
      core/src/main/java/de/srsoftware/umbrella/core/Constants.java
  2. 10
      core/src/main/java/de/srsoftware/umbrella/core/api/LocationRef.java
  3. 6
      core/src/main/java/de/srsoftware/umbrella/core/api/Owner.java
  4. 10
      core/src/main/java/de/srsoftware/umbrella/core/api/OwnerRef.java
  5. 46
      core/src/main/java/de/srsoftware/umbrella/core/model/Item.java
  6. 1362
      doc/stock.dia
  7. 38
      stock/src/main/java/de/srsoftware/umbrella/stock/SqliteDb.java

1
core/src/main/java/de/srsoftware/umbrella/core/Constants.java

@ -138,6 +138,7 @@ public class Constants {
public static final String OFFSET = "offset"; public static final String OFFSET = "offset";
public static final String OPTIONAL = "optional"; public static final String OPTIONAL = "optional";
public static final String OWNER = "owner"; public static final String OWNER = "owner";
public static final String OWNER_ID = "owner_id";
public static final String PARENT_LOCATION_ID = "parent_location_id"; public static final String PARENT_LOCATION_ID = "parent_location_id";
public static final String PARENT_TASK_ID = "parent_task_id"; public static final String PARENT_TASK_ID = "parent_task_id";

10
core/src/main/java/de/srsoftware/umbrella/core/api/LocationRef.java

@ -0,0 +1,10 @@
/* © SRSoftware 2025 */
package de.srsoftware.umbrella.core.api;
import de.srsoftware.tools.Mappable;
import de.srsoftware.umbrella.core.model.Location;
public interface LocationRef extends Mappable {
Location resolve(StockService stockService);
long id();
}

6
core/src/main/java/de/srsoftware/umbrella/core/api/Owner.java

@ -0,0 +1,6 @@
/* © SRSoftware 2025 */
package de.srsoftware.umbrella.core.api;
public interface Owner {
long signum();
}

10
core/src/main/java/de/srsoftware/umbrella/core/api/OwnerRef.java

@ -0,0 +1,10 @@
/* © SRSoftware 2025 */
package de.srsoftware.umbrella.core.api;
import de.srsoftware.tools.Mappable;
import de.srsoftware.umbrella.core.ModuleRegistry;
public interface OwnerRef extends Mappable {
long id();
Owner resolve(ModuleRegistry registry);
}

46
core/src/main/java/de/srsoftware/umbrella/core/model/Item.java

@ -4,24 +4,26 @@ package de.srsoftware.umbrella.core.model;
import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Constants.*;
import de.srsoftware.tools.Mappable; import de.srsoftware.tools.Mappable;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.api.LocationRef;
import de.srsoftware.umbrella.core.api.OwnerRef;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
import org.json.JSONObject; import org.json.JSONObject;
public class Item implements Mappable { public class Item implements Mappable {
private long id; private long id, number; // id is the database key, number the owner-relative id
private Mappable owner; private OwnerRef ownerRef;
private String code, name; private String code, name;
private Location location; private LocationRef locationRef;
private Collection<Property> properties; private Collection<Property> properties;
private Set<String> dirtyFields = new HashSet<>(); private Set<String> dirtyFields = new HashSet<>();
private Item(Mappable owner, long id, Location location, String code, String name) { private Item(long id, OwnerRef ownerRef, long number, LocationRef locationRef, String code, String name) {
this.owner = owner;
this.id = id; this.id = id;
this.location = location; this.ownerRef = ownerRef;
this.number = number;
this.locationRef = locationRef;
this.code = code; this.code = code;
this.name = name; this.name = name;
this.properties = new HashSet<>(); this.properties = new HashSet<>();
@ -39,23 +41,23 @@ public class Item implements Mappable {
return id; return id;
} }
public Location location(){ public LocationRef location(){
return location; return locationRef;
} }
public String name(){ public String name(){
return name; return name;
} }
public static Item of(ResultSet rs, Mappable owner, Location location) throws SQLException { public static Item of(ResultSet rs, OwnerRef ownerRef, long number, LocationRef locationRef) throws SQLException {
var id = rs.getLong(ID); var id = rs.getLong(ID);
var code = rs.getString(CODE); var code = rs.getString(CODE);
var name = rs.getString(NAME); var name = rs.getString(NAME);
return new Item(owner, id, location, code, name); return new Item(id, ownerRef, number, locationRef, code, name);
} }
public Mappable owner(){ public OwnerRef ownerRef(){
return owner; return ownerRef;
} }
public Collection<Property> properties() { public Collection<Property> properties() {
@ -64,12 +66,10 @@ public class Item implements Mappable {
@Override @Override
public Map<String, Object> toMap() { public Map<String, Object> toMap() {
var ownerId = ownerId();
var ownerMap = ownerId < 0 ? Map.of(COMPANY,-ownerId) : Map.of(USER,ownerId);
var map = new HashMap<String,Object>(); var map = new HashMap<String,Object>();
map.put(OWNER,ownerMap); map.put(OWNER,ownerRef.toMap());
map.put(ID,id); map.put(ID,id);
if (location != null) map.put(LOCATION,location.toMap()); map.put(LOCATION,locationRef.toMap());
map.put(CODE,code); map.put(CODE,code);
map.put(NAME,name); map.put(NAME,name);
if (properties != null) map.put(PROPERTIES,properties.stream().map(Property::toMap).toList()); if (properties != null) map.put(PROPERTIES,properties.stream().map(Property::toMap).toList());
@ -99,18 +99,6 @@ public class Item implements Mappable {
return this; return this;
} }
public static Long ownerId(Mappable owner){
return switch (owner) {
case Company comp -> -comp.id();
case UmbrellaUser user -> user.id();
case null, default -> throw UmbrellaException.unprocessable("Item has owner of unknown class ({0})", owner.getClass().getSimpleName());
};
}
public Long ownerId() {
return ownerId(owner);
}
public Item clear() { public Item clear() {
dirtyFields.clear(); dirtyFields.clear();
return this; return this;

1362
doc/stock.dia

File diff suppressed because it is too large Load Diff

38
stock/src/main/java/de/srsoftware/umbrella/stock/SqliteDb.java

@ -85,21 +85,47 @@ public class SqliteDb extends BaseDb implements StockDb {
} }
} }
/**
* id, owner, owner_id, code, name, location_id
* @throws SQLException
*/
private void createIntermediateItemsTable() throws SQLException { // create intermediate table private void createIntermediateItemsTable() throws SQLException { // create intermediate table
var sql = "CREATE TABLE IF NOT EXISTS items_temp ({0} LONG NOT NULL, {1} LONG NOT NULL, {2} VARCHAR(255), {3} VARCHAR(255) NOT NULL, {4} LONG NOT NULL, PRIMARY KEY({0}, {1}))"; var sql = """
sql = format(sql, OWNER, ID, CODE, NAME, LOCATION_ID); CREATE TABLE IF NOT EXISTS items_temp (
{0} INTEGER PRIMARY KEY,
{1} VARCHAR(50) NOT NULL,
{2} LONG NOT NULL,
{3} VARCHAR(255),
{4} VARCHAR(255) NOT NULL,
{5} LONG NOT NULL,
PRIMARY KEY({0}, {1}))""";
sql = format(sql, ID, OWNER, OWNER_ID, CODE, NAME, LOCATION_ID);
db.prepareStatement(sql).execute(); db.prepareStatement(sql).execute();
} }
/**
* id, owner, parent_location_id, name, description
* @throws SQLException
*/
private void createIntermediateLocationTable() throws SQLException { // create intermediate table private void createIntermediateLocationTable() throws SQLException { // create intermediate table
var sql = "CREATE TABLE IF NOT EXISTS locations_temp ({0} INTEGER PRIMARY KEY, {1} INT DEFAULT NULL, {2} LONG NOT NULL, {3} VARCHAR(255) NOT NULL, {4} TEXT)"; var sql = """
sql = format(sql, ID, PARENT_LOCATION_ID, OWNER, NAME, DESCRIPTION); CREATE TABLE IF NOT EXISTS locations_temp (
{0} INTEGER PRIMARY KEY,
{1} VARCHAR(50) NOT NULL,
{2} LONG DEFAULT NULL,
{3} VARCHAR(255) NOT NULL,
{4} TEXT)""";
sql = format(sql, ID, OWNER, PARENT_LOCATION_ID, NAME, DESCRIPTION);
db.prepareStatement(sql).execute(); db.prepareStatement(sql).execute();
} }
/**
* item_id, prop_id , value
* @throws SQLException
*/
private void createIntermediatePropsTable() throws SQLException { // create intermediate table private void createIntermediatePropsTable() throws SQLException { // create intermediate table
var sql = "CREATE TABLE IF NOT EXISTS item_props_temp ( {0} LONG NOT NULL, {1} LONG NOT NULL, {2} LONG NOT NULL, {3} VARCHAR(255) NOT NULL, PRIMARY KEY({0}, {1}, {2}))"; var sql = "CREATE TABLE IF NOT EXISTS item_props_temp ( {0} LONG NOT NULL, {1} LONG NOT NULL, {2} LONG NOT NULL, PRIMARY KEY({0}, {1}))";
sql = format(sql, OWNER, ITEM_ID, PROPERTY_ID, VALUE); sql = format(sql, ITEM_ID, PROPERTY_ID, VALUE);
db.prepareStatement(sql).execute(); db.prepareStatement(sql).execute();
} }

Loading…
Cancel
Save